res_pjsip: Support setting a default accountcode on endpoints
authorMatthew Jordan <mjordan@digium.com>
Wed, 16 Jul 2014 14:03:51 +0000 (14:03 +0000)
committerMatthew Jordan <mjordan@digium.com>
Wed, 16 Jul 2014 14:03:51 +0000 (14:03 +0000)
Most channel drivers let you specify a default accountcode to be set on
channels associated with a particular peer/endpoint/object. Prior to this
patch, chan_pjsip/res_pjsip did not support such a setting.

This patch adds a new setting to the res_pjsip endpoint object, 'accountcode'.
When a channel is created that is associated with an endpoint with this value
set, the channel will automatically have its accountcode property set to the
value configured for the endpoint.

Review: https://reviewboard.asterisk.org/r/3724/

ASTERISK-24000 #close
Reported by: Matt Jordan
........

Merged revisions 418756 from http://svn.asterisk.org/svn/asterisk/branches/12

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@418757 65c4cc65-6c06-0410-ace0-fbb531ad65f3

CHANGES
channels/chan_pjsip.c
configs/pjsip.conf.sample
contrib/ast-db-manage/config/versions/1d50859ed02e_create_accountcode.py [new file with mode: 0644]
include/asterisk/res_pjsip.h
res/res_pjsip.c
res/res_pjsip/pjsip_configuration.c

diff --git a/CHANGES b/CHANGES
index ef2ff22..7fcd913 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -179,6 +179,17 @@ res_config_pgsql
    res_pgsql.conf.
 
 ------------------------------------------------------------------------------
+--- Functionality changes from Asterisk 12.4.0 to Asterisk 12.5.0 ------------
+------------------------------------------------------------------------------
+
+res_pjsip
+------------------
+ * The endpoint configuration object now supports 'accountcode'. Any channel
+   created for an endpoint with this setting will have its accountcode set
+   to the specified value.
+
+
+------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 12.3.0 to Asterisk 12.4.0 ------------
 ------------------------------------------------------------------------------
 
index e55c488..6952114 100644 (file)
@@ -364,8 +364,12 @@ static struct ast_channel *chan_pjsip_new(struct ast_sip_session *session, int s
                return NULL;
        }
 
-       if (!(chan = ast_channel_alloc(1, state, S_OR(session->id.number.str, ""), S_OR(session->id.name.str, ""), "", "", "", assignedids, requestor, 0, "PJSIP/%s-%08x", ast_sorcery_object_get_id(session->endpoint),
-               (unsigned)ast_atomic_fetchadd_int((int *)&chan_idx, +1)))) {
+
+       chan = ast_channel_alloc(1, state, S_OR(session->id.number.str, ""), S_OR(session->id.name.str, ""),
+                                session->endpoint->accountcode, "", "", assignedids,
+                                requestor, 0, "PJSIP/%s-%08x", ast_sorcery_object_get_id(session->endpoint),
+                                (unsigned)ast_atomic_fetchadd_int((int *)&chan_idx, +1));
+       if (!chan) {
                return NULL;
        }
 
index 3aa05a9..58774dc 100644 (file)
 ;  SYNOPSIS: Endpoint
 ;100rel=yes     ; Allow support for RFC3262 provisional ACK tags (default:
                 ; "yes")
+;accountcode=foo        ; Set a default account code for channels created for
+                        ; this endpoint
 ;aggregate_mwi=yes      ;  (default: "yes")
 ;allow= ; Media Codec s to allow (default: "")
 ;aors=  ; AoR s to be used with the endpoint (default: "")
diff --git a/contrib/ast-db-manage/config/versions/1d50859ed02e_create_accountcode.py b/contrib/ast-db-manage/config/versions/1d50859ed02e_create_accountcode.py
new file mode 100644 (file)
index 0000000..eb20001
--- /dev/null
@@ -0,0 +1,20 @@
+"""create accountcode
+
+Revision ID: 1d50859ed02e
+Revises: 51f8cb66540e
+Create Date: 2014-07-07 21:07:01.661783
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '1d50859ed02e'
+down_revision = '51f8cb66540e'
+
+from alembic import op
+import sqlalchemy as sa
+
+def upgrade():
+    op.add_column('ps_endpoints', sa.Column('accountcode', sa.String(20)))
+
+def downgrade():
+    op.drop_column('ps_endpoints', 'accountcode')
index f5518c0..d569710 100644 (file)
@@ -570,6 +570,8 @@ struct ast_sip_endpoint {
                AST_STRING_FIELD(fromdomain);
                /*! Context to route incoming MESSAGE requests to */
                AST_STRING_FIELD(message_context);
+               /*! Accountcode to auto-set on channels */
+               AST_STRING_FIELD(accountcode);
        );
        /*! Configuration for extensions */
        struct ast_sip_endpoint_extensions extensions;
index b123a37..2c15a79 100644 (file)
                                                specified, then the <replaceable>context</replaceable> setting is used.
                                        </para></description>
                                </configOption>
+                               <configOption name="accountcode">
+                                       <synopsis>An accountcode to set automatically on any channels created for this endpoint.</synopsis>
+                                       <description><para>
+                                               If specified, any channel created for this endpoint will automatically
+                                               have this accountcode set on it.
+                                       </para></description>
+                               </configOption>
                        </configObject>
                        <configObject name="auth">
                                <synopsis>Authentication type</synopsis>
index ccd4949..59db4eb 100644 (file)
@@ -1730,6 +1730,7 @@ int ast_res_pjsip_initialize_configuration(const struct ast_module_info *ast_mod
        ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "redirect_method", "user", redirect_handler, NULL, NULL, 0, 0);
        ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "set_var", "", set_var_handler, set_var_to_str, set_var_to_vl, 0, 0);
        ast_sorcery_object_field_register(sip_sorcery, "endpoint", "message_context", "", OPT_STRINGFIELD_T, 1, STRFLDSET(struct ast_sip_endpoint, message_context));
+       ast_sorcery_object_field_register(sip_sorcery, "endpoint", "accountcode", "", OPT_STRINGFIELD_T, 1, STRFLDSET(struct ast_sip_endpoint, accountcode));
 
        if (ast_sip_initialize_sorcery_transport()) {
                ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");