[Freeswitch-svn] [commit] r11269 - in freeswitch/branches/ctrix/mod_airpe: . config
FreeSWITCH SVN
ctrix at freeswitch.org
Sat Jan 17 17:03:30 PST 2009
Author: ctrix
Date: Sat Jan 17 19:03:30 2009
New Revision: 11269
Log:
Work in progress
Modified:
freeswitch/branches/ctrix/mod_airpe/airpe_if_common.c
freeswitch/branches/ctrix/mod_airpe/airpe_if_x11.c
freeswitch/branches/ctrix/mod_airpe/config/airpe.conf.xml
freeswitch/branches/ctrix/mod_airpe/mod_airpe.c
freeswitch/branches/ctrix/mod_airpe/mod_airpe.h
Modified: freeswitch/branches/ctrix/mod_airpe/airpe_if_common.c
==============================================================================
--- freeswitch/branches/ctrix/mod_airpe/airpe_if_common.c (original)
+++ freeswitch/branches/ctrix/mod_airpe/airpe_if_common.c Sat Jan 17 19:03:30 2009
@@ -170,6 +170,9 @@
switch_status_t airpe_cmd_write(airpe_interface_t *airpe, char *msg) {
switch_status_t status;
+//TODO locking
+
+ assert(airpe);
if ( airpe->debug )
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "msg to airpe client %s: > %s\n", airpe->name, msg);
Modified: freeswitch/branches/ctrix/mod_airpe/airpe_if_x11.c
==============================================================================
--- freeswitch/branches/ctrix/mod_airpe/airpe_if_x11.c (original)
+++ freeswitch/branches/ctrix/mod_airpe/airpe_if_x11.c Sat Jan 17 19:03:30 2009
@@ -268,7 +268,6 @@
airpe->running = 1;
XFlush(disp);
x11_fd = ConnectionNumber(disp);
-
while ( airpe->running ) {
FD_ZERO(&rset);
FD_SET( x11_fd, &rset);
Modified: freeswitch/branches/ctrix/mod_airpe/config/airpe.conf.xml
==============================================================================
--- freeswitch/branches/ctrix/mod_airpe/config/airpe.conf.xml (original)
+++ freeswitch/branches/ctrix/mod_airpe/config/airpe.conf.xml Sat Jan 17 19:03:30 2009
@@ -1,4 +1,5 @@
<configuration name="airpe.conf" description="Airpe Configuration">
+
<globals>
<param name="audio-tcp-port_start" value="21000"/>
@@ -35,6 +36,14 @@
The purpose is restarting the client with those credentials -->
<param name="skype-user" value="username"/>
<param name="skype-password" value="password"/>
+
+ <!--all variables here will be set on all inbound calls that originate from this client -->
+ <variables>
+ <variable name="variable" value="default"/>
+ <variable name="process_cdr" value="false"/>
+ </variables>
+
</client>
</clients>
+
</configuration>
Modified: freeswitch/branches/ctrix/mod_airpe/mod_airpe.c
==============================================================================
--- freeswitch/branches/ctrix/mod_airpe/mod_airpe.c (original)
+++ freeswitch/branches/ctrix/mod_airpe/mod_airpe.c Sat Jan 17 19:03:30 2009
@@ -59,6 +59,20 @@
TECH STUFF
*****************************************************************************/
+static int fetch_next_port(void) {
+ int port = 0;
+
+ if ( !globals.last_port_used )
+ globals.last_port_used = globals.audio_tcp_port_start;
+
+ switch_mutex_lock(globals.mutex);
+ port = globals.last_port_used;
+ globals.last_port_used++;
+ switch_mutex_unlock(globals.mutex);
+
+ return port;
+}
+
static switch_status_t airpe_codec_init(private_object_t * tech_pvt, int sample_rate, int codec_ms) {
airpe_interface_t *airpe = NULL;
@@ -139,20 +153,6 @@
return new_sock;
}
-static int fetch_next_port(void) {
- int port = 0;
-
- if ( !globals.last_port_used )
- globals.last_port_used = globals.audio_tcp_port_start;
-
- switch_mutex_lock(globals.mutex);
- port = globals.last_port_used;
- globals.last_port_used++;
- switch_mutex_unlock(globals.mutex);
-
- return port;
-}
-
static switch_status_t airpe_audio_sockets_create( airpe_interface_t *airpe ) {
switch_socket_t *new_sock;
int port;
@@ -185,7 +185,7 @@
}
-static switch_status_t airpe_start_client(airpe_interface_t *airpe) {
+static switch_status_t airpe_create_client(airpe_interface_t *airpe) {
switch_threadattr_t *attr_skype = NULL;
@@ -198,16 +198,20 @@
switch_threadattr_create(&attr_skype, airpe_module_pool);
switch_threadattr_stacksize_set(attr_skype, SWITCH_THREAD_STACKSIZE);
- switch_thread_create(&airpe->airpe_thread_skype,
+ return switch_thread_create(&airpe->airpe_thread_skype,
attr_skype,
airpe_skype_thread,
airpe,
airpe_module_pool);
-
- return SWITCH_STATUS_SUCCESS;
}
-static switch_status_t airpe_stop_client(airpe_interface_t *airpe) {
+static switch_status_t airpe_destroy_client(airpe_interface_t *airpe) {
+
+ if ( airpe->active_call_id ) {
+ char buf[SKYPE_MSG_LEN] = "";
+ snprintf(buf, sizeof(buf), "ALTER CALL %d END HANGUP", airpe->active_call_id );
+ airpe_cmd_write(airpe, buf);
+ }
if ( airpe->audio_in_socket ) {
if ( airpe->debug )
@@ -229,7 +233,9 @@
airpe_set_mood_text(airpe, NULL);
airpe_set_partner_displayname(airpe, NULL);
airpe_set_partner_handle(airpe, NULL);
- airpe_set_call_id(airpe, 0, NULL);
+ airpe_clear_call_id(airpe);
+
+ switch_core_hash_destroy(&airpe->variables_hash);
return SWITCH_STATUS_SUCCESS;
}
@@ -632,14 +638,17 @@
CONFIGURATION
*****************************************************************************/
-static switch_status_t load_config( int reload ) {
+static switch_status_t load_config(void) {
switch_xml_t cfg,
xml,
global_settings,
param,
clients,
- client;
+ client,
+ variables,
+ variable;
switch_memory_pool_t *pool;
+ switch_status_t status;
pool = airpe_module_pool;
@@ -679,131 +688,112 @@
for (client = switch_xml_child(clients, "client"); client; client = client->next)
{
- char *name = (char *) switch_xml_attr(client, "name");
- char *context = NULL;
- char *dialplan = NULL;
- char *destination = NULL;
- char *X11_display = NULL;
- char *skype_user = NULL;
- char *skype_password= NULL;
- char *cid_name = NULL;
- char *cid_num = NULL;
- int auto_auth = 0;
- int debug = 0;
+ airpe_interface_t *newconf = NULL;
- airpe_interface_t *newconf = NULL;
+ char *name = (char *) switch_xml_attr(client, "name");
- if (!name) {
+ if ( switch_strlen_zero(name) ) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No name attribute. Skipping unnamed client.\n");
continue;
}
+ if ( (newconf = switch_core_hash_find(globals.interfaces_hash, name)) ) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Duplicated client %s. Skipping\n", name);
+ continue;
+ }
+
+ /* If we don't have a new interface, yet, then create one */
+ if ( !newconf ) {
+ newconf = (airpe_interface_t *) switch_core_alloc( pool, sizeof(airpe_interface_t) );
+ if ( newconf )
+ memset(newconf, 0, sizeof(airpe_interface_t));
+ else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot alloc memory for the new interface %s\n", name);
+ continue;
+ }
+ }
+
+ /* Start parsing our parameters */
+
+ newconf->name = switch_core_strdup(pool, name);
+
for (param = switch_xml_child(client, "param"); param; param = param->next) {
char *var = (char *) switch_xml_attr_soft(param, "name");
char *val = (char *) switch_xml_attr_soft(param, "value");
if (!strcasecmp(var, "debug")) {
- debug = switch_true(val) ? 1 : 0;
+ newconf->debug = switch_true(val) ? 1 : 0;
} else if (!strcasecmp(var, "auto-auth")) {
- auto_auth = switch_true(val) ? 1 : 0;
+ newconf->auto_auth = switch_true(val) ? 1 : 0;
} else if (!strcasecmp(var, "context")) {
- context = val;
+ newconf->context = switch_core_strdup(pool, val);
} else if (!strcasecmp(var, "dialplan")) {
- dialplan = val;
+ newconf->dialplan = switch_core_strdup(pool, val);
} else if (!strcasecmp(var, "destination")) {
- destination = val;
+ newconf->destination = switch_core_strdup(pool, val);
} else if (!strcasecmp(var, "skype-user")) {
- skype_user = val;
+ newconf->skype_user = switch_core_strdup(pool, val);
} else if (!strcasecmp(var, "skype-password")) {
- skype_password = val;
+ newconf->skype_password = switch_core_strdup(pool, val);
} else if (!strcasecmp(var, "X11-display")) {
- X11_display = val;
+ newconf->X11_display = switch_core_strdup(pool, val);
} else if (!strcasecmp(var, "cid-name")) {
- cid_name = val;
+ //cid_name = val;
} else if (!strcasecmp(var, "cid-num")) {
- cid_num = val;
+ //cid_num = val;
}
else
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Unknown config param %s\n", var);
}
- if (!skype_user) {
+
+ if (!newconf->skype_user) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No skype-user param for client %s. Skipping\n", name);
continue;
}
- if (!skype_password) {
+ if (!newconf->skype_password) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No skype-password param for client %s. Skipping\n", name);
continue;
}
- if (!X11_display) {
+ if (!newconf->X11_display) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No X11-display param for client %s. Skipping\n", name);
continue;
}
- if ( !dialplan )
- dialplan = globals.dialplan;
- if ( !context )
- context = globals.context;
- if ( !destination )
- destination = globals.destination;
+ if ( !newconf->dialplan )
+ newconf->dialplan = globals.dialplan;
+ if ( !newconf->context )
+ newconf->context = globals.context;
+ if ( !newconf->destination )
+ newconf->destination = globals.destination;
+
+ newconf->audio_in_port = 0;
+ newconf->audio_in_port = 0;
+
+ switch_core_hash_init(&newconf->variables_hash, pool);
+ if ((variables = switch_xml_child(client, "variables"))) {
+ for (variable = switch_xml_child(variables, "variable"); variable; variable = variable->next)
+ {
+ char *vname = (char *) switch_xml_attr(variable, "name");
+ char *vvalue = (char *) switch_xml_attr(variable, "value");
- if ( reload ) {
- newconf = airpe_find_interface(name);
- }
- else {
- if ( (newconf = switch_core_hash_find(globals.interfaces_hash, name)) ) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Duplicated client %s. Skipping\n", name);
- continue;
+ if ( !switch_strlen_zero(vname) && vvalue ) {
+ switch_core_hash_insert(newconf->variables_hash, vname, vvalue);
+ }
}
}
- if ( !newconf ) {
- newconf = (airpe_interface_t *) switch_core_alloc( pool, sizeof(airpe_interface_t) );
- if ( newconf )
- memset(newconf, 0, sizeof(airpe_interface_t));
- }
-
-
- if ( newconf ) {
- switch_status_t status;
-
- newconf->name = switch_core_strdup(pool, name);
- newconf->dialplan = switch_core_strdup(pool, dialplan);
- newconf->context = switch_core_strdup(pool, context);
- newconf->destination = switch_core_strdup(pool, destination);
- newconf->auto_auth = auto_auth;
- newconf->debug = debug;
-
- if ( reload ) {
- /* We won't update any other value on reload. */
- newconf->should_reload = 0;
- continue;
- }
-
- newconf->skype_user = switch_core_strdup(pool, skype_user);
- newconf->skype_password = switch_core_strdup(pool, skype_password);
- newconf->X11_display = switch_core_strdup(pool, X11_display);
- newconf->audio_in_port = 0;
- newconf->audio_in_port = 0;
- newconf->skype_window = skype_window_alloc(pool);
-
- if ( newconf->skype_window ) {
- status = airpe_start_client(newconf);
- if ( status == SWITCH_STATUS_SUCCESS ) {
- switch_core_hash_insert(globals.interfaces_hash, name, newconf);
- }
- else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Airpe: cannot start client %s.\n", newconf->name);
- }
+ /* Start the thread managing the skype client */
+ newconf->skype_window = skype_window_alloc(pool);
+ if ( newconf->skype_window ) {
+ status = airpe_create_client(newconf);
+ if ( status == SWITCH_STATUS_SUCCESS ) {
+ switch_core_hash_insert(globals.interfaces_hash, name, newconf);
}
else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Airpe: cannot alloc client %s.\n", newconf->name);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Airpe: cannot start client %s.\n", newconf->name);
}
-
-
- }
- else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Airpe: cannot alloc client %s.\n", newconf->name);
}
+
}
}
@@ -828,7 +818,7 @@
}
/* Update the data of each client */
- load_config(1);
+// load_config(1);
/* Find eventual clients not updated and stop them */
for (hi = switch_hash_first(NULL, globals.interfaces_hash); hi; hi = switch_hash_next(hi)) {
@@ -837,10 +827,9 @@
if ( airpe->should_reload ) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Stopping airpe client %s.\n", airpe->name);
switch_core_hash_delete(globals.interfaces_hash, airpe->name);
- airpe_stop_client(airpe);
+ airpe_destroy_client(airpe);
}
}
-
}
@@ -882,7 +871,7 @@
switch_core_hash_init(&globals.interfaces_hash, pool);
switch_mutex_init(&globals.mutex, SWITCH_MUTEX_NESTED, pool);
- load_config(0);
+ load_config();
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
@@ -893,14 +882,13 @@
airpe_endpoint_interface->state_handler = &airpe_state_handlers;
if ((switch_event_bind_removable(modname, SWITCH_EVENT_RELOADXML, NULL, reloadxml_event_handler, NULL, &EVENT_NODE) != SWITCH_STATUS_SUCCESS)) {
+ /* Not such severe to prevent loading, so don't abort */
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind our reloadxml handler!\n");
- /* Not such severe to prevent loading */
}
airpe_register_api( &*module_interface );
airpe_register_apps( &*module_interface );
-
return SWITCH_STATUS_SUCCESS;
}
@@ -922,7 +910,7 @@
airpe->running = 0;
/* Wake up the socket */
airpe_cmd_write(airpe, "PING");
- airpe_stop_client(airpe);
+ airpe_destroy_client(airpe);
/*
we won't delete the hash element. we're going to destroy the whole pool
switch_core_hash_delete(globals.interfaces_hash, airpe->name);
Modified: freeswitch/branches/ctrix/mod_airpe/mod_airpe.h
==============================================================================
--- freeswitch/branches/ctrix/mod_airpe/mod_airpe.h (original)
+++ freeswitch/branches/ctrix/mod_airpe/mod_airpe.h Sat Jan 17 19:03:30 2009
@@ -138,11 +138,12 @@
char *dialplan;
char *context;
char *destination;
+ int auto_auth;
char *X11_display;
char *skype_user;
char *skype_password;
- int auto_auth;
+ switch_mutex_t *mutex;
int audio_in_port;
int audio_out_port;
switch_socket_t *audio_in_socket;
@@ -153,6 +154,7 @@
switch_thread_t *airpe_thread_skype;
skype_window_handler_t *skype_window;
+ switch_hash_t *variables_hash;
int protocol;
USER_STATUS user_status;
CALL_STATUS call_status;
@@ -208,6 +210,7 @@
switch_status_t airpe_set_mood_text(airpe_interface_t *airpe, char *string);
switch_status_t airpe_set_partner_displayname(airpe_interface_t *airpe, char *string);
switch_status_t airpe_set_partner_handle(airpe_interface_t *airpe, char *string);
+void airpe_clear_call_id(airpe_interface_t *airpe);
switch_status_t airpe_set_call_id(airpe_interface_t *airpe, int sk_id, char *fs_uuid);
switch_status_t airpe_call_shutdown( private_object_t *pvt );
More information about the Freeswitch-svn
mailing list