]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
mod_rayo: add new config pause-when-offline - will pause inbound calling if there...
authorChris Rienzo <chris.rienzo@grasshopper.com>
Fri, 14 Mar 2014 19:50:21 +0000 (15:50 -0400)
committerChris Rienzo <chris.rienzo@grasshopper.com>
Fri, 14 Mar 2014 19:50:21 +0000 (15:50 -0400)
src/mod/event_handlers/mod_rayo/mod_rayo.c

index c70c8394a5a5a7721a503cc0510b4ecd10809f70..b1d405cc3633fb7b39967bbe6a0ffd5092074e01 100644 (file)
@@ -222,6 +222,8 @@ static struct {
        switch_thread_rwlock_t *shutdown_rwlock;
        /** if true, URI is put in from/to of offer if available */
        int offer_uri;
+       /** if true, pause inbound calling if all clients are offline */
+       int pause_when_offline;
 } globals;
 
 /**
@@ -1367,6 +1369,30 @@ struct rayo_component *_rayo_component_init(struct rayo_component *component, sw
        return component;
 }
 
+/**
+ * @return true if at least one rayo client is online
+ */
+static int is_rayo_client_online(void)
+{
+       int is_online = 0;
+       switch_hash_index_t *hi;
+
+       switch_mutex_lock(globals.clients_mutex);
+       
+       for (hi = switch_core_hash_first(globals.clients_roster); hi; hi = switch_core_hash_next(hi)) {
+               const void *key;
+               void *client;
+               switch_core_hash_this(hi, &key, NULL, &client);
+               switch_assert(client);
+               if (RAYO_CLIENT(client)->availability == PS_ONLINE) {
+                       is_online = 1;
+                       break;
+               }
+       }
+       switch_mutex_unlock(globals.clients_mutex);
+       return is_online;
+}
+
 /**
  * Send XMPP message to client
  */
@@ -1390,6 +1416,12 @@ static void rayo_client_cleanup(struct rayo_actor *actor)
                }
        }
        switch_mutex_unlock(globals.clients_mutex);
+
+       if (globals.pause_when_offline && !is_rayo_client_online()) {
+               /* pause inbound calling */
+               int32_t arg = 1;
+               switch_core_session_ctl(SCSC_PAUSE_INBOUND, &arg);
+       }
 }
 
 /**
@@ -1422,6 +1454,13 @@ static struct rayo_client *rayo_client_init(struct rayo_client *client, switch_m
                }
                switch_mutex_unlock(globals.clients_mutex);
        }
+
+       if (globals.pause_when_offline && is_rayo_client_online()) {
+               /* resume inbound calling */
+               int32_t arg = 0;
+               switch_core_session_ctl(SCSC_PAUSE_INBOUND, &arg);
+       }
+
        return client;
 }
 
@@ -2782,6 +2821,18 @@ static void on_client_presence(struct rayo_client *rclient, iks *node)
                RAYO_DESTROY(rclient);
                RAYO_UNLOCK(rclient);
        }
+
+       if (globals.pause_when_offline) {
+               if (is_rayo_client_online()) {
+                       /* resume inbound calling */
+                       int32_t arg = 0;
+                       switch_core_session_ctl(SCSC_PAUSE_INBOUND, &arg);
+               } else {
+                       /* pause inbound calling */
+                       int32_t arg = 1;
+                       switch_core_session_ctl(SCSC_PAUSE_INBOUND, &arg);
+               }
+       }
 }
 
 /**
@@ -3769,6 +3820,7 @@ static switch_status_t do_config(switch_memory_pool_t *pool, const char *config_
        globals.mixer_conf_profile = "sla";
        globals.num_message_threads = 8;
        globals.offer_uri = 1;
+       globals.pause_when_offline = 0;
 
        /* get params */
        {
@@ -3801,6 +3853,10 @@ static switch_status_t do_config(switch_memory_pool_t *pool, const char *config_
                                        if (switch_false(val)) {
                                                globals.offer_uri = 0;
                                        }
+                               } else if (!strcasecmp(var, "pause-when-offline")) {
+                                       if (switch_true(val)) {
+                                               globals.pause_when_offline = 1;
+                                       }
                                } else {
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Unsupported param: %s\n", var);
                                }