[Freeswitch-svn] [commit] r10648 - in freeswitch/trunk/scripts/contrib/intralanman/C/lcr: . mod_lcr
FreeSWITCH SVN
intralanman at freeswitch.org
Sun Dec 7 14:36:33 PST 2008
Author: intralanman
Date: Sun Dec 7 17:36:33 2008
New Revision: 10648
Log:
add support for ordering by rate, quality, or reliability... more to come
Modified:
freeswitch/trunk/scripts/contrib/intralanman/C/lcr/lcr.conf.xml
freeswitch/trunk/scripts/contrib/intralanman/C/lcr/mod_lcr/mod_lcr.c
Modified: freeswitch/trunk/scripts/contrib/intralanman/C/lcr/lcr.conf.xml
==============================================================================
--- freeswitch/trunk/scripts/contrib/intralanman/C/lcr/lcr.conf.xml (original)
+++ freeswitch/trunk/scripts/contrib/intralanman/C/lcr/lcr.conf.xml Sun Dec 7 17:36:33 2008
@@ -1,6 +1,20 @@
-<configuration name="lcr.conf" description="LIMIT Configuration">
+<configuration name="lcr.conf" description="LCR Configuration">
<settings>
- <!--<param name="odbc-dsn" value="freeswitch-mysql:freeswitch:Fr33Sw1tch"/>-->
- <param name="odbc-dsn" value="freeswitch-pgsql:freeswitch:Fr33Sw1tch"/>
+ <param name="odbc-dsn" value="freeswitch-mysql:freeswitch:Fr33Sw1tch"/>
+<!-- <param name="odbc-dsn" value="freeswitch-pgsql:freeswitch:Fr33Sw1tch"/> -->
</settings>
+ <profiles>
+ <profile name="default">
+ <param name="id" value="0"/>
+ <param name="order_by" value="rate"/>
+ </profile>
+ <profile name="quality">
+ <param name="id" value="1"/>
+ <param name="order_by" value="quality"/>
+ </profile>
+ <profile name="reliability">
+ <param name="id" value="2"/>
+ <param name="order_by" value="reliability"/>
+ </profile>
+ </profiles>
</configuration>
Modified: freeswitch/trunk/scripts/contrib/intralanman/C/lcr/mod_lcr/mod_lcr.c
==============================================================================
--- freeswitch/trunk/scripts/contrib/intralanman/C/lcr/mod_lcr/mod_lcr.c (original)
+++ freeswitch/trunk/scripts/contrib/intralanman/C/lcr/mod_lcr/mod_lcr.c Sun Dec 7 17:36:33 2008
@@ -101,6 +101,13 @@
typedef struct max_obj max_obj_t;
typedef max_obj_t *max_len;
+struct profile_obj {
+ char *name;
+ uint16_t id;
+ char *order_by;
+};
+typedef struct profile_obj profile_t;
+
struct callback_obj {
lcr_route head;
int matches;
@@ -114,6 +121,8 @@
char *odbc_dsn;
switch_mutex_t *mutex;
switch_odbc_handle_t *master_odbc;
+ switch_hash_t *profile_hash;
+ profile_t *default_profile;
void *filler1;
} globals;
@@ -293,16 +302,25 @@
return SWITCH_STATUS_SUCCESS;
}
-switch_status_t lcr_do_lookup(callback_t *cb_struct, char *digits, uint16_t lcr_profile) {
+switch_status_t lcr_do_lookup(callback_t *cb_struct, char *digits, char* profile_name) {
/* instantiate the object/struct we defined earlier */
switch_stream_handle_t sql_stream = { 0 };
size_t n, digit_len = strlen(digits);
char *digits_copy;
+ profile_t *profile;
switch_bool_t lookup_status;
if (switch_strlen_zero(digits)) {
return SWITCH_FALSE;
}
+
+ /* locate the profile */
+ if(switch_strlen_zero(profile_name)) {
+ profile = globals.default_profile;
+ } else if (!(profile = switch_core_hash_find(globals.profile_hash, profile_name))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error invalid profile %s\n", profile_name);
+ return SWITCH_STATUS_FALSE;
+ }
digits_copy = strdup(digits);
@@ -318,10 +336,10 @@
sql_stream.write_function(&sql_stream, "%s%s", (n==digit_len ? "" : ", "), digits_copy);
}
sql_stream.write_function(&sql_stream, ") AND CURRENT_TIMESTAMP BETWEEN date_start AND date_end ");
- if(lcr_profile > 0) {
- sql_stream.write_function(&sql_stream, "AND lcr_profile=%d ", lcr_profile);
+ if(profile->id > 0) {
+ sql_stream.write_function(&sql_stream, "AND lcr_profile=%d ", profile->id);
}
- sql_stream.write_function(&sql_stream, "ORDER BY digits DESC, rate");
+ sql_stream.write_function(&sql_stream, "ORDER BY digits DESC, %s", profile->order_by);
if(db_random) {
sql_stream.write_function(&sql_stream, ", %s", db_random);
}
@@ -341,10 +359,11 @@
static switch_status_t lcr_load_config() {
char *cf = "lcr.conf";
- switch_xml_t cfg, xml, settings, param;
+ switch_xml_t cfg, xml, settings, param, x_profile, x_profiles;
switch_status_t status = SWITCH_STATUS_SUCCESS;
char *odbc_user = NULL;
char *odbc_pass = NULL;
+ profile_t *profile = NULL;
if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
@@ -369,6 +388,65 @@
}
}
}
+
+ /* define default profile */
+ profile = switch_core_alloc(globals.pool, sizeof(*profile));
+ profile->name = "global_default";
+ profile->order_by = "rate";
+ globals.default_profile = profile;
+
+ switch_core_hash_init(&globals.profile_hash, globals.pool);
+ if((x_profiles = switch_xml_child(cfg, "profiles"))) {
+ for (x_profile = switch_xml_child(x_profiles, "profile"); x_profile; x_profile = x_profile->next) {
+ char *name = (char *) switch_xml_attr_soft(x_profile, "name");
+ char *order_by = NULL;
+ char *id_s = NULL;
+
+ for (param = switch_xml_child(x_profile, "param"); param; param = param->next) {
+ char *var, *val;
+
+ var = (char *) switch_xml_attr_soft(param, "name");
+ val = (char *) switch_xml_attr_soft(param, "value");
+
+ if (!strcasecmp(var, "order_by") && !switch_strlen_zero(val)) {
+ if (!strcasecmp(val, "quality")) {
+ order_by = "quality DESC";
+ } else if(!strcasecmp(val, "reliability")) {
+ order_by = "reliability DESC";
+ } else {
+ order_by = val;
+ }
+ } else if (!strcasecmp(var, "id") && !switch_strlen_zero(val)) {
+ id_s = val;
+ }
+ }
+
+ if(switch_strlen_zero(name)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No name specified.\n");
+ } else {
+ profile = switch_core_alloc(globals.pool, sizeof(*profile));
+ profile->name = switch_core_strdup(globals.pool, name);
+
+ if(!switch_strlen_zero(order_by)) {
+ profile->order_by = switch_core_strdup(globals.pool, order_by);
+ } else {
+ /* default to rate */
+ profile->order_by = "rate";
+ }
+ if(!switch_strlen_zero(id_s)) {
+ profile->id = atoi(id_s);
+ }
+
+ switch_core_hash_insert(globals.profile_hash, profile->name, profile);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Loaded lcr profile %s.\n", profile->name);
+ }
+ }
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "No lcr profiles defined.\n");
+ }
+
+
+
if (globals.odbc_dsn) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO
, "dsn is \"%s\", user is \"%s\", and password is \"%s\"\n"
@@ -414,7 +492,7 @@
callback_t routes = { 0 };
lcr_route cur_route = { 0 };
char *bridge_data = NULL;
- uint16_t lcr_profile = 0;
+ char *lcr_profile = NULL;
if (!caller_profile) {
caller_profile = switch_channel_get_caller_profile(channel);
@@ -467,7 +545,7 @@
char *rbp = rbuf;
switch_size_t l = 0, rbl = sizeof(rbuf);
uint32_t cnt = 1;
- uint16_t lcr_profile = 0;
+ char *lcr_profile = NULL;
switch_channel_t *channel = switch_core_session_get_channel(session);
char *last_delim = "|";
callback_t routes = { 0 };
@@ -480,13 +558,7 @@
if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) {
dest = argv[0];
if(argc > 1) {
- if((uint16_t)atoi(argv[1]) > 0 && (uint16_t)atoi(argv[1]) < 0xFFFF) {
- lcr_profile = (uint16_t)atoi(argv[1]);
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING,
- "lcr profile MUST be an integer NOT '%s'\n", argv[1]
- );
- }
+ lcr_profile = argv[1];
}
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "LCR Lookup on %s\n", dest);
@@ -518,7 +590,7 @@
char *mydata = NULL;
char *dialstring = NULL;
char *destination_number = NULL;
- uint16_t lcr_profile = 0;
+ char *lcr_profile = NULL;
lcr_route current = NULL;
max_obj_t maximum_lengths = { 0 };
callback_t cb_struct = { 0 };
@@ -534,14 +606,7 @@
if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) {
destination_number = strdup(argv[0]);
if(argc > 1) {
- if((uint16_t)atoi(argv[1]) > 0 && (uint16_t)atoi(argv[1]) < 0xFFFF) {
- lcr_profile = (uint16_t)atoi(argv[1]);
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR
- , "lcr profile MUST be an integer, NOT '%s'\n", argv[1]
- );
- goto usage;
- }
+ lcr_profile = argv[1];
}
cb_struct.lookup_number = destination_number;
@@ -635,6 +700,7 @@
#endif
globals.pool = pool;
+
if (lcr_load_config() != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to load lcr config file\n");
More information about the Freeswitch-svn
mailing list