From 1e3bfef390add3eb4f902b102fd74e8d1b6d0846 Mon Sep 17 00:00:00 2001 From: Nathan Neulinger Date: Fri, 2 Aug 2013 14:12:03 -0500 Subject: [PATCH] FS-5662 --resolve implement call pickup group functionality in mod_skinny. Currently treats callPickup and grpCallPickup identically, may revisit when I find out more about what's different between the two --- .../conf/directory/default/skinny-example.xml | 8 ++++++++ src/mod/endpoints/mod_skinny/mod_skinny.c | 9 +++++++++ src/mod/endpoints/mod_skinny/mod_skinny.h | 2 ++ src/mod/endpoints/mod_skinny/skinny_api.c | 1 + src/mod/endpoints/mod_skinny/skinny_server.c | 10 ++++++++++ 5 files changed, 30 insertions(+) diff --git a/src/mod/endpoints/mod_skinny/conf/directory/default/skinny-example.xml b/src/mod/endpoints/mod_skinny/conf/directory/default/skinny-example.xml index 8b8fad5812..c51b5ce9cf 100644 --- a/src/mod/endpoints/mod_skinny/conf/directory/default/skinny-example.xml +++ b/src/mod/endpoints/mod_skinny/conf/directory/default/skinny-example.xml @@ -8,6 +8,14 @@ --> + + + + diff --git a/src/mod/endpoints/mod_skinny/mod_skinny.c b/src/mod/endpoints/mod_skinny/mod_skinny.c index 18b0f3c3f5..ab4398a898 100644 --- a/src/mod/endpoints/mod_skinny/mod_skinny.c +++ b/src/mod/endpoints/mod_skinny/mod_skinny.c @@ -172,6 +172,7 @@ switch_status_t skinny_profile_dump(const skinny_profile_t *profile, switch_stre stream->write_function(stream, "Ext-Voicemail \t%s\n", profile->ext_voicemail); stream->write_function(stream, "Ext-Redial \t%s\n", profile->ext_redial); stream->write_function(stream, "Ext-MeetMe \t%s\n", profile->ext_meetme); + stream->write_function(stream, "Ext-PickUp \t%s\n", profile->ext_pickup); stream->write_function(stream, "%s\n", line); return SWITCH_STATUS_SUCCESS; @@ -1869,6 +1870,10 @@ switch_status_t skinny_profile_set(skinny_profile_t *profile, const char *var, c if (!profile->ext_meetme || strcmp(val, profile->ext_meetme)) { profile->ext_meetme = switch_core_strdup(profile->pool, val); } + } else if (!strcasecmp(var, "ext-pickup")) { + if (!profile->ext_pickup || strcmp(val, profile->ext_pickup)) { + profile->ext_pickup = switch_core_strdup(profile->pool, val); + } } else { return SWITCH_STATUS_FALSE; } @@ -1965,6 +1970,10 @@ static switch_status_t load_skinny_config(void) skinny_profile_set(profile, "ext-meetme", "conference"); } + if (!profile->ext_pickup) { + skinny_profile_set(profile, "ext-pickup", "pickup"); + } + if (profile->port == 0) { profile->port = 2000; } diff --git a/src/mod/endpoints/mod_skinny/mod_skinny.h b/src/mod/endpoints/mod_skinny/mod_skinny.h index 7c9dcdb314..df876d0894 100644 --- a/src/mod/endpoints/mod_skinny/mod_skinny.h +++ b/src/mod/endpoints/mod_skinny/mod_skinny.h @@ -124,6 +124,7 @@ struct skinny_profile { char *ext_voicemail; char *ext_redial; char *ext_meetme; + char *ext_pickup; /* db */ char *dbname; char *odbc_dsn; @@ -192,6 +193,7 @@ struct listener { char *ext_voicemail; char *ext_redial; char *ext_meetme; + char *ext_pickup; }; typedef struct listener listener_t; diff --git a/src/mod/endpoints/mod_skinny/skinny_api.c b/src/mod/endpoints/mod_skinny/skinny_api.c index 94318c8de0..db9338b000 100644 --- a/src/mod/endpoints/mod_skinny/skinny_api.c +++ b/src/mod/endpoints/mod_skinny/skinny_api.c @@ -234,6 +234,7 @@ static switch_status_t skinny_api_list_settings(const char *line, const char *cu switch_console_push_match(&my_matches, "ext-voicemail"); switch_console_push_match(&my_matches, "ext-redial"); switch_console_push_match(&my_matches, "ext-meetme"); + switch_console_push_match(&my_matches, "ext-pickup"); if (my_matches) { *matches = my_matches; diff --git a/src/mod/endpoints/mod_skinny/skinny_server.c b/src/mod/endpoints/mod_skinny/skinny_server.c index b6aea308cd..a1189b87f3 100644 --- a/src/mod/endpoints/mod_skinny/skinny_server.c +++ b/src/mod/endpoints/mod_skinny/skinny_server.c @@ -1046,6 +1046,10 @@ switch_status_t skinny_handle_register(listener_t *listener, skinny_message_t *r if (!listener->ext_meetme || strcmp(value,listener->ext_meetme)) { listener->ext_meetme = switch_core_strdup(profile->pool, value); } + } else if (!strcasecmp(name, "ext-pickup")) { + if (!listener->ext_pickup || strcmp(value,listener->ext_pickup)) { + listener->ext_pickup = switch_core_strdup(profile->pool, value); + } } } } @@ -1948,6 +1952,12 @@ switch_status_t skinny_handle_soft_key_event_message(listener_t *listener, skinn skinny_session_process_dest(session, listener, line_instance, empty_null2(listener->ext_meetme, listener->profile->ext_meetme), '\0', 0); break; + case SOFTKEY_CALLPICKUP: + case SOFTKEY_GRPCALLPICKUP: + skinny_create_incoming_session(listener, &line_instance, &session); + skinny_session_process_dest(session, listener, line_instance, + empty_null2(listener->ext_pickup, listener->profile->ext_pickup), '\0', 0); + break; default: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Unknown SoftKeyEvent type: %d.\n", request->data.soft_key_event.event);