Merged revisions 44009 via svnmerge from
authorPaul Cadach <paul@odt.east.telecom.kz>
Fri, 29 Sep 2006 18:35:44 +0000 (18:35 +0000)
committerPaul Cadach <paul@odt.east.telecom.kz>
Fri, 29 Sep 2006 18:35:44 +0000 (18:35 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r44009 | pcadach | 2006-09-30 00:30:34 +0600 (Сбт, 30 Сен 2006) | 1 line

Pass TON/PRESENTATION information too
........

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

channels/chan_h323.c
channels/h323/ast_h323.cxx
channels/h323/ast_h323.h
channels/h323/chan_h323.h

index 836093f..adc0dcd 100644 (file)
@@ -629,6 +629,9 @@ static int oh323_call(struct ast_channel *c, char *dest, int timeout)
                strncpy(pvt->options.cid_rdnis, c->cid.cid_rdnis, sizeof(pvt->options.cid_rdnis));
        }
 
+       pvt->options.presentation = c->cid.cid_pres;
+       pvt->options.type_of_number = c->cid.cid_ton;
+
        if ((addr = pbx_builtin_getvar_helper(c, "PRIREDIRECTREASON"))) {
                if (!strcasecmp(addr, "UNKNOWN"))
                        pvt->options.redirect_reason = 0;
@@ -1084,6 +1087,8 @@ static struct ast_channel *__oh323_new(struct oh323_pvt *pvt, int state, const c
                        ch->cid.cid_rdnis = ast_strdup(pvt->cd.redirect_number);
                        pbx_builtin_setvar_helper(ch, "PRIREDIRECTREASON", redirectingreason2str(pvt->cd.redirect_reason));
                }
+               ch->cid.cid_pres = pvt->cd.presentation;
+               ch->cid.cid_ton = pvt->cd.type_of_number;
 
                if (!ast_strlen_zero(pvt->exten) && strcmp(pvt->exten, "s")) {
                        ch->cid.cid_dnid = strdup(pvt->exten);
index 08470fc..3c1a56c 100644 (file)
@@ -733,6 +733,8 @@ void MyH323Connection::SetCallOptions(void *o, BOOL isIncoming)
                        rdnis = PString(opts->cid_rdnis);
                        redirect_reason = opts->redirect_reason;
                }
+               cid_presentation = opts->presentation;
+               cid_ton = opts->type_of_number;
        }
        tunnelOptions = opts->tunnelOptions;
 }
@@ -765,6 +767,17 @@ void MyH323Connection::SetCallDetails(void *callDetails, const H323SignalPDU &se
                WORD sourcePort;
                PString redirect_number;
                unsigned redirect_reason;
+               unsigned plan, type, screening, presentation;
+
+               /* Fetch presentation and type information about calling party's number */
+               if (setupPDU.GetQ931().GetCallingPartyNumber(sourceName, &plan, &type, &presentation, &screening, 2, 3)) {
+                       /* Construct fields back */
+                       cd->type_of_number = (type << 4) | screening;
+                       cd->presentation = (presentation << 5) | screening;
+               } else {
+                       cd->type_of_number = 0;         /* UNKNOWN */
+                       cd->presentation = 0x43;        /* NUMBER NOT AVAILABLE */
+               }
 
                sourceName = setupPDU.GetQ931().GetDisplayName();
                cd->call_source_name = strdup((const char *)sourceName);
@@ -904,8 +917,14 @@ static BOOL FetchCiscoTunneledInfo(Q931 &q931, const H323SignalPDU &pdu)
 
 static BOOL EmbedCiscoTunneledInfo(H323SignalPDU &pdu)
 {
-       const static Q931::InformationElementCodes codes[] =
-       { Q931::RedirectingNumberIE, Q931::FacilityIE };
+       const static struct {
+               Q931::InformationElementCodes ie;
+               BOOL dontDelete;
+       } codes[] = {
+               { Q931::RedirectingNumberIE, },
+               { Q931::FacilityIE, },
+               { Q931::CallingPartyNumberIE, TRUE },
+       };
 
        BOOL res = FALSE;
        BOOL notRedirOnly = FALSE;
@@ -913,10 +932,11 @@ static BOOL EmbedCiscoTunneledInfo(H323SignalPDU &pdu)
        Q931 &q931 = pdu.GetQ931();
 
        for(unsigned i = 0; i < (sizeof(codes) / sizeof(codes[0])); ++i) {
-               if (q931.HasIE(codes[i])) {
-                       tmpQ931.SetIE(codes[i], q931.GetIE(codes[i]));
-                       q931.RemoveIE(codes[i]);
-                       if (codes[i] != Q931::RedirectingNumberIE)
+               if (q931.HasIE(codes[i].ie)) {
+                       tmpQ931.SetIE(codes[i].ie, q931.GetIE(codes[i].ie));
+                       if (!codes[i].dontDelete)
+                               q931.RemoveIE(codes[i].ie);
+                       if (codes[i].ie != Q931::RedirectingNumberIE)
                                notRedirOnly = TRUE;
                        res = TRUE;
                }
@@ -1206,6 +1226,12 @@ BOOL MyH323Connection::OnSendSignalSetup(H323SignalPDU & setupPDU)
                return FALSE;
        }
 
+       /* OpenH323 will build calling party information with default
+          type and presentation information, so build it to be recorded
+          by embedding routines */
+       setupPDU.GetQ931().SetCallingPartyNumber(GetLocalPartyName(), (cid_ton >> 4) & 0x07,
+                       cid_ton & 0x0f, (cid_presentation >> 5) & 0x03, cid_presentation & 0x1f);
+
 #ifdef TUNNELLING
        EmbedTunneledInfo(setupPDU);
 #endif
index cfa0d0e..74e13e7 100644 (file)
@@ -104,6 +104,8 @@ public:
        PString destAliases;
        PString sourceE164;
        PString destE164;
+       int cid_presentation;
+       int cid_ton;
        PString rdnis;
        int redirect_reason;
 
index c8bd6a3..378df1e 100644 (file)
@@ -50,6 +50,8 @@ typedef struct call_options {
        char                    cid_name[80];
        char                    cid_rdnis[80];
        int                             redirect_reason;
+       int                             presentation;
+       int                             type_of_number;
        int                             fastStart;
        int                             h245Tunneling;
        int                             silenceSuppression;
@@ -115,7 +117,7 @@ typedef struct call_details {
        char *redirect_number;
        int redirect_reason;
        int presentation;
-       int screening;
+       int type_of_number;
        char *sourceIp;
 } call_details_t;