]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: fix OPENZAP-125 (Add basic calling party category support into ftmod_r2...
authorMoises Silva <moy@sangoma.com>
Sat, 18 Dec 2010 00:26:43 +0000 (19:26 -0500)
committerMoises Silva <moy@sangoma.com>
Sat, 18 Dec 2010 00:26:43 +0000 (19:26 -0500)
libs/freetdm/mod_freetdm/mod_freetdm.c
libs/freetdm/src/ftdm_call_utils.c
libs/freetdm/src/ftdm_io.c
libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
libs/freetdm/src/include/freetdm.h
libs/freetdm/src/include/ftdm_call_utils.h

index c459a57c113ccfd81c513997db42d864b6e2851e..0615b3821b3f76cef81ce892f15e0b12c91d12db 100755 (executable)
@@ -1278,6 +1278,10 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
                caller_data.dnis.type = outbound_profile->destination_number_ton;
        }
 
+       if ((var = channel_get_variable(session, var_event, "freetdm_calling_party_category"))) {
+               ftdm_set_calling_party_category(var, (uint8_t *)&caller_data.cpc);
+       }
+
        if ((var = channel_get_variable(session, var_event, "freetdm_custom_call_data"))) {
                ftdm_set_string(caller_data.raw_data, var);
                caller_data.raw_data_len = (uint32_t)strlen(var);
index 69f2fb4fff42ece6bf89bd8f2b719d87ec847a73..2b72f05b77e1aaf6f42f69c12c8ead7979aea3c8 100644 (file)
  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Contributors: 
+ *
+ * Moises Silva <moy@sangoma.com>
+ * Ricardo BarroetaveƱa <rbarroetavena@anura.com.ar>
+ *
  */
 
 #include "private/ftdm_core.h"
@@ -144,3 +150,20 @@ FT_DECLARE(ftdm_status_t) ftdm_is_number(const char *number)
        return FTDM_SUCCESS;
 }
 
+
+FT_DECLARE(ftdm_status_t) ftdm_set_calling_party_category(const char *string, uint8_t *target)
+{
+       uint8_t val;
+       ftdm_status_t status = FTDM_SUCCESS;
+
+       val = ftdm_str2ftdm_calling_party_category(string);
+       if (val == FTDM_CPC_INVALID) {
+               ftdm_log(FTDM_LOG_WARNING, "Invalid category string (%s)\n", string);
+               val = FTDM_CPC_ORDINARY;
+               status = FTDM_FAIL;
+       }
+
+       *target = val;
+       return status;
+}
+
index 1750d6d7d9e74bc9d56e6f0849cb67a5d4abab9d..36b7632cb330c6145353658f02d9787d4a32146f 100644 (file)
@@ -301,6 +301,9 @@ FTDM_STR2ENUM(ftdm_str2ftdm_bearer_cap, ftdm_bearer_cap2str, ftdm_bearer_cap_t,
 FTDM_ENUM_NAMES(USER_LAYER1_PROT_NAMES, USER_LAYER1_PROT_STRINGS)
 FTDM_STR2ENUM(ftdm_str2ftdm_usr_layer1_prot, ftdm_user_layer1_prot2str, ftdm_user_layer1_prot_t, USER_LAYER1_PROT_NAMES, FTDM_USER_LAYER1_PROT_INVALID)
 
+FTDM_ENUM_NAMES(CALLING_PARTY_CATEGORY_NAMES, CALLING_PARTY_CATEGORY_STRINGS)
+FTDM_STR2ENUM(ftdm_str2ftdm_calling_party_category, ftdm_calling_party_category2str, ftdm_calling_party_category_t, CALLING_PARTY_CATEGORY_NAMES, FTDM_CPC_INVALID)
+
 static ftdm_status_t ftdm_group_add_channels(ftdm_span_t* span, int currindex, const char* name);
 
 static const char *cut_path(const char *in)
index 14eca429e838d59b40306d075bbf61fb8252dd32..efd58b0af56bef2a3392afa341bb6b1855a36346 100644 (file)
@@ -380,11 +380,72 @@ static void ft_r2_answer_call(ftdm_channel_t *ftdmchan)
        R2CALL(ftdmchan)->answer_pending = 0;
 }
 
