Add digit manipulation tag support to chan_dahdi/sig_pri like chan_misdn.
authorRichard Mudgett <rmudgett@digium.com>
Mon, 14 Jun 2010 15:55:35 +0000 (15:55 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 14 Jun 2010 15:55:35 +0000 (15:55 +0000)
Add the append_msn_to_cid_tag option to chan_dahdi like chan_misdn.

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

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

channels/chan_dahdi.c
channels/sig_pri.c
channels/sig_pri.h
configs/chan_dahdi.conf.sample

index 9ce0d3c..f34795f 100644 (file)
@@ -2848,6 +2848,9 @@ static void my_set_callerid(void *pvt, const struct ast_party_caller *caller)
        }
        p->cid_ton = caller->id.number_type;
        p->callingpres = caller->id.number_presentation;
+       if (caller->id.tag) {
+               ast_copy_string(p->cid_tag, caller->id.tag, sizeof(p->cid_tag));
+       }
        ast_copy_string(p->cid_ani, S_OR(caller->ani, ""), sizeof(p->cid_ani));
        p->cid_ani2 = caller->ani2;
 }
@@ -5805,6 +5808,7 @@ static int dahdi_hangup(struct ast_channel *ast)
                p->subs[SUB_REAL].owner = NULL;
                p->subs[SUB_REAL].needbusy = 0;
                p->owner = NULL;
+               p->cid_tag[0] = '\0';
                p->ringt = 0;/* Probably not used in this mode.  Reset anyway. */
                p->distinctivering = 0;/* Probably not used in this mode. Reset anyway. */
                p->confirmanswer = 0;/* Probably not used in this mode. Reset anyway. */
@@ -11913,6 +11917,8 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
                                                pris[span].pri.aoc_passthrough_flag = conf->pri.pri.aoc_passthrough_flag;
                                                pris[span].pri.aoce_delayhangup = conf->pri.pri.aoce_delayhangup;
 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
+                                               pris[span].pri.append_msn_to_user_tag = conf->pri.pri.append_msn_to_user_tag;
+                                               ast_copy_string(pris[span].pri.initial_user_tag, conf->chan.cid_tag, sizeof(pris[span].pri.initial_user_tag));
                                                ast_copy_string(pris[span].pri.msn_list, conf->pri.pri.msn_list, sizeof(pris[span].pri.msn_list));
 #if defined(HAVE_PRI_MWI)
                                                ast_copy_string(pris[span].pri.mwi_mailboxes,
@@ -12156,7 +12162,14 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
                        tmp->cid_num[0] = '\0';
                        tmp->cid_name[0] = '\0';
                }
-               ast_copy_string(tmp->cid_tag, conf->chan.cid_tag, sizeof(tmp->cid_tag));
+#if defined(HAVE_PRI)
+               if (dahdi_sig_pri_lib_handles(tmp->sig)) {
+                       tmp->cid_tag[0] = '\0';
+               } else
+#endif /* defined(HAVE_PRI) */
+               {
+                       ast_copy_string(tmp->cid_tag, conf->chan.cid_tag, sizeof(tmp->cid_tag));
+               }
                tmp->cid_subaddr[0] = '\0';
                ast_copy_string(tmp->mailbox, conf->chan.mailbox, sizeof(tmp->mailbox));
                if (channel != CHAN_PSEUDO && !ast_strlen_zero(tmp->mailbox)) {
@@ -16760,6 +16773,8 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct
                                ast_copy_string(confp->pri.pri.mwi_mailboxes, v->value,
                                        sizeof(confp->pri.pri.mwi_mailboxes));
 #endif /* defined(HAVE_PRI_MWI) */
+                       } else if (!strcasecmp(v->name, "append_msn_to_cid_tag")) {
+                               confp->pri.pri.append_msn_to_user_tag = ast_true(v->value);
 #endif /* HAVE_PRI */
 #if defined(HAVE_SS7)
                        } else if (!strcasecmp(v->name, "ss7type")) {
index 5af0974..2a0c8ef 100644 (file)
@@ -216,6 +216,7 @@ static void sig_pri_set_caller_id(struct sig_pri_chan *p)
                }
                caller.id.number_type = p->cid_ton;
                caller.id.number_presentation = p->callingpres;
