]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-5225: --resolve add ability to dial by pressing line button
authorNathan Neulinger <nneul@neulinger.org>
Wed, 22 May 2013 14:17:41 +0000 (09:17 -0500)
committerNathan Neulinger <nneul@neulinger.org>
Fri, 31 May 2013 20:10:43 +0000 (15:10 -0500)
src/mod/endpoints/mod_skinny/skinny_server.c

index ed94d22aba577c19ed155a0206c48e604995e0f5..a679a20c6e2547c56c12fcf65665d68dd1f77cff 100644 (file)
@@ -1132,6 +1132,11 @@ switch_status_t skinny_handle_keypad_button_message(listener_t *listener, skinny
        }
 
        session = skinny_profile_find_session(listener->profile, listener, &line_instance, call_id);
+       if ( !session )
+       {
+               line_instance = 0;
+               session = skinny_profile_find_session(listener->profile, listener, &line_instance, 0);
+       }
 
        if(session) {
                switch_channel_t *channel = NULL;
@@ -1205,6 +1210,9 @@ switch_status_t skinny_handle_stimulus_message(listener_t *listener, skinny_mess
        switch_core_session_t *session = NULL;
        struct speed_dial_stat_res_message *button_speed_dial = NULL;
        struct line_stat_res_message *button_line = NULL;
+       uint32_t line_state;
+
+       switch_channel_t *channel = NULL;
 
        skinny_check_data_length(request, sizeof(request->data.stimulus)-sizeof(request->data.stimulus.call_id));
 
@@ -1255,7 +1263,27 @@ switch_status_t skinny_handle_stimulus_message(listener_t *listener, skinny_mess
 
                        // If session and line match, answer the call
                        if ( session && line_instance == button_line->number ) {
-                               status = skinny_session_answer(session, listener, line_instance);
+                               line_state = skinny_line_get_state(listener, line_instance, call_id);
+
+                               if(line_state == SKINNY_OFF_HOOK) {
+                                       channel = switch_core_session_get_channel(session);
+                                       if (switch_channel_test_flag(channel, CF_HOLD)) {
+                                               switch_ivr_unhold(session);
+                                       }
+
+                                       switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
+                               } 
+                               else {
+                                       status = skinny_session_answer(session, listener, line_instance);
+                               }
+                       }
+                       else {
+                               if(skinny_check_data_length_soft(request, sizeof(request->data.soft_key_event))) {
+                                       line_instance = request->data.soft_key_event.line_instance;
+                               }
+
+                               skinny_create_incoming_session(listener, &line_instance, &session);
+                               skinny_session_process_dest(session, listener, line_instance, NULL, '\0', 0);
                        }
                        break;
 
@@ -1276,6 +1304,7 @@ switch_status_t skinny_handle_off_hook_message(listener_t *listener, skinny_mess
        uint32_t call_id = 0;
        switch_core_session_t *session = NULL;
        private_t *tech_pvt = NULL;
+       uint32_t line_state;
 
        if(skinny_check_data_length_soft(request, sizeof(request->data.off_hook))) {
                if (request->data.off_hook.line_instance > 0) {
@@ -1286,7 +1315,9 @@ switch_status_t skinny_handle_off_hook_message(listener_t *listener, skinny_mess
 
        session = skinny_profile_find_session(listener->profile, listener, &line_instance, call_id);
 
-       if(session) { /*answering a call */
+       line_state = skinny_line_get_state(listener, line_instance, call_id);
+
+       if(session && line_state != SKINNY_OFF_HOOK ) { /*answering a call */
                skinny_session_answer(session, listener, line_instance);
        } else { /* start a new call */
                skinny_create_incoming_session(listener, &line_instance, &session);