+static __inline__ ftdm_calling_party_category_t ftdm_openr2_cpc_to_r2_ftdm_cpc(openr2_calling_party_category_t cpc)
+{
+       switch (cpc) {
+       case OR2_CALLING_PARTY_CATEGORY_UNKNOWN:
+               return FTDM_CPC_UNKNOWN;
+
+       case OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER:
+               return FTDM_CPC_ORDINARY;
+
+       case OR2_CALLING_PARTY_CATEGORY_NATIONAL_PRIORITY_SUBSCRIBER:
+               return FTDM_CPC_PRIORITY;
+
+       case OR2_CALLING_PARTY_CATEGORY_INTERNATIONAL_SUBSCRIBER:
+               return FTDM_CPC_UNKNOWN;
+
+       case OR2_CALLING_PARTY_CATEGORY_INTERNATIONAL_PRIORITY_SUBSCRIBER:
+               return FTDM_CPC_UNKNOWN;
+
+       case OR2_CALLING_PARTY_CATEGORY_TEST_EQUIPMENT:
+               return FTDM_CPC_TEST;
+
+       case OR2_CALLING_PARTY_CATEGORY_PAY_PHONE:
+               return FTDM_CPC_PAYPHONE;
+
+       case OR2_CALLING_PARTY_CATEGORY_COLLECT_CALL:
+               return FTDM_CPC_OPERATOR;
+       }
+       return FTDM_CPC_INVALID;
+}
+
+static __inline openr2_calling_party_category_t ftdm_r2_ftdm_cpc_to_openr2_cpc(ftdm_calling_party_category_t cpc)
+{
+       switch (cpc) {
+       case FTDM_CPC_UNKNOWN:
+               return OR2_CALLING_PARTY_CATEGORY_UNKNOWN;
+
+       case FTDM_CPC_OPERATOR:
+               return OR2_CALLING_PARTY_CATEGORY_COLLECT_CALL;
+
+       case FTDM_CPC_ORDINARY:
+               return OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER;
+
+       case FTDM_CPC_PRIORITY:
+               return OR2_CALLING_PARTY_CATEGORY_NATIONAL_PRIORITY_SUBSCRIBER;
+
+       case FTDM_CPC_DATA:
+               return OR2_CALLING_PARTY_CATEGORY_UNKNOWN;
+
+       case FTDM_CPC_TEST:
+               return OR2_CALLING_PARTY_CATEGORY_TEST_EQUIPMENT;
+
+       case FTDM_CPC_PAYPHONE:
+               return OR2_CALLING_PARTY_CATEGORY_PAY_PHONE;
+
+       case FTDM_CPC_INVALID:
+               return OR2_CALLING_PARTY_CATEGORY_UNKNOWN;
+       }
+       return OR2_CALLING_PARTY_CATEGORY_UNKNOWN;
+}
+
 /* this function must be called with the chan mutex held! */
 static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(r2_outgoing_call)
 {
        openr2_call_status_t callstatus;
        ftdm_r2_data_t *r2data;
+       openr2_calling_party_category_t category = OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER;
 
        r2data = ftdmchan->span->signal_data;
 
@@ -397,6 +458,12 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(r2_outgoing_call)
 
        ft_r2_clean_call(ftdmchan->call_data);
 
+       if (ftdmchan->caller_data.cpc == FTDM_CPC_INVALID || ftdmchan->caller_data.cpc == FTDM_CPC_UNKNOWN) {
+               category = r2data->category;
+       } else {
+               category = ftdm_r2_ftdm_cpc_to_openr2_cpc(ftdmchan->caller_data.cpc);
+       }
+
        /* start io dump */
        if (r2data->mf_dump_size) {
                ftdm_channel_command(ftdmchan, FTDM_COMMAND_ENABLE_INPUT_DUMP, &r2data->mf_dump_size);
@@ -406,7 +473,7 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(r2_outgoing_call)
        callstatus = openr2_chan_make_call(R2CALL(ftdmchan)->r2chan, 
                        ftdmchan->caller_data.cid_num.digits, 
                        ftdmchan->caller_data.dnis.digits, 
-                       r2data->category);
+                       category);
 
        if (callstatus) {
                ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Failed to make call in R2 channel, openr2_chan_make_call failed\n");
@@ -615,6 +682,7 @@ static void ftdm_r2_on_call_offered(openr2_chan_t *r2chan, const char *ani, cons
        } else {
                ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING);
        }
+       ftdmchan->caller_data.cpc = ftdm_openr2_cpc_to_r2_ftdm_cpc(category);
 }
 
 /*
index 56a9dc05771b8e9a7618ea6c6d12bf12eafa126b..dce130f5be91c0cec38d6b37f22c8652229e5b92 100644 (file)
@@ -265,6 +265,21 @@ typedef enum {
 #define USER_LAYER1_PROT_STRINGS "V.110", "u-law", "a-law", "Invalid"
 FTDM_STR2ENUM_P(ftdm_str2ftdm_usr_layer1_prot, ftdm_user_layer1_prot2str, ftdm_user_layer1_prot_t)
 
+/*! Calling Party Category */
+typedef enum {
+       FTDM_CPC_UNKNOWN,
+       FTDM_CPC_OPERATOR,
+       FTDM_CPC_ORDINARY,
+       FTDM_CPC_PRIORITY,
+       FTDM_CPC_DATA,
+       FTDM_CPC_TEST,
+       FTDM_CPC_PAYPHONE,
+       FTDM_CPC_INVALID
+} ftdm_calling_party_category_t;
+#define CALLING_PARTY_CATEGORY_STRINGS "unknown", "operator", "ordinary", "priority", "data-call", "test-call", "payphone", "invalid"
+FTDM_STR2ENUM_P(ftdm_str2ftdm_calling_party_category, ftdm_calling_party_category2str, ftdm_calling_party_category_t)
+
+
 /*! \brief Number abstraction */
 typedef struct {
        char digits[25];
@@ -294,7 +309,8 @@ typedef struct ftdm_caller_data {
        ftdm_bearer_cap_t bearer_capability;
        /* user information layer 1 protocol */
        ftdm_user_layer1_prot_t bearer_layer1;
-       ftdm_variable_container_t variables; /*!<variables attached to this call */
+       ftdm_calling_party_category_t cpc; /*!< Calling party category */
+       ftdm_variable_container_t variables; /*!< Variables attached to this call */
        /* We need call_id inside caller_data for the user to be able to retrieve 
         * the call_id when ftdm_channel_call_place is called. This is the only time
         * that the user can use caller_data.call_id to obtain the call_id. The user
index 835a5c6cdc266bdd77997a023261557e33c6b6fe..2418273343f283cf361f347bc6cd40edda31c52d 100644 (file)
  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Contributors: 
+ *
+ * Moises Silva <moy@sangoma.com>
+ * Ricardo BarroetaveƱa <rbarroetavena@anura.com.ar>
+ *
  */
 
 #ifndef __FTDM_CALL_UTILS_H__
@@ -114,5 +120,16 @@ FT_DECLARE(ftdm_status_t) ftdm_set_presentation_ind(const char *string, uint8_t
  */
 FT_DECLARE(ftdm_status_t) ftdm_is_number(const char *number);
 
+/*! 
+ * \brief Set the Calling Party Category from an enum
+ *
+ * \param cpc_string string value
+ * \param target the target to set value to
+ *
+ * \retval FTDM_SUCCESS success
+ * \retval FTDM_FAIL failure
+ */
+FT_DECLARE(ftdm_status_t) ftdm_set_calling_party_category(const char *string, uint8_t *target);
+
 #endif /* __FTDM_CALL_UTILS_H__ */