res_pjsip: add 'set_var' support on endpoints
authorKevin Harwell <kharwell@digium.com>
Thu, 2 Jan 2014 19:08:19 +0000 (19:08 +0000)
committerKevin Harwell <kharwell@digium.com>
Thu, 2 Jan 2014 19:08:19 +0000 (19:08 +0000)
Added a new 'set_var' option for ast_sip_endpoint(s).  For each variable
specified that variable gets set upon creation of a pjsip channel involving
the endpoint.

(closes issue ASTERISK-22868)
Reported by: Joshua Colp
Review: https://reviewboard.asterisk.org/r/3095/
........

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

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

CHANGES
channels/chan_pjsip.c
configs/pjsip.conf.sample
include/asterisk/res_pjsip.h
res/res_pjsip.c
res/res_pjsip/pjsip_configuration.c

diff --git a/CHANGES b/CHANGES
index 472e3c2..a70774f 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1177,6 +1177,9 @@ res_pjsip (and many others)
    these modules is performed in pjsip.conf. Other modules may use their
    own configuration files.
 
+ * Added 'set_var' option for an endpoint. For each variable specified that
+   variable gets set upon creation of a channel involving the endpoint.
+
 res_rtp_asterisk
 ------------------
  * ICE/STUN/TURN support in res_rtp_asterisk has been made optional.  To enable
index 0fbfd9e..bab4be5 100644 (file)
@@ -346,6 +346,7 @@ static struct ast_channel *chan_pjsip_new(struct ast_sip_session *session, int s
        struct ast_format fmt;
        RAII_VAR(struct chan_pjsip_pvt *, pvt, NULL, ao2_cleanup);
        struct ast_sip_channel_pvt *channel;
+       struct ast_variable *var;
 
        if (!(pvt = ao2_alloc(sizeof(*pvt), chan_pjsip_pvt_dtor))) {
                return NULL;
@@ -364,6 +365,11 @@ static struct ast_channel *chan_pjsip_new(struct ast_sip_session *session, int s
                return NULL;
        }
 
+       for (var = session->endpoint->channel_vars; var; var = var->next) {
+               char buf[512];
+               pbx_builtin_setvar_helper(chan, var->name, ast_get_encoded_str(
+                                                 var->value, buf, sizeof(buf)));
+       }
 
        ast_channel_stage_snapshot(chan);
 
index 96d6b39..f04c0cd 100644 (file)
                 ; other party or both (default: "")
 ;srtp_tag_32=no ; Determines whether 32 byte tags should be used instead of 80
                 ; byte tags (default: "no")
-
+;set_var=       ; Variable set on a channel involving the endpoint. For multiple
+               ; channel variables specify multiple 'set_var'(s)
 
 ;==========================AUTH SECTION OPTIONS=========================
 ;[auth]
index f4f9ba7..04a24cd 100644 (file)
@@ -589,6 +589,8 @@ struct ast_sip_endpoint {
        unsigned int allowtransfer;
        /*! Method used when handling redirects */
        enum ast_sip_session_redirect redirect_method;
+       /*! Variables set on channel creation */
+       struct ast_variable *channel_vars;
 };
 
 /*!
index ab3071c..3bb73e6 100644 (file)
                                                set to <literal>sdes</literal> or <literal>dtls</literal>.
                                        </para></description>
                                </configOption>
+                               <configOption name="set_var">
+                                       <synopsis>Variable set on a channel involving the endpoint.</synopsis>
+                                       <description><para>
+                                               When a new channel is created using the endpoint set the specified
+                                               variable(s) on that channel. For multiple channel variables specify
+                                               multiple 'set_var'(s).
+                                       </para></description>
+                               </configOption>
                        </configObject>
                        <configObject name="auth">
                                <synopsis>Authentication type</synopsis>
index c8e8e3b..3a1edab 100644 (file)
@@ -754,6 +754,43 @@ static int t38udptl_ec_to_str(const void *obj, const intptr_t *args, char **buf)
        return 0;
 }
 
+static int set_var_handler(const struct aco_option *opt,
+       struct ast_variable *var, void *obj)
+{
+       struct ast_sip_endpoint *endpoint = obj;
+       struct ast_variable *new_var;
+       char *name = ast_strdupa(var->value), *val = strchr(name, '=');
+
+       if (!val) {
+               return -1;
+       }
+
+       *val++ = '\0';
+       if (!(new_var = ast_variable_new(name, val, ""))) {
+               return -1;
+       }
+
+       new_var->next = endpoint->channel_vars;
+       endpoint->channel_vars = new_var;
+
+       return 0;
+}
+
+static int set_var_to_str(const void *obj, const intptr_t *args, char **buf)
+{
+       struct ast_str *str = ast_str_create(MAX_OBJECT_FIELD);
+       const struct ast_sip_endpoint *endpoint = obj;
+       struct ast_variable *var;
+
+       for (var = endpoint->channel_vars; var; var = var->next) {
+               ast_str_append(&str, 0, "%s=%s,", var->name, var->value);
+       }
+
+       *buf = ast_strdup(ast_str_truncate(str, -1));
+       ast_free(str);
+       return 0;
+}
+
 static void *sip_nat_hook_alloc(const char *name)
 {
        return ast_sorcery_generic_alloc(sizeof(struct ast_sip_nat_hook), NULL);
@@ -1476,6 +1513,7 @@ int ast_res_pjsip_initialize_configuration(const struct ast_module_info *ast_mod
        ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtls_setup", "", dtls_handler, dtlssetup_to_str, 0, 0);
        ast_sorcery_object_field_register(sip_sorcery, "endpoint", "srtp_tag_32", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.srtp_tag_32));
        ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "redirect_method", "user", redirect_handler, NULL, 0, 0);
+       ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "set_var", "", set_var_handler, set_var_to_str, 0, 0);
 
        if (ast_sip_initialize_sorcery_transport(sip_sorcery)) {
                ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");
@@ -1581,6 +1619,7 @@ static void endpoint_destructor(void* obj)
        endpoint->pickup.named_callgroups = ast_unref_namedgroups(endpoint->pickup.named_callgroups);
        endpoint->pickup.named_pickupgroups = ast_unref_namedgroups(endpoint->pickup.named_pickupgroups);
        ao2_cleanup(endpoint->persistent);
+       ast_variables_destroy(endpoint->channel_vars);
 }
 
 static int init_subscription_configuration(struct ast_sip_endpoint_subscription_configuration *subscription)