Pass TON/PRESENTATION information too

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@44009 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.4
Paul Cadach 19 years ago
parent 704397dc3c
commit b05cb6d46b

@ -626,6 +626,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)); 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 ((addr = pbx_builtin_getvar_helper(c, "PRIREDIRECTREASON"))) {
if (!strcasecmp(addr, "UNKNOWN")) if (!strcasecmp(addr, "UNKNOWN"))
pvt->options.redirect_reason = 0; pvt->options.redirect_reason = 0;
@ -1076,6 +1079,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); ch->cid.cid_rdnis = ast_strdup(pvt->cd.redirect_number);
pbx_builtin_setvar_helper(ch, "PRIREDIRECTREASON", redirectingreason2str(pvt->cd.redirect_reason)); 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")) { if (!ast_strlen_zero(pvt->exten) && strcmp(pvt->exten, "s")) {
ch->cid.cid_dnid = strdup(pvt->exten); ch->cid.cid_dnid = strdup(pvt->exten);

@ -715,6 +715,8 @@ void MyH323Connection::SetCallOptions(void *o, BOOL isIncoming)
rdnis = PString(opts->cid_rdnis); rdnis = PString(opts->cid_rdnis);
redirect_reason = opts->redirect_reason; redirect_reason = opts->redirect_reason;
} }
cid_presentation = opts->presentation;
cid_ton = opts->type_of_number;
} }
tunnelOptions = opts->tunnelOptions; tunnelOptions = opts->tunnelOptions;
} }
@ -747,6 +749,17 @@ void MyH323Connection::SetCallDetails(void *callDetails, const H323SignalPDU &se
WORD sourcePort; WORD sourcePort;
PString redirect_number; PString redirect_number;
unsigned redirect_reason; 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(); sourceName = setupPDU.GetQ931().GetDisplayName();
cd->call_source_name = strdup((const char *)sourceName); cd->call_source_name = strdup((const char *)sourceName);
@ -886,8 +899,14 @@ static BOOL FetchCiscoTunneledInfo(Q931 &q931, const H323SignalPDU &pdu)
static BOOL EmbedCiscoTunneledInfo(H323SignalPDU &pdu) static BOOL EmbedCiscoTunneledInfo(H323SignalPDU &pdu)
{ {
const static Q931::InformationElementCodes codes[] = const static struct {
{ Q931::RedirectingNumberIE, Q931::FacilityIE }; Q931::InformationElementCodes ie;
BOOL dontDelete;
} codes[] = {
{ Q931::RedirectingNumberIE, },
{ Q931::FacilityIE, },
{ Q931::CallingPartyNumberIE, TRUE },
};
BOOL res = FALSE; BOOL res = FALSE;
BOOL notRedirOnly = FALSE; BOOL notRedirOnly = FALSE;
@ -895,10 +914,11 @@ static BOOL EmbedCiscoTunneledInfo(H323SignalPDU &pdu)
Q931 &q931 = pdu.GetQ931(); Q931 &q931 = pdu.GetQ931();
for(unsigned i = 0; i < (sizeof(codes) / sizeof(codes[0])); ++i) { for(unsigned i = 0; i < (sizeof(codes) / sizeof(codes[0])); ++i) {
if (q931.HasIE(codes[i])) { if (q931.HasIE(codes[i].ie)) {
tmpQ931.SetIE(codes[i], q931.GetIE(codes[i])); tmpQ931.SetIE(codes[i].ie, q931.GetIE(codes[i].ie));
q931.RemoveIE(codes[i]); if (!codes[i].dontDelete)
if (codes[i] != Q931::RedirectingNumberIE) q931.RemoveIE(codes[i].ie);
if (codes[i].ie != Q931::RedirectingNumberIE)
notRedirOnly = TRUE; notRedirOnly = TRUE;
res = TRUE; res = TRUE;
} }
@ -1188,6 +1208,12 @@ BOOL MyH323Connection::OnSendSignalSetup(H323SignalPDU & setupPDU)
return FALSE; 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 #ifdef TUNNELLING
EmbedTunneledInfo(setupPDU); EmbedTunneledInfo(setupPDU);
#endif #endif

@ -99,6 +99,8 @@ public:
PString destAliases; PString destAliases;
PString sourceE164; PString sourceE164;
PString destE164; PString destE164;
int cid_presentation;
int cid_ton;
PString rdnis; PString rdnis;
int redirect_reason; int redirect_reason;

@ -46,6 +46,8 @@ typedef struct call_options {
char cid_name[80]; char cid_name[80];
char cid_rdnis[80]; char cid_rdnis[80];
int redirect_reason; int redirect_reason;
int presentation;
int type_of_number;
int fastStart; int fastStart;
int h245Tunneling; int h245Tunneling;
int silenceSuppression; int silenceSuppression;
@ -110,7 +112,7 @@ typedef struct call_details {
char *redirect_number; char *redirect_number;
int redirect_reason; int redirect_reason;
int presentation; int presentation;
int screening; int type_of_number;
char *sourceIp; char *sourceIp;
} call_details_t; } call_details_t;

Loading…
Cancel
Save