/**
* library configuration
*/
-static struct {
+typedef struct {
/** true if initialized */
switch_bool_t init;
/** Mapping of tag name to definition */
switch_hash_t *tag_defs;
/** library memory pool */
switch_memory_pool_t *pool;
-} globals;
+} nlsml_globals;
+static nlsml_globals globals = { 0 };
/**
* The node in the XML tree
int nomatch;
};
+/**
+ * Tag def destructor
+ */
+static void destroy_tag_def(void *ptr)
+{
+ struct tag_def *tag = (struct tag_def *) ptr;
+ if (tag->children_tags) {
+ switch_core_hash_destroy(&tag->children_tags);
+ }
+}
+
/**
* Add a definition for a tag
* @param tag the name
def->attribs_fn = attribs_fn;
def->cdata_fn = cdata_fn;
def->is_root = SWITCH_FALSE;
- switch_core_hash_insert(globals.tag_defs, tag, def);
+ switch_core_hash_insert_destructor(globals.tag_defs, tag, def, destroy_tag_def);
return def;
}
return 1;
}
+/**
+ * Destruction of NLSML parser environment
+ */
+void nlsml_destroy(void)
+{
+ if (globals.init) {
+ if (globals.tag_defs) {
+ switch_core_hash_destroy(&globals.tag_defs);
+ globals.tag_defs = NULL;
+ }
+ if (globals.pool) {
+ switch_core_destroy_memory_pool(&globals.pool);
+ globals.pool = NULL;
+ }
+ globals.init = SWITCH_FALSE;
+ }
+}
+
/* For Emacs:
* Local Variables:
* mode:c
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2013, Grasshopper
+ * Copyright (C) 2013-2014, Grasshopper
*
* Version: MPL 1.1
*
};
extern int nlsml_init(void);
+extern void nlsml_destroy(void);
enum nlsml_match_type nlsml_parse(const char *result, const char *uuid);
iks *nlsml_normalize(const char *result);
extern iks *nlsml_create_dtmf_match(const char *digits, const char *interpretation);
return SWITCH_STATUS_SUCCESS;
}
+/**
+ * Detector definition destructor
+ */
+static void destroy_detector(void *ptr)
+{
+ struct rayo_cpa_detector *detector = (struct rayo_cpa_detector *) ptr;
+ if (detector->signal_type_map) {
+ switch_core_hash_destroy(&detector->signal_type_map);
+ }
+}
+
/**
* Configure CPA
*/
/* add signal-type to detector mapping */
const char *signal_type_ns = switch_core_sprintf(pool, "%s%s:%s", RAYO_CPA_BASE, signal_type, RAYO_VERSION);
event_ok = 1;
- switch_core_hash_insert(globals.detectors, signal_type_ns, detector);
+ switch_core_hash_insert_destructor(globals.detectors, signal_type_ns, detector, destroy_detector);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding CPA %s => %s\n", signal_type_ns, detector->name);
}
*/
switch_status_t rayo_input_component_shutdown(void)
{
- srgs_parser_destroy(globals.parser);
switch_event_unbind_callback(on_detected_speech_event);
+ srgs_parser_destroy(globals.parser);
+ srgs_destroy();
+ nlsml_destroy();
+
rayo_cpa_component_shutdown();
return SWITCH_STATUS_SUCCESS;
*/
switch_status_t rayo_output_component_shutdown(void)
{
+ switch_core_hash_destroy(&fileman_globals.hash);
+
return SWITCH_STATUS_SUCCESS;
}
/**
* library configuration
*/
-static struct {
+typedef struct {
/** true if initialized */
switch_bool_t init;
/** Mapping of tag name to definition */
switch_hash_t *tag_defs;
/** library memory pool */
switch_memory_pool_t *pool;
-} globals;
+} srgs_globals;
+static srgs_globals globals = { 0 };
/**
* SRGS node types
return child;
}
+/**
+ * Tag def destructor
+ */
+static void destroy_tag_def(void *ptr)
+{
+ struct tag_def *tag = (struct tag_def *) ptr;
+ if (tag->children_tags) {
+ switch_core_hash_destroy(&tag->children_tags);
+ }
+}
+
/**
* Add a definition for a tag
* @param tag the name
def->attribs_fn = attribs_fn;
def->cdata_fn = cdata_fn;
def->is_root = SWITCH_FALSE;
- switch_core_hash_insert(globals.tag_defs, tag, def);
+ switch_core_hash_insert_destructor(globals.tag_defs, tag, def, destroy_tag_def);
return def;
}
switch_memory_pool_t *pool = parser->pool;
switch_hash_index_t *hi = NULL;
- /* clean up all cached grammars */
- for (hi = switch_core_hash_first(parser->cache); hi; hi = switch_core_hash_next(&hi)) {
- struct srgs_grammar *grammar = NULL;
- const void *key;
- void *val;
- switch_core_hash_this(hi, &key, NULL, &val);
- grammar = (struct srgs_grammar *)val;
- switch_assert(grammar);
- srgs_grammar_destroy(grammar);
+ if (parser->cache) {
+ /* clean up all cached grammars */
+ for (hi = switch_core_hash_first(parser->cache); hi; hi = switch_core_hash_next(&hi)) {
+ struct srgs_grammar *grammar = NULL;
+ const void *key;
+ void *val;
+ switch_core_hash_this(hi, &key, NULL, &val);
+ grammar = (struct srgs_grammar *)val;
+ switch_assert(grammar);
+ srgs_grammar_destroy(grammar);
+ }
+ switch_core_hash_destroy(&parser->cache);
}
switch_core_destroy_memory_pool(&pool);
}
return 1;
}
+/**
+ * Destruction of SRGS parser environment
+ */
+void srgs_destroy(void)
+{
+ if (globals.init) {
+ if (globals.tag_defs) {
+ switch_core_hash_destroy(&globals.tag_defs);
+ globals.tag_defs = NULL;
+ }
+ if (globals.pool) {
+ switch_core_destroy_memory_pool(&globals.pool);
+ globals.pool = NULL;
+ }
+ globals.init = SWITCH_FALSE;
+ }
+}
+
/* For Emacs:
* Local Variables:
* mode:c
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2013, Grasshopper
+ * Copyright (C) 2013-2014, Grasshopper
*
* Version: MPL 1.1
*
};
extern int srgs_init(void);
+extern void srgs_destroy(void);
extern struct srgs_parser *srgs_parser_new(const char *uuid);
extern struct srgs_grammar *srgs_parse(struct srgs_parser *parser, const char *document);
extern const char *srgs_grammar_to_regex(struct srgs_grammar *grammar);