]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Skinny: handle UnregisterMessage and properly flush listener
authorMathieu Parent <math.parent@gmail.com>
Thu, 25 Feb 2010 15:23:11 +0000 (15:23 +0000)
committerMathieu Parent <math.parent@gmail.com>
Thu, 25 Feb 2010 15:23:11 +0000 (15:23 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@16820 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/endpoints/mod_skinny/mod_skinny.c
src/mod/endpoints/mod_skinny/skinny_protocol.c
src/mod/endpoints/mod_skinny/skinny_protocol.h

index 09c3a7e3ceb251bf3a1a305035524cb1f4a10267..f52304c481bf54b34745aab74de404a2fb610e70 100644 (file)
@@ -990,7 +990,28 @@ static void walk_listeners(skinny_listener_callback_func_t callback, void *pvt)
 static void flush_listener(listener_t *listener, switch_bool_t flush_log, switch_bool_t flush_events)
 {
 
-       /* TODO */
+       if(!zstr(listener->device_name)) {
+               skinny_profile_t *profile = listener->profile;
+               char *sql;
+       
+               if ((sql = switch_mprintf(
+                               "DELETE FROM skinny_devices "
+                                       "WHERE name='%s'",
+                               listener->device_name))) {
+                       skinny_execute_sql(profile, sql, profile->listener_mutex);
+                       switch_safe_free(sql);
+               }
+
+               if ((sql = switch_mprintf(
+                               "DELETE FROM skinny_buttons "
+                                       "WHERE device_name='%s'",
+                               listener->device_name))) {
+                       skinny_execute_sql(profile, sql, profile->listener_mutex);
+                       switch_safe_free(sql);
+               }
+
+               strcpy(listener->device_name, "");
+       }
 }
 
 static int dump_device_callback(void *pArg, int argc, char **argv, char **columnNames)
index a5d77889027479df2cc2b95fec6a7d9ed878f034..31c89fdd42fc70d3df45aa003d709cfca2c72ea7 100644 (file)
@@ -109,6 +109,7 @@ struct skinny_table SKINNY_MESSAGE_TYPES[] = {
        {"DisplayPromptStatusMessage", DISPLAY_PROMPT_STATUS_MESSAGE},
        {"ClearPromptStatusMessage", CLEAR_PROMPT_STATUS_MESSAGE},
        {"ActivateCallPlaneMessage", ACTIVATE_CALL_PLANE_MESSAGE},
+       {"UnregisterAckMessage", UNREGISTER_ACK_MESSAGE},
        {"DialedNumberMessage", DIALED_NUMBER_MESSAGE},
        {"FeatureResMessage", FEATURE_STAT_RES_MESSAGE},
        {NULL, 0}
@@ -1997,9 +1998,21 @@ switch_status_t skinny_handle_on_hook_message(listener_t *listener, skinny_messa
 switch_status_t skinny_handle_unregister(listener_t *listener, skinny_message_t *request)
 {
        switch_event_t *event = NULL;
+       skinny_message_t *message;
+
        /* skinny::unregister event */
        skinny_device_event(listener, &event, SWITCH_EVENT_CUSTOM, SKINNY_EVENT_UNREGISTER);
        switch_event_fire(&event);
+
+       message = switch_core_alloc(listener->pool, 12+sizeof(message->data.unregister_ack));
+       message->type = UNREGISTER_ACK_MESSAGE;
+       message->length = 4 + sizeof(message->data.unregister_ack);
+       message->data.unregister_ack.unregister_status = 0; /* OK */
+       skinny_send_reply(listener, message);
+
+       /* Close socket */
+       switch_clear_flag_locked(listener, LFLAG_RUNNING);
+
        return SWITCH_STATUS_SUCCESS;
 }
 
@@ -2061,8 +2074,8 @@ switch_status_t skinny_handle_request(listener_t *listener, skinny_message_t *re
                case UNREGISTER_MESSAGE:
                        return skinny_handle_unregister(listener, request);
                default:
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, 
-                               "Unknown request type: %x (length=%d).\n", request->type, request->length);
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING,
+                               "Unhandled request %s (type=%x,length=%d).\n", skinny_message_type2str(request->type), request->type, request->length);
                        return SWITCH_STATUS_SUCCESS;
        }
 }
index f3be6ea5c2ed0bfe9efe999e689c6f6dbb4b2c39..6ae94bf336e76ae019544bf3990d1aa62fa7a8f6 100644 (file)
@@ -441,6 +441,12 @@ struct activate_call_plane_message {
        uint32_t line_instance;
 };
 
+/* UnregisterAckMessage */
+#define UNREGISTER_ACK_MESSAGE 0x0118
+struct unregister_ack_message {
+       uint32_t unregister_status;
+};
+
 /* DialedNumberMessage */
 #define DIALED_NUMBER_MESSAGE 0x011D
 struct dialed_number_message {
@@ -506,6 +512,7 @@ union skinny_data {
        struct display_prompt_status_message display_prompt_status;
        struct clear_prompt_status_message clear_prompt_status;
        struct activate_call_plane_message activate_call_plane;
+       struct unregister_ack_message unregister_ack;
        struct dialed_number_message dialed_number;
        struct feature_stat_res_message feature_res;
        
@@ -619,7 +626,7 @@ uint32_t func(const char *str)\
                status = SWITCH_STATUS_SUCCESS;\
        }
        
-struct skinny_table SKINNY_MESSAGE_TYPES[52];
+struct skinny_table SKINNY_MESSAGE_TYPES[53];
 const char *skinny_message_type2str(uint32_t id);
 uint32_t skinny_str2message_type(const char *str);
 #define SKINNY_PUSH_MESSAGE_TYPES SKINNY_DECLARE_PUSH_MATCH(SKINNY_MESSAGE_TYPES)