}
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;
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));
// 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;
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) {
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);