]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
chlog: freetdm: ISDN - Fix for Caller ID name on DMS-100
authorDavid Yat Sin <dyatsin@sangoma.com>
Tue, 12 Jul 2011 21:26:44 +0000 (17:26 -0400)
committerDavid Yat Sin <dyatsin@sangoma.com>
Tue, 12 Jul 2011 21:26:44 +0000 (17:26 -0400)
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.h

index 08adc6ef6bff35b9edd50cc17985a9d5b0f249d6..5cb8fbe0c0c3a1bbce8d827f263024edbe4ea758 100644 (file)
@@ -452,8 +452,7 @@ ftdm_status_t get_calling_num(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb);
 ftdm_status_t get_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb);
 ftdm_status_t get_called_num(ftdm_channel_t *ftdmchan, CdPtyNmb *cdPtyNmb);
 ftdm_status_t get_redir_num(ftdm_channel_t *ftdmchan, RedirNmb *redirNmb);
-ftdm_status_t get_calling_name_from_display(ftdm_channel_t *ftdmchan, Display *display);
-ftdm_status_t get_calling_name_from_usr_usr(ftdm_channel_t *ftdmchan, UsrUsr *usrUsr);
+ftdm_status_t get_calling_name(ftdm_channel_t *ftdmchan, ConEvnt *conEvnt);
 ftdm_status_t get_calling_subaddr(ftdm_channel_t *ftdmchan, CgPtySad *cgPtySad);
 ftdm_status_t get_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd);
 ftdm_status_t get_facility_ie(ftdm_channel_t *ftdmchan, FacilityStr *facilityStr);
index 44538bba6127027b70fda7ae94bdeb99d23e831d..4caad20ee1451c2c2f8671f52e10d906509fe3d2 100644 (file)
@@ -135,11 +135,8 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
                        get_calling_subaddr(ftdmchan, &conEvnt->cgPtySad);
                        get_prog_ind_ie(ftdmchan, &conEvnt->progInd);
                        get_facility_ie(ftdmchan, &conEvnt->facilityStr);                       
+                       get_calling_name(ftdmchan, conEvnt);
                        
-                       if (get_calling_name_from_display(ftdmchan, &conEvnt->display) != FTDM_SUCCESS) {
-                               get_calling_name_from_usr_usr(ftdmchan, &conEvnt->usrUsr);
-                       }
-
                        ftdm_log_chan(sngisdn_info->ftdmchan, FTDM_LOG_INFO, "Incoming call: Called No:[%s] Calling No:[%s]\n", ftdmchan->caller_data.dnis.digits, ftdmchan->caller_data.cid_num.digits);
 
                        if (conEvnt->bearCap[0].eh.pres) {
index b0c3efe2714274e6ecb69235990f212eea5ce21c..a2bca1f8fa29cce9ac7ed2da6d0ceb457179ecba 100644 (file)
@@ -45,6 +45,9 @@ SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_progind_loc, ftdm_sngisdn_progind_loc2str
 
 static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val);
 static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val);
+ftdm_status_t get_calling_name_from_usr_usr(ftdm_channel_t *ftdmchan, UsrUsr *usrUsr);
+ftdm_status_t get_calling_name_from_display(ftdm_channel_t *ftdmchan, Display *display);
+ftdm_status_t get_calling_name_from_ntDisplay(ftdm_channel_t *ftdmchan, NtDisplay *display);
 
 extern ftdm_sngisdn_data_t     g_sngisdn_data;
 
@@ -355,6 +358,20 @@ ftdm_status_t get_calling_name_from_display(ftdm_channel_t *ftdmchan, Display *d
        return FTDM_SUCCESS;
 }
 