+               caller.id.tag = p->user_tag;
                caller.ani = p->cid_ani;
                caller.ani2 = p->cid_ani2;
                p->calls->set_callerid(p->chan_pvt, &caller);
@@ -1146,6 +1147,7 @@ static int pri_fixup_principle(struct sig_pri_pri *pri, int principle, q931_call
                new_chan->aoc_s_request_invoke_id = old_chan->aoc_s_request_invoke_id;
                new_chan->aoc_e = old_chan->aoc_e;
 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
+               strcpy(new_chan->user_tag, old_chan->user_tag);
 
                if (new_chan->no_b_channel) {
                        /* Copy the real channel configuration to the no B channel interface. */
@@ -1490,6 +1492,17 @@ static void *pri_ss_thread(void *data)
                        ast_free(chan->cid.cid_dnid);
                }
                chan->cid.cid_dnid = ast_strdup(exten);
+
+               if (p->pri->append_msn_to_user_tag && p->pri->nodetype != PRI_NETWORK) {
+                       /*
+                        * Update the user tag for party id's from this device for this call
+                        * now that we have a complete MSN from the network.
+                        */
+                       snprintf(p->user_tag, sizeof(p->user_tag), "%s_%s", p->pri->initial_user_tag,
+                               exten);
+                       ast_free(chan->cid.cid_tag);
+                       chan->cid.cid_tag = ast_strdup(p->user_tag);
+               }
        }
        sig_pri_play_tone(p, -1);
        if (ast_exists_extension(chan, chan->context, exten, 1, p->cid_num)) {
@@ -3461,6 +3474,7 @@ static void sig_pri_handle_subcmds(struct sig_pri_pri *pri, int chanpos, int eve
                                ast_party_connected_line_init(&ast_connected);
                                sig_pri_party_id_convert(&ast_connected.id, &subcmd->u.connected_line.id,
                                        pri);
+                               ast_connected.id.tag = ast_strdup(pri->pvts[chanpos]->user_tag);
 
                                caller_id_update = 0;
                                if (ast_connected.id.name) {
@@ -3517,6 +3531,8 @@ static void sig_pri_handle_subcmds(struct sig_pri_pri *pri, int chanpos, int eve
                        if (owner) {
                                sig_pri_redirecting_convert(&ast_redirecting, &subcmd->u.redirecting,
                                        &owner->redirecting, pri);
+                               ast_redirecting.from.tag = ast_strdup(pri->pvts[chanpos]->user_tag);
+                               ast_redirecting.to.tag = ast_strdup(pri->pvts[chanpos]->user_tag);
 
 /*! \todo XXX Original called data can be put in a channel data store that is inherited. */
 
@@ -3568,6 +3584,8 @@ static void sig_pri_handle_subcmds(struct sig_pri_pri *pri, int chanpos, int eve
                                }
                                sig_pri_redirecting_convert(&ast_redirecting, &pri_deflection,
                                        &owner->redirecting, pri);
+                               ast_redirecting.from.tag = ast_strdup(pri->pvts[chanpos]->user_tag);
+                               ast_redirecting.to.tag = ast_strdup(pri->pvts[chanpos]->user_tag);
                                ast_channel_set_redirecting(owner, &ast_redirecting);
                                ast_party_redirecting_free(&ast_redirecting);
 
@@ -4452,6 +4470,19 @@ static void *pri_dchannel(void *vpri)
                                                pri->pvts[chanpos]->cid_ton = 0;
                                                pri->pvts[chanpos]->callingpres = 0;
                                        }
+
+                                       /* Setup the user tag for party id's from this device for this call. */
+                                       if (pri->append_msn_to_user_tag) {
+                                               snprintf(pri->pvts[chanpos]->user_tag,
+                                                       sizeof(pri->pvts[chanpos]->user_tag), "%s_%s",
+                                                       pri->initial_user_tag,
+                                                       pri->nodetype == PRI_NETWORK
+                                                               ? plancallingnum : e->ring.callednum);
+                                       } else {
+                                               ast_copy_string(pri->pvts[chanpos]->user_tag,
+                                                       pri->initial_user_tag, sizeof(pri->pvts[chanpos]->user_tag));
+                                       }
+
                                        sig_pri_set_caller_id(pri->pvts[chanpos]);
 
                                        /* Set DNID on all incoming calls -- even immediate */
@@ -5493,6 +5524,7 @@ int sig_pri_hangup(struct sig_pri_chan *p, struct ast_channel *ast)
        p->cid_num[0] = '\0';
        p->cid_subaddr[0] = '\0';
        p->cid_name[0] = '\0';
+       p->user_tag[0] = '\0';
        p->exten[0] = '\0';
        sig_pri_set_dialing(p, 0);
 
@@ -5899,6 +5931,23 @@ int sig_pri_call(struct sig_pri_chan *p, struct ast_channel *ast, char *rdest, i
        }
 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
 
+       /* Setup the user tag for party id's from this device for this call. */
+       if (p->pri->append_msn_to_user_tag) {
+               snprintf(p->user_tag, sizeof(p->user_tag), "%s_%s", p->pri->initial_user_tag,
+                       p->pri->nodetype == PRI_NETWORK
+                               ? c + p->stripmsd + dp_strip
+                               : S_OR(ast->connected.id.number, ""));
+       } else {
+               ast_copy_string(p->user_tag, p->pri->initial_user_tag, sizeof(p->user_tag));
+       }
+
+       /*
+        * Replace the caller id tag from the channel creation
+        * with the actual tag value.
+        */
+       ast_free(ast->cid.cid_tag);
+       ast->cid.cid_tag = ast_strdup(p->user_tag);
+
        ldp_strip = 0;
        prilocaldialplan = p->pri->localdialplan - 1;
        if ((l != NULL) && (prilocaldialplan == -2 || prilocaldialplan == -3)) { /* compute dynamically */
index 7fbac27..ef5c29b 100644 (file)
@@ -190,6 +190,8 @@ struct sig_pri_chan {
        char cid_subaddr[AST_MAX_EXTENSION];
        char cid_name[AST_MAX_EXTENSION];
        char cid_ani[AST_MAX_EXTENSION];
+       /*! \brief User tag for party id's sent from this device driver. */
+       char user_tag[AST_MAX_EXTENSION];
        char exten[AST_MAX_EXTENSION];
 
        /* Internal variables -- Don't touch */
@@ -316,6 +318,11 @@ struct sig_pri_pri {
        /*! \brief TRUE if we will allow incoming ISDN call waiting calls. */
        unsigned int allow_call_waiting_calls:1;
 #endif /* defined(HAVE_PRI_CALL_WAITING) */
+       /*!
+        * TRUE if a new call's sig_pri_chan.user_tag[] has the MSN
+        * appended to the initial_user_tag[].
+        */
+       unsigned int append_msn_to_user_tag:1;
        int dialplan;                                                   /*!< Dialing plan */
        int localdialplan;                                              /*!< Local dialing plan */
        char internationalprefix[10];                   /*!< country access code ('00' for european dialplans) */
@@ -335,6 +342,11 @@ struct sig_pri_pri {
         */
        char mwi_mailboxes[SIG_PRI_MAX_MWI_MAILBOX_STR];
 #endif /* defined(HAVE_PRI_MWI) */
+       /*!
+        * \brief Initial user tag for party id's sent from this device driver.
+        * \note String set by config file.
+        */
+       char initial_user_tag[AST_MAX_EXTENSION];
        char msn_list[AST_MAX_EXTENSION];               /*!< Comma separated list of MSNs to handle.  Empty if disabled. */
        char idleext[AST_MAX_EXTENSION];                /*!< Where to idle extra calls */
        char idlecontext[AST_MAX_CONTEXT];              /*!< What context to use for idle */
index 00df580..0bc4ac8 100644 (file)
@@ -727,7 +727,23 @@ pickupgroup=1
 ; return to the caller performing the transfer (default is yes).
 ;
 ;transfertobusy=no
+
+; Calls will have the party id user tag set to this string value.
+;
+;cid_tag=
+
+; With this set, you can automatically append the MSN of a party
+; to the cid_tag.  An '_' is used to separate the tag from the MSN.
+; Applies to ISDN spans.
+; Default is no.
 ;
+; Table of what number is appended:
+;      outgoing  incoming
+; net  dialed    caller
+; cpe  caller    dialed
+;
+;append_msn_to_cid_tag=no
+
 ; caller ID can be set to "asreceived" or a specific number if you want to
 ; override it.  Note that "asreceived" only applies to trunk interfaces.
 ; fullname sets just the