]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-5231 --resolve
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 27 Mar 2013 17:41:17 +0000 (12:41 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 27 Mar 2013 17:41:17 +0000 (12:41 -0500)
src/include/switch_ivr.h
src/mod/applications/mod_commands/mod_commands.c
src/switch_ivr.c

index e4e8517781f6ea3f4f2e776939d0c835a1a04d03..daa97cc36476a30ea9746f82f95aa600075a140e 100644 (file)
@@ -591,6 +591,15 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_nomedia(const char *uuid, switch_medi
 */
 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
index a560e7f905af61d33bd3cef321168aa2b2561478..62fa59a6b99156d06a578e5d4fa157b4d14d136b 100644 (file)
@@ -3184,7 +3184,7 @@ SWITCH_STANDARD_API(sched_broadcast_function)
        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 };
@@ -3200,6 +3200,8 @@ SWITCH_STANDARD_API(uuid_hold_function)
        } 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);
                }
index c57ace9be49b3b6bd40324741c7ff4ee35e0449d..8256b861b40aae5ec4344e12f41ffdc4e9747c1a 100644 (file)
@@ -1445,6 +1445,28 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_hold_uuid(const char *uuid, const cha
        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 };