+ftdm_status_t get_calling_name_from_ntDisplay(ftdm_channel_t *ftdmchan, NtDisplay *display)
+{
+       ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
+       if (display->eh.pres != PRSNT_NODEF) {
+               return FTDM_FAIL;
+       }
+       if (display->dispInfo.pres != PRSNT_NODEF) {
+               return FTDM_FAIL;
+       }
+       
+       ftdm_copy_string(caller_data->cid_name, (const char*)display->dispInfo.val, display->dispInfo.len+1);
+       return FTDM_SUCCESS;
+}
+
 ftdm_status_t get_calling_name_from_usr_usr(ftdm_channel_t *ftdmchan, UsrUsr *usrUsr)
 {
        ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
@@ -374,6 +391,24 @@ ftdm_status_t get_calling_name_from_usr_usr(ftdm_channel_t *ftdmchan, UsrUsr *us
        return FTDM_SUCCESS;
 }
 
+ftdm_status_t get_calling_name(ftdm_channel_t *ftdmchan, ConEvnt *conEvnt)
+{
+       ftdm_status_t status = FTDM_FAIL;
+       sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
+       
+       if (signal_data->switchtype == SNGISDN_SWITCH_DMS100) {
+               status = get_calling_name_from_ntDisplay(ftdmchan, &conEvnt->ntDisplay[0]);
+       } else {
+               status = get_calling_name_from_display(ftdmchan, &conEvnt->display);
+
+       }
+       if (status != FTDM_SUCCESS) {
+               status = get_calling_name_from_usr_usr(ftdmchan, &conEvnt->usrUsr);
+       }
+       return status;
+}
+
+
 ftdm_status_t get_calling_subaddr(ftdm_channel_t *ftdmchan, CgPtySad *cgPtySad)
 {
        char subaddress[100];
@@ -694,12 +729,22 @@ ftdm_status_t set_calling_name(ftdm_channel_t *ftdmchan, ConEvnt *conEvnt)
                        /* follow through */
                case SNGISDN_SWITCH_5ESS:
                case SNGISDN_SWITCH_4ESS:
-               case SNGISDN_SWITCH_DMS100:
-                       conEvnt->display.eh.pres = PRSNT_NODEF;
                        conEvnt->display.dispInfo.pres = PRSNT_NODEF;
                        conEvnt->display.dispInfo.len = len;
                        memcpy(conEvnt->display.dispInfo.val, caller_data->cid_name, len);
                        break;
+               case SNGISDN_SWITCH_DMS100:
+                       conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF;
+                       conEvnt->ntDisplay[0].dispTypeNt.pres = PRSNT_NODEF;
+                       conEvnt->ntDisplay[0].dispTypeNt.val = 0x01; /* Calling Party Name */
+                       conEvnt->ntDisplay[0].assocInfo.pres = PRSNT_NODEF;
+                       conEvnt->ntDisplay[0].assocInfo.val  = 0x03; /* Included */
+                       conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF;
+                       conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF;
+                       conEvnt->ntDisplay[0].dispInfo.pres = PRSNT_NODEF;
+                       conEvnt->ntDisplay[0].dispInfo.len = len;
+                       memcpy(conEvnt->ntDisplay[0].dispInfo.val, caller_data->cid_name, len);
+                       break;
                case SNGISDN_SWITCH_QSIG:
                        /* It seems like QSIG does not support Caller ID Name */
                        break;
index f44f1032a3db54a7241f05ce11cc672cd6cade19..e127e7fc1e16935e1fdf1e2dfe6abed588b96e82 100644 (file)
@@ -584,11 +584,18 @@ uint32_t sngisdn_decode_ie(char *str, uint32_t *str_len, uint8_t current_codeset
                        break;
                case PROT_Q931_IE_DISPLAY:
                        {
-                               uint8_t displayStrOct=2, j;
+                               uint8_t j, displayType, assocInfo;
                                char displayStr[82];
+                               uint8_t displayNtEnabled = 0;
+                               uint8_t displayStrOct = 2;
+                               
                                memset(displayStr, 0, sizeof(displayStr));
                                
                                if(get_bits(OCTET(3),8,8)) {
+                                       displayType = get_bits(OCTET(3),1,4);
+                                       assocInfo = get_bits(OCTET(3),5,7);
+
+                                       displayNtEnabled = 1;
                                        displayStrOct++;
                                }
                                j = 0;  
@@ -599,8 +606,15 @@ uint32_t sngisdn_decode_ie(char *str, uint32_t *str_len, uint8_t current_codeset
                                        displayStr[j++]=ia5[get_bits(OCTET(displayStrOct),1,4)][get_bits(OCTET(displayStrOct),5,8)];
                                }
                                displayStr[j]='\0';
-                               *str_len+= sprintf(&str[*str_len], "%s(l:%d)\n",
-                                                                                                               displayStr, len);
+                               if (displayNtEnabled) {
+                                       *str_len+= sprintf(&str[*str_len], "%s(l:%d) type:%s(%d) info:%s(%d)\n",
+                                                                                               displayStr, len,
+                                                                                               get_code_2_str(displayType, dcodQ931DisplayTypeTable), displayType,
+                                                                                               get_code_2_str(assocInfo, dcodQ931AssocInfoTable), assocInfo);
+                               } else {
+                                       *str_len+= sprintf(&str[*str_len], "%s(l:%d)\n",
+                                                                                                                       displayStr, len);
+                               }
                        }
                        break;
                case PROT_Q931_IE_RESTART_IND:
index ca6683d4e343570012f9984deebf4da6c0f38186..37b799d007a8d59f17d9a78acec686da62d2a0ee 100644 (file)
@@ -578,5 +578,17 @@ struct code2str dcodQ931TypeOfSubaddressTable[] = {
        { -1,   "Invalid"},
 };
 
-#endif /* __FTMOD_SANGOMA_ISDN_TRACE_H__ */
+struct code2str dcodQ931DisplayTypeTable[] = {
+       { 0x00, "Calling Party Name"},
+       { 0x01, "Connected Party Name"},
+       { 0x05, "Original Called Party Name"},
+       { -1,   "Invalid"},
+};
 
+struct code2str dcodQ931AssocInfoTable[] = {
+       { 0x00, "Requested"},
+       { 0x03, "Included"},
+       { -1,   "Invalid"},
+};
+
+#endif /* __FTMOD_SANGOMA_ISDN_TRACE_H__ */