diff options
author | pcadach <pcadach@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-09-29 18:35:44 +0000 |
---|---|---|
committer | pcadach <pcadach@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-09-29 18:35:44 +0000 |
commit | 18f0e3efb46368cfa21125c19a9a76cf678d17ca (patch) | |
tree | 7e1ef0f3d5097d3c43cae9eb61362bb83587c91a | |
parent | 16312049c6b96730edb7ad6f0aaa83908767440b (diff) |
Merged revisions 44009 via svnmerge from
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: http://svn.digium.com/svn/asterisk/trunk@44010 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | channels/chan_h323.c | 5 | ||||
-rw-r--r-- | channels/h323/ast_h323.cxx | 38 | ||||
-rw-r--r-- | channels/h323/ast_h323.h | 2 | ||||
-rw-r--r-- | channels/h323/chan_h323.h | 4 |
4 files changed, 42 insertions, 7 deletions
diff --git a/channels/chan_h323.c b/channels/chan_h323.c index 836093f44..adc0dcd3f 100644 --- a/channels/chan_h323.c +++ b/channels/chan_h323.c @@ -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); diff --git a/channels/h323/ast_h323.cxx b/channels/h323/ast_h323.cxx index 08470fced..3c1a56c4b 100644 --- a/channels/h323/ast_h323.cxx +++ b/channels/h323/ast_h323.cxx @@ -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 diff --git a/channels/h323/ast_h323.h b/channels/h323/ast_h323.h index cfa0d0edc..74e13e7ca 100644 --- a/channels/h323/ast_h323.h +++ b/channels/h323/ast_h323.h @@ -104,6 +104,8 @@ public: PString destAliases; PString sourceE164; PString destE164; + int cid_presentation; + int cid_ton; PString rdnis; int redirect_reason; diff --git a/channels/h323/chan_h323.h b/channels/h323/chan_h323.h index c8bd6a3d9..378df1edc 100644 --- a/channels/h323/chan_h323.h +++ b/channels/h323/chan_h323.h @@ -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; |