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);
* 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"
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;
+}
+
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)
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;
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);
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");
} else {
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING);
}
+ ftdmchan->caller_data.cpc = ftdm_openr2_cpc_to_r2_ftdm_cpc(category);
}
/*
#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];
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
* 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__
*/
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__ */