static switch_status_t dialplan_xml_locate(switch_core_session_t *session, switch_caller_profile_t *caller_profile, switch_xml_t *root, switch_xml_t *node) { switch_channel_t *channel = switch_core_session_get_channel(session); switch_status_t status = SWITCH_STATUS_GENERR; switch_event_t *params = NULL; switch_event_create(¶ms, SWITCH_EVENT_REQUEST_PARAMS); switch_assert(params); switch_channel_event_set_data(channel, params); switch_caller_profile_event_set_data(caller_profile, "Hunt", params); status = switch_xml_locate("dialplan", NULL, NULL, NULL, root, node, params, SWITCH_FALSE); switch_event_destroy(¶ms); return status; }
static switch_event_t *chatplan_hunt(switch_event_t *event) { switch_event_t *extension = NULL; switch_xml_t alt_root = NULL, cfg, xml = NULL, xcontext, xexten = NULL; const char *alt_path; const char *context; const char *from; const char *to; if (!(context = switch_event_get_header(event, "context"))) { context = "default"; } if (!(from = switch_event_get_header(event, "from_user"))) { from = switch_event_get_header(event, "from"); } if (!(to = switch_event_get_header(event, "to_user"))) { to = switch_event_get_header(event, "to"); } alt_path = switch_event_get_header(event, "alt_path"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Processing text message %s->%s in context %s\n", from, to, context); /* get our handle to the "chatplan" section of the config */ if (!zstr(alt_path)) { switch_xml_t conf = NULL, tag = NULL; if (!(alt_root = switch_xml_parse_file_simple(alt_path))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Open of [%s] failed\n", alt_path); goto done; } if ((conf = switch_xml_find_child(alt_root, "section", "name", "chatplan")) && (tag = switch_xml_find_child(conf, "chatplan", NULL, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Getting chatplan from alternate path: %s\n", alt_path); xml = alt_root; cfg = tag; } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Open of chatplan failed\n"); goto done; } } else { if (switch_xml_locate("chatplan", NULL, NULL, NULL, &xml, &cfg, event, SWITCH_FALSE) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Open of chatplan failed\n"); goto done; } } /* get a handle to the context tag */ if (!(xcontext = switch_xml_find_child(cfg, "context", "name", context))) { if (!(xcontext = switch_xml_find_child(cfg, "context", "name", "global"))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Context %s not found\n", context); goto done; } } xexten = switch_xml_child(xcontext, "extension"); while (xexten) { int proceed = 0; const char *cont = switch_xml_attr(xexten, "continue"); const char *exten_name = switch_xml_attr(xexten, "name"); if (!exten_name) { exten_name = "UNKNOWN"; } switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_DEBUG, "Chatplan: %s parsing [%s->%s] continue=%s\n", to, context, exten_name, cont ? cont : "false"); proceed = parse_exten(event, xexten, &extension); if (proceed && !switch_true(cont)) { break; } xexten = xexten->next; } switch_xml_free(xml); xml = NULL; done: switch_xml_free(xml); return extension; }