*/
SWITCH_DECLARE(switch_status_t) switch_ivr_hold_uuid(const char *uuid, const char *message, switch_bool_t moh);
+/*!
+ \brief Toggles channel hold state of session
+ \param uuid the uuid of the session to hold
+ \param message optional message
+ \param moh play music-on-hold
+ \return SWITCH_STATUS_SUCCESS if all is well
+*/
+SWITCH_DECLARE(switch_status_t) switch_ivr_hold_toggle_uuid(const char *uuid, const char *message, switch_bool_t moh);
+
/*!
\brief Signal the session with a protocol specific unhold message.
\param uuid the uuid of the session to hold
return SWITCH_STATUS_SUCCESS;
}
-#define HOLD_SYNTAX "[off] <uuid> [<display>]"
+#define HOLD_SYNTAX "[off|toggle] <uuid> [<display>]"
SWITCH_STANDARD_API(uuid_hold_function)
{
char *mycmd = NULL, *argv[4] = { 0 };
} else {
if (!strcasecmp(argv[0], "off")) {
status = switch_ivr_unhold_uuid(argv[1]);
+ } else if (!strcasecmp(argv[0], "toggle")) {
+ status = switch_ivr_hold_toggle_uuid(argv[1], argv[2], 1);
} else {
status = switch_ivr_hold_uuid(argv[0], argv[1], 1);
}
return SWITCH_STATUS_SUCCESS;
}
+SWITCH_DECLARE(switch_status_t) switch_ivr_hold_toggle_uuid(const char *uuid, const char *message, switch_bool_t moh)
+{
+ switch_core_session_t *session;
+ switch_channel_t *channel;
+ switch_channel_callstate_t callstate;
+
+ if ((session = switch_core_session_locate(uuid))) {
+ if ((channel = switch_core_session_get_channel(session))) {
+ callstate = switch_channel_get_callstate(channel);
+
+ if (callstate == CCS_ACTIVE) {
+ switch_ivr_hold(session, message, moh);
+ } else if (callstate == CCS_HELD) {
+ switch_ivr_unhold(session);
+ }
+ }
+ switch_core_session_rwunlock(session);
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
SWITCH_DECLARE(switch_status_t) switch_ivr_unhold(switch_core_session_t *session)
{
switch_core_session_message_t msg = { 0 };