Modified: freeswitch/trunk/src/mod/endpoints/mod_skinny/skinny_protocol.c (16785 => 16786)
--- freeswitch/trunk/src/mod/endpoints/mod_skinny/skinny_protocol.c 2010-02-24 12:05:06 UTC (rev 16785)
+++ freeswitch/trunk/src/mod/endpoints/mod_skinny/skinny_protocol.c 2010-02-24 12:05:16 UTC (rev 16786)
@@ -382,6 +382,23 @@
return SWITCH_STATUS_SUCCESS;
}
+switch_status_t skinny_hangup(listener_t *listener, uint32_t line)
+{
+ switch_channel_t *channel = NULL;
+ private_t *tech_pvt = NULL;
+
+ channel = switch_core_session_get_channel(listener->session[line]);
+ assert(channel != NULL);
+
+ tech_pvt = switch_core_session_get_private(listener->session[line]);
+ assert(tech_pvt != NULL);
+
+ switch_clear_flag_locked(tech_pvt, TFLAG_IO);
+ switch_clear_flag_locked(tech_pvt, TFLAG_VOICE);
+ switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
+ return SWITCH_STATUS_SUCCESS;
+}
+
/*****************************************************************************/
/* SKINNY MESSAGE HELPER */
/*****************************************************************************/
@@ -1124,9 +1141,9 @@
message->data.line_res.number++;
if (message->data.line_res.number == atoi(argv[0])) { /* wanted_position */
- strcpy(message->data.line_res.name, argv[3]); /* value */
- strcpy(message->data.line_res.shortname, argv[2]); /* label */
- strcpy(message->data.line_res.displayname, argv[4]); /* settings */
+ strncpy(message->data.line_res.name, argv[2], 24); /* label */
+ strncpy(message->data.line_res.shortname, argv[3], 40); /* value */
+ strncpy(message->data.line_res.displayname, argv[4], 44); /* settings */
}
return 0;
}
@@ -1172,8 +1189,8 @@
message->data.speed_dial_res.number++;
if (message->data.speed_dial_res.number == atoi(argv[0])) { /* wanted_position */
- message->data.speed_dial_res.number = atoi(argv[3]); /* value */
- strcpy(message->data.speed_dial_res.label, argv[2]); /* label */
+ strncpy(message->data.speed_dial_res.line, argv[3], 24); /* value */
+ strncpy(message->data.speed_dial_res.label, argv[2], 40); /* label */
}
return 0;
}
@@ -1282,8 +1299,17 @@
break;
default:
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,
- "Unknown SoftKeyEvent type: %d.\n", request->data.soft_key_event.event);
+ "Unknown SoftKeyEvent type while not busy: %d.\n", request->data.soft_key_event.event);
}
+ } else { /* the line is busy */
+ switch(request->data.soft_key_event.event) {
+ case SOFTKEY_ENDCALL:
+ skinny_hangup(listener, line);
+ break;
+ default:
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,
+ "Unknown SoftKeyEvent type while busy: %d.\n", request->data.soft_key_event.event);
+ }
}
return status;
}
@@ -1536,18 +1562,7 @@
}
if(listener->session[line]) {
- switch_channel_t *channel = NULL;
- private_t *tech_pvt = NULL;
-
- channel = switch_core_session_get_channel(listener->session[line]);
- assert(channel != NULL);
-
- tech_pvt = switch_core_session_get_private(listener->session[line]);
- assert(tech_pvt != NULL);
-
- switch_clear_flag_locked(tech_pvt, TFLAG_IO);
- switch_clear_flag_locked(tech_pvt, TFLAG_VOICE);
- switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
+ skinny_hangup(listener, line);
}
return status;
}