]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-5850 --resolve Thanks
authorMarc Olivier Chouinard <mochouinard@moctel.com>
Thu, 28 Nov 2013 06:28:00 +0000 (01:28 -0500)
committerMarc Olivier Chouinard <mochouinard@moctel.com>
Thu, 28 Nov 2013 06:28:00 +0000 (01:28 -0500)
src/mod/applications/mod_callcenter/mod_callcenter.c

index cd8ed15dbc104c85dfdb3083daaf0cc0f822f037..785d44bc5eafb5440d111ac35a2fb637956b24e3 100644 (file)
@@ -1249,13 +1249,74 @@ end:
        return SWITCH_STATUS_SUCCESS;
 }
 
+static switch_status_t load_tier(const char *queue, const char *agent, const char *level, const char *position)
+{
+       /* Hack to check if an tier already exist */
+       if (cc_tier_update("unknown", "unknown", queue, agent) == CC_STATUS_TIER_NOT_FOUND) {
+                       if (level && position) {
+                               cc_tier_add(queue, agent, cc_tier_state2str(CC_TIER_STATE_READY), atoi(level), atoi(position));
+                       } else {
+                               /* default to level 1 and position 1 within the level */
+                               cc_tier_add(queue, agent, cc_tier_state2str(CC_TIER_STATE_READY), 0, 0);
+                       }
+       } else {
+               if (level) {
+                       cc_tier_update("level", level, queue, agent);
+               }
+               if (position) {
+                       cc_tier_update("position", position, queue, agent);
+               }
+       }
+       return SWITCH_STATUS_SUCCESS;
+}
+
+static switch_status_t load_tiers(switch_bool_t load_all, const char *queue_name, const char *agent_name)
+{
+       switch_xml_t x_tiers, x_tier, cfg, xml;
+       switch_status_t result = SWITCH_STATUS_FALSE;
+
+       if (!(xml = switch_xml_open_cfg(global_cf, &cfg, NULL))) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Open of %s failed\n", global_cf);
+               return SWITCH_STATUS_FALSE;
+       }
+
+       if (!(x_tiers = switch_xml_child(cfg, "tiers"))) {
+               goto end;
+       }
+
+       /* Importing from XML config Agent Tiers */
+       for (x_tier = switch_xml_child(x_tiers, "tier"); x_tier; x_tier = x_tier->next) {
+               const char *agent = switch_xml_attr(x_tier, "agent");
+               const char *queue = switch_xml_attr(x_tier, "queue");
+               const char *level = switch_xml_attr(x_tier, "level");
+               const char *position = switch_xml_attr(x_tier, "position");
+               if (load_all == SWITCH_TRUE) {
+                       result = load_tier(queue, agent, level, position);
+               } else if (!zstr(agent_name) && !zstr(queue_name) && !strcasecmp(agent, agent_name) && !strcasecmp(queue, queue_name)) {
+                       result = load_tier(queue, agent, level, position);
+               } else if (zstr(agent_name) && !strcasecmp(queue, queue_name)) {
+                       result = load_tier(queue, agent, level, position);
+               } else if (zstr(queue_name) && !strcasecmp(agent, agent_name)) {
+                       result = load_tier(queue, agent, level, position);
+               }
+       }
+
+end:
+
+       if (xml) {
+               switch_xml_free(xml);
+       }
+
+       return result;
+}
+
 static switch_status_t load_config(void)
 {
        switch_status_t status = SWITCH_STATUS_SUCCESS;
-       switch_xml_t cfg, xml, settings, param, x_queues, x_queue, x_agents, x_agent, x_tiers, x_tier;
+       switch_xml_t cfg, xml, settings, param, x_queues, x_queue, x_agents, x_agent;
        switch_cache_db_handle_t *dbh = NULL;
        char *sql = NULL;
-       
+
        if (!(xml = switch_xml_open_cfg(global_cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Open of %s failed\n", global_cf);
                status = SWITCH_STATUS_TERM;
@@ -1323,32 +1384,7 @@ static switch_status_t load_config(void)
        }
 
        /* Importing from XML config Agent Tiers */
-       if ((x_tiers = switch_xml_child(cfg, "tiers"))) {
-               for (x_tier = switch_xml_child(x_tiers, "tier"); x_tier; x_tier = x_tier->next) {
-                       const char *agent = switch_xml_attr(x_tier, "agent");
-                       const char *queue_name = switch_xml_attr(x_tier, "queue");
-                       const char *level = switch_xml_attr(x_tier, "level");
-                       const char *position = switch_xml_attr(x_tier, "position");
-                       if (agent && queue_name) {
-                               /* Hack to check if an tier already exist */
-                               if (cc_tier_update("unknown", "unknown", queue_name, agent) == CC_STATUS_TIER_NOT_FOUND) {
-                                       if (level && position) {
-                                               cc_tier_add(queue_name, agent, cc_tier_state2str(CC_TIER_STATE_READY), atoi(level), atoi(position));
-                                       } else {
-                                               /* default to level 1 and position 1 within the level */
-                                               cc_tier_add(queue_name, agent, cc_tier_state2str(CC_TIER_STATE_READY), 0, 0);
-                                       }
-                               } else {
-                                       if (level) {
-                                               cc_tier_update("level", level, queue_name, agent);
-                                       }
-                                       if (position) {
-                                               cc_tier_update("position", position, queue_name, agent);
-                                       }
-                               }
-                       }
-               }
-       }
+       load_tiers(SWITCH_TRUE, NULL, NULL);
 
 end:
        switch_mutex_unlock(globals.mutex);
@@ -2736,6 +2772,7 @@ static int list_result_callback(void *pArg, int argc, char **argv, char **column
 #define CC_CONFIG_API_SYNTAX "callcenter_config <target> <args>,\n"\
 "\tcallcenter_config agent add [name] [type] | \n" \
 "\tcallcenter_config agent del [name] | \n" \
+"\tcallcenter_config agent reload [name] | \n" \
 "\tcallcenter_config agent set status [agent_name] [status] | \n" \
 "\tcallcenter_config agent set state [agent_name] [state] | \n" \
 "\tcallcenter_config agent set contact [agent_name] [contact] | \n" \
@@ -2752,6 +2789,7 @@ static int list_result_callback(void *pArg, int argc, char **argv, char **column
 "\tcallcenter_config tier set level [queue_name] [agent_name] [level] | \n" \
 "\tcallcenter_config tier set position [queue_name] [agent_name] [position] | \n" \
 "\tcallcenter_config tier del [queue_name] [agent_name] | \n" \
+"\tcallcenter_config tier reload [queue_name] [agent_name] | \n" \
 "\tcallcenter_config tier list | \n" \
 "\tcallcenter_config queue load [queue_name] | \n" \
 "\tcallcenter_config queue unload [queue_name] | \n" \
@@ -2837,6 +2875,22 @@ SWITCH_STANDARD_API(cc_config_api_function)
                                }
                        }
 
+               } else if (action && !strcasecmp(action, "reload")) {
+                       if (argc-initial_argc < 1) {
+                               stream->write_function(stream, "%s", "-ERR Invalid!\n");
+                               goto done;
+                       } else {
+                               const char *agent = argv[0 + initial_argc];
+                               switch (load_agent(agent)) {
+                                       case SWITCH_STATUS_SUCCESS:
+                                               stream->write_function(stream, "%s", "+OK\n");
+                                               break;
+                                       default:
+                                               stream->write_function(stream, "%s", "-ERR Unknown Error!\n");
+                                               goto done;
+                               }
+                       }
+
                } else if (action && !strcasecmp(action, "set")) {
                        if (argc-initial_argc < 3) {
                                stream->write_function(stream, "%s", "-ERR Invalid!\n");
@@ -3002,6 +3056,28 @@ SWITCH_STANDARD_API(cc_config_api_function)
                                }
                        }
 
+               } else if (action && !strcasecmp(action, "reload")) {
+                       if (argc-initial_argc < 1) {
+                               stream->write_function(stream, "%s", "-ERR Invalid!\n");
+                               goto done;
+                       } else {
+                               const char *queue = argv[0 + initial_argc];
+                               const char *agent = argv[1 + initial_argc];
+                               switch_bool_t load_all = SWITCH_FALSE;
+                               if (!strcasecmp(queue, "all")) {
+                                       load_all = SWITCH_TRUE;
+                               }
+                               switch (load_tiers(load_all, queue, agent)) {
+                                       case SWITCH_STATUS_SUCCESS:
+                                               stream->write_function(stream, "%s", "+OK\n");
+                                               break;
+                                       default:
+                                               stream->write_function(stream, "%s", "-ERR Unknown Error!\n");
+                                               goto done;
+
+                               }
+                       }
+
                } else if (action && !strcasecmp(action, "list")) {
                        struct list_result cbt;
                        cbt.row_process = 0;
@@ -3194,6 +3270,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_callcenter_load)
 
        switch_console_set_complete("add callcenter_config agent add");
        switch_console_set_complete("add callcenter_config agent del");
+       switch_console_set_complete("add callcenter_config agent reload");
        switch_console_set_complete("add callcenter_config agent set status");
        switch_console_set_complete("add callcenter_config agent set state");
        switch_console_set_complete("add callcenter_config agent set uuid");
@@ -3207,6 +3284,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_callcenter_load)
 
        switch_console_set_complete("add callcenter_config tier add");
        switch_console_set_complete("add callcenter_config tier del");
+       switch_console_set_complete("add callcenter_config tier reload");
        switch_console_set_complete("add callcenter_config tier set state");
        switch_console_set_complete("add callcenter_config tier set level");
        switch_console_set_complete("add callcenter_config tier set position");