/** Load RTSP settings */ static apt_bool_t unimrcp_client_rtsp_settings_load(unimrcp_client_loader_t *loader, const apr_xml_elem *root, const char *id) { const apr_xml_elem *elem; mrcp_sig_settings_t *settings = mrcp_signaling_settings_alloc(loader->pool); settings->resource_location = DEFAULT_RESOURCE_LOCATION; apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Loading RTSP Settings <%s>",id); for(elem = root->first_child; elem; elem = elem->next) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Loading Element <%s>",elem->name); if(strcasecmp(elem->name,"server-ip") == 0) { settings->server_ip = unimrcp_client_ip_address_get(loader,elem,loader->server_ip); } else if(strcasecmp(elem->name,"server-port") == 0) { if(is_cdata_valid(elem) == TRUE) { settings->server_port = (apr_port_t)atol(cdata_text_get(elem)); } } else if(strcasecmp(elem->name,"force-destination") == 0) { if(is_cdata_valid(elem) == TRUE) { settings->force_destination = cdata_bool_get(elem); } } else if(strcasecmp(elem->name,"resource-location") == 0) { if(is_cdata_valid(elem) == TRUE) { settings->resource_location = cdata_copy(elem,loader->pool); } else { settings->resource_location = ""; } } else if(strcasecmp(elem->name,"resource-map") == 0) { const apr_xml_attr *name_attr; const apr_xml_attr *value_attr; const apr_xml_elem *child_elem; apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Loading Resource Map"); for(child_elem = elem->first_child; child_elem; child_elem = child_elem->next) { if(name_value_attribs_get(child_elem,&name_attr,&value_attr) == TRUE) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Loading Param %s:%s",name_attr->value,value_attr->value); apr_table_set(settings->resource_map,name_attr->value,value_attr->value); } } } else { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Unknown Element <%s>",elem->name); } } if(!settings->server_ip) { settings->server_ip = apr_pstrdup(loader->pool,loader->server_ip); } apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Create RTSP Settings %s:%hu",settings->server_ip,settings->server_port); return mrcp_client_signaling_settings_register(loader->client,settings,id); }
/** Load SIP settings */ static apt_bool_t unimrcp_client_sip_settings_load(unimrcp_client_loader_t *loader, const apr_xml_elem *root, const char *id) { const apr_xml_elem *elem; mrcp_sig_settings_t *settings = mrcp_signaling_settings_alloc(loader->pool); apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Loading SIP Settings <%s>",id); for(elem = root->first_child; elem; elem = elem->next) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Loading Element <%s>",elem->name); if(strcasecmp(elem->name,"server-ip") == 0) { settings->server_ip = unimrcp_client_ip_address_get(loader,elem,loader->server_ip); } else if(strcasecmp(elem->name,"server-port") == 0) { if(is_cdata_valid(elem) == TRUE) { settings->server_port = (apr_port_t)atol(cdata_text_get(elem)); } } else if(strcasecmp(elem->name,"server-username") == 0) { if(is_cdata_valid(elem) == TRUE) { settings->user_name = cdata_copy(elem,loader->pool); } } else if(strcasecmp(elem->name,"force-destination") == 0) { if(is_cdata_valid(elem) == TRUE) { settings->force_destination = cdata_bool_get(elem); } } else if(strcasecmp(elem->name,"feature-tags") == 0) { if(is_cdata_valid(elem) == TRUE) { settings->feature_tags = cdata_copy(elem,loader->pool); } } else { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Unknown Element <%s>",elem->name); } } if(!settings->server_ip) { settings->server_ip = apr_pstrdup(loader->pool,loader->server_ip); } apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Create SIP Settings %s:%hu",settings->server_ip,settings->server_port); return mrcp_client_signaling_settings_register(loader->client,settings,id); }
/* --- MRCP CLIENT --- */ static int load_profiles(mrcp_client_t *client, mrcp_connection_agent_t *shared_connection_agent, mpf_engine_t *shared_media_engine, apr_pool_t *pool) { apr_hash_index_t *hi; for (hi = apr_hash_first(NULL, globals.profiles); hi; hi = apr_hash_next(hi)) { const char *k; ast_mrcp_profile_t *v; const void *key; void *val; apr_hash_this(hi, &key, NULL, &val); k = (const char *)key; v = (ast_mrcp_profile_t *)val; if (v == NULL) continue; ast_log(LOG_DEBUG, "Processing profile %s:%s\n", k, v->version); /* A profile is a signaling agent + termination factory + media engine + connection agent (MRCPv2 only). */ mrcp_sig_agent_t *agent = NULL; mpf_termination_factory_t *termination_factory = NULL; mrcp_profile_t * mprofile = NULL; mpf_rtp_config_t *rtp_config = NULL; mpf_rtp_settings_t *rtp_settings = mpf_rtp_settings_alloc(pool); mrcp_sig_settings_t *sig_settings = mrcp_signaling_settings_alloc(pool); ast_mrcp_profile_t *mod_profile = NULL; mrcp_connection_agent_t *connection_agent = NULL; mpf_engine_t *media_engine = shared_media_engine; /* Get profile attributes. */ const char *name = apr_pstrdup(pool, k); const char *version = apr_pstrdup(pool, v->version); if ((name == NULL) || (strlen(name) == 0) || (version == NULL) || (strlen(version) == 0)) { ast_log(LOG_ERROR, "Profile %s missing name or version attribute\n", k); return -1; } // i6net Get the profile set before from the configuration file. mod_profile = (ast_mrcp_profile_t *)apr_hash_get(globals.profiles, name, APR_HASH_KEY_STRING); /* Create RTP config, common to MRCPv1 and MRCPv2. */ if ((rtp_config = mpf_rtp_config_alloc(pool)) == NULL) { ast_log(LOG_ERROR, "Unable to create RTP configuration\n"); return -1; } rtp_config->rtp_port_min = DEFAULT_RTP_PORT_MIN; rtp_config->rtp_port_max = DEFAULT_RTP_PORT_MAX; apt_string_set(&rtp_config->ip, DEFAULT_LOCAL_IP_ADDRESS); if (strcmp("1", version) == 0) { /* MRCPv1 configuration. */ rtsp_client_config_t *config = mrcp_unirtsp_client_config_alloc(pool); if (config == NULL) { ast_log(LOG_ERROR, "Unable to create RTSP configuration\n"); return -1; } config->origin = DEFAULT_SDP_ORIGIN; if (globals.unimrcp_request_timeout != NULL) { config->request_timeout = (apr_size_t)atol(globals.unimrcp_request_timeout); } sig_settings->resource_location = DEFAULT_RESOURCE_LOCATION; ast_log(LOG_DEBUG, "Loading MRCPv1 profile: %s\n", name); apr_hash_index_t *hicfg; for (hicfg = apr_hash_first(NULL, v->cfg); hicfg; hicfg = apr_hash_next(hicfg)) { const char *param_name; const char *param_value; const void *keyc; void *valc; apr_hash_this(hicfg, &keyc, NULL, &valc); param_name = (const char *)keyc; param_value = (const char *)valc; if ((param_name != NULL) && (param_value != NULL)) { if (strlen(param_name) == 0) { ast_log(LOG_ERROR, "Missing parameter name\n"); return -1; } ast_log(LOG_DEBUG, "Loading parameter %s:%s\n", param_name, param_value); if ((!process_mrcpv1_config(config, sig_settings, param_name, param_value, pool)) && (!process_rtp_config(client, rtp_config, rtp_settings, param_name, param_value, pool)) && (!process_profile_config(mod_profile, param_name, param_value, pool))) { ast_log(LOG_WARNING, "Unknown parameter %s\n", param_name); } } } agent = mrcp_unirtsp_client_agent_create(name, config, pool); } else if (strcmp("2", version) == 0) { /* MRCPv2 configuration. */ mrcp_sofia_client_config_t *config = mrcp_sofiasip_client_config_alloc(pool); if (config == NULL) { ast_log(LOG_ERROR, "Unable to create SIP configuration\n"); return -1; } config->local_ip = DEFAULT_LOCAL_IP_ADDRESS; config->local_port = DEFAULT_SIP_LOCAL_PORT; sig_settings->server_ip = DEFAULT_REMOTE_IP_ADDRESS; sig_settings->server_port = DEFAULT_SIP_REMOTE_PORT; config->ext_ip = NULL; config->user_agent_name = DEFAULT_SOFIASIP_UA_NAME; config->origin = DEFAULT_SDP_ORIGIN; ast_log(LOG_DEBUG, "Loading MRCPv2 profile: %s\n", name); apr_hash_index_t *hicfg; for (hicfg = apr_hash_first(NULL, v->cfg); hicfg; hicfg = apr_hash_next(hicfg)) { const char *param_name; const char *param_value; const void *keyc; void *valc; apr_hash_this(hicfg, &keyc, NULL, &valc); param_name = (const char *)keyc; param_value = (const char *)valc; if ((param_name != NULL) && (param_value != NULL)) { if (strlen(param_name) == 0) { ast_log(LOG_ERROR, "Missing parameter name\n"); return -1; } ast_log(LOG_DEBUG, "Loading parameter %s:%s\n", param_name, param_value); if ((!process_mrcpv2_config(config, sig_settings, param_name, param_value, pool)) && (!process_rtp_config(client, rtp_config, rtp_settings, param_name, param_value, pool)) && (!process_profile_config(mod_profile, param_name, param_value, pool))) { ast_log(LOG_WARNING, "Unknown parameter %s\n", param_name); } } } agent = mrcp_sofiasip_client_agent_create(name, config, pool); connection_agent = shared_connection_agent; } else { ast_log(LOG_ERROR, "Version must be either \"1\" or \"2\"\n"); return -1; } if ((termination_factory = mpf_rtp_termination_factory_create(rtp_config, pool)) != NULL) mrcp_client_rtp_factory_register(client, termination_factory, name); mrcp_client_rtp_settings_register(client, rtp_settings, "RTP-Settings"); mrcp_client_signaling_settings_register(client, sig_settings, "Signalling-Settings"); if (agent != NULL) mrcp_client_signaling_agent_register(client, agent); /* Create the profile and register it. */ if ((mprofile = mrcp_client_profile_create(NULL, agent, connection_agent, media_engine, termination_factory, rtp_settings, sig_settings, pool)) != NULL) { if (!mrcp_client_profile_register(client, mprofile, name)) ast_log(LOG_WARNING, "Unable to register MRCP client profile\n"); } } return 0; }