]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: export and import boost custom data
authorMoises Silva <moy@sangoma.com>
Fri, 21 May 2010 15:10:15 +0000 (11:10 -0400)
committerMoises Silva <moy@sangoma.com>
Fri, 21 May 2010 15:10:39 +0000 (11:10 -0400)
libs/freetdm/mod_freetdm/mod_freetdm.c
libs/freetdm/src/ftdm_io.c
libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c
libs/freetdm/src/include/freetdm.h

index fd36deb6116d6ff7690a16486582fe7ddae2b807..85944f60add6d9ad5ffd1e178ba0b4c0475215f3 100644 (file)
@@ -1155,6 +1155,11 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
        } else {
                caller_data.dnis.type = outbound_profile->destination_number_ton;
        }
+
+       if ((var = switch_event_get_header(var_event, "freetdm_custom_call_data")) || (var = switch_core_get_variable("freetdm_custom_call_data"))) {
+               ftdm_set_string(caller_data.raw_data, var);
+               caller_data.raw_data_len = strlen(var);
+       }
        
        caller_data.dnis.plan = outbound_profile->destination_number_numplan;
 
@@ -1273,7 +1278,7 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
        switch_channel_t *channel = NULL;
        uint32_t spanid, chanid;
        char name[128];
-       ftdm_caller_data_t *channel_caller_data = sigmsg->raw_data;
+       ftdm_caller_data_t *channel_caller_data = ftdm_channel_get_caller_data(sigmsg->channel);
        
        *sp = NULL;
 
@@ -1350,6 +1355,9 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
        switch_channel_set_variable(channel, "freetdm_span_name", ftdm_channel_get_span_name(sigmsg->channel));
        switch_channel_set_variable_printf(channel, "freetdm_span_number", "%d", spanid);       
        switch_channel_set_variable_printf(channel, "freetdm_chan_number", "%d", chanid);
+       if (channel_caller_data->raw_data_len) {
+               switch_channel_set_variable_printf(channel, "freetdm_custom_call_data", "%s", channel_caller_data->raw_data);
+       }
                
        switch_channel_set_state(channel, CS_INIT);
        if (switch_core_session_thread_launch(session) != SWITCH_STATUS_SUCCESS) {
@@ -1440,7 +1448,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxo_signal)
 
        spanid = ftdm_channel_get_span_id(sigmsg->channel);
        chanid = ftdm_channel_get_id(sigmsg->channel);
-       callerdata = sigmsg->raw_data;
+       callerdata = ftdm_channel_get_caller_data(sigmsg->channel);
 
        ftdm_log(FTDM_LOG_DEBUG, "got FXO sig %d:%d [%s]\n", spanid, chanid, ftdm_signal_event2str(sigmsg->event_id));
 
@@ -1727,7 +1735,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
        switch_core_session_t *session = NULL;
        switch_channel_t *channel = NULL;
        ftdm_status_t status = FTDM_SUCCESS;
-       ftdm_caller_data_t *caller_data = sigmsg->raw_data;
+       ftdm_caller_data_t *caller_data = ftdm_channel_get_caller_data(sigmsg->channel);
 
        phyid = ftdm_channel_get_ph_id(sigmsg->channel);
        chanid = ftdm_channel_get_id(sigmsg->channel);
@@ -1845,7 +1853,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
 
        ftdm_log(FTDM_LOG_DEBUG, "got clear channel sig [%s]\n", ftdm_signal_event2str(sigmsg->event_id));
 
-       caller_data = sigmsg->raw_data;
+       caller_data = ftdm_channel_get_caller_data(sigmsg->channel);
        chanid = ftdm_channel_get_id(sigmsg->channel);
        spanid = ftdm_channel_get_span_id(sigmsg->channel);
 
index 6afa24da62420c69af523b90799b2f3ae23f84fd..910b2606461f299f86dea70a389ccd3095ae1d86 100644 (file)
@@ -4131,7 +4131,6 @@ FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t
                break;
 
        case FTDM_SIGEVENT_START:
-               sigmsg->raw_data = &sigmsg->channel->caller_data;
                /* when cleaning up the public API I added this because mod_freetdm.c on_fxs_signal was
                 * doing it during SIGEVENT_START, but now that flags are private they can't, wonder if
                 * is needed at all?
@@ -4139,10 +4138,6 @@ FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t
                ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_HOLD);
                break;
 
-       case FTDM_SIGEVENT_STOP:
-               sigmsg->raw_data = &sigmsg->channel->caller_data;
-               break;
-
        default:
                break;  
 
index 572b394bf04d838e4fe875b02c81da5da15dee8e..2b6c58675ef5879a5a18c2622e2ab74209d976ef 100644 (file)
@@ -427,6 +427,11 @@ static FIO_CHANNEL_REQUEST_FUNCTION(sangoma_boost_channel_request)
        event.called.ton = caller_data->dnis.type;
        event.called.npi = caller_data->dnis.plan;
 
+       if (caller_data->raw_data_len) {
+               ftdm_set_string(event.custom_data, caller_data->raw_data);
+               event.custom_data_size = caller_data->raw_data_len;
+       }
+
        OUTBOUND_REQUESTS[r].status = BST_WAITING;
        OUTBOUND_REQUESTS[r].span = span;
 
@@ -1036,6 +1041,7 @@ static void handle_call_start(ftdm_span_t *span, sangomabc_connection_t *mcon, s
        ftdmchan->caller_data.screen = event->calling.screening_ind;
        ftdmchan->caller_data.pres = event->calling.presentation_ind;
 
+       /* more info about custom data: http://www.ss7box.com/smg_manual.html#ISUP-IN-RDNIS-NEW */
        if (event->custom_data_size) {
                char* p = NULL;
 
@@ -1522,6 +1528,11 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
                        event.called.ton = ftdmchan->caller_data.dnis.type;
                        event.called.npi = ftdmchan->caller_data.dnis.plan;
 
+                       if (ftdmchan->caller_data.raw_data_len) {
+                               ftdm_set_string(event.custom_data, ftdmchan->caller_data.raw_data);
+                               event.custom_data_size = ftdmchan->caller_data.raw_data_len;
+                       }
+
                        OUTBOUND_REQUESTS[r].status = BST_WAITING;
                        OUTBOUND_REQUESTS[r].span = ftdmchan->span;
                        OUTBOUND_REQUESTS[r].ftdmchan = ftdmchan;
index 480182a3b2687d920a2e2b3d7493158a616e4dca..d0358265baa728bf51fff87d6ddc7c103abc06d1 100644 (file)
@@ -267,7 +267,9 @@ typedef struct ftdm_caller_data {
        uint8_t screen; /*!< Screening */
        uint8_t pres; /*!< Presentation*/
        char collected[25]; /*!< Collected digits so far */
-       int hangup_cause; /*! Hangup cause */
+       int hangup_cause; /*!< Hangup cause */
+       char raw_data[1024]; /*!< Protocol specific raw caller data */
+       uint32_t raw_data_len; /* !< Raw data length */
 } ftdm_caller_data_t;
 
 /*! \brief Tone type */