/** Load UniMRCP client */ static apt_bool_t unimrcp_client_load(unimrcp_client_loader_t *loader, const char *dir_path, const char *file_name, apr_pool_t *pool) { apr_xml_doc *doc; const apr_xml_elem *elem; const apr_xml_elem *root; const apr_xml_attr *attr; const char *file_path; const char *version = NULL; const char *subfolder = NULL; if(!dir_path || !file_name) { return FALSE; } if(*dir_path == '\0') { file_path = file_name; } else { file_path = apr_psprintf(pool,"%s/%s",dir_path,file_name); } /* Parse XML document */ doc = unimrcp_client_doc_parse(file_path,pool); if(!doc) { return FALSE; } root = doc->root; /* Match document name */ if(!root || strcasecmp(root->name,"unimrcpclient") != 0) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Unknown Document <%s>",root->name); return FALSE; } /* Read attributes */ for(attr = root->attr; attr; attr = attr->next) { if(strcasecmp(attr->name,"version") == 0) { version = attr->value; } else if(strcasecmp(attr->name,"subfolder") == 0) { subfolder = attr->value; } } /* Check version number first */ if(!version) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Unknown Version"); return FALSE; } loader->doc = doc; /* Navigate through document */ for(elem = root->first_child; elem; elem = elem->next) { if(strcasecmp(elem->name,"properties") == 0) { unimrcp_client_properties_load(loader,elem); } else if(strcasecmp(elem->name,"components") == 0) { unimrcp_client_components_load(loader,elem); } else if(strcasecmp(elem->name,"settings") == 0) { unimrcp_client_settings_load(loader,elem); } else if(strcasecmp(elem->name,"profiles") == 0) { unimrcp_client_profiles_load(loader,elem); } else { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Unknown Element <%s>",elem->name); } } if(subfolder && subfolder != '\0') { apr_dir_t *dir; apr_finfo_t finfo; apr_status_t rv; dir_path = apr_psprintf(pool,"%s/%s",dir_path,subfolder); apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Enter Directory [%s]",dir_path); rv = apr_dir_open(&dir,dir_path,pool); if(rv == APR_SUCCESS) { while(apr_dir_read(&finfo, APR_FINFO_NAME, dir) == APR_SUCCESS) { if(apr_fnmatch("*.xml", finfo.name, 0) == APR_SUCCESS) { unimrcp_client_load(loader,dir_path,finfo.name,pool); } } apr_dir_close(dir); apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Leave Directory [%s]",dir_path); } else { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"No Such Directory %s",dir_path); } } return TRUE; }
/** Process parsed XML document */ static apt_bool_t unimrcp_client_doc_process(unimrcp_client_loader_t *loader, const char *dir_path, apr_xml_doc *doc, apr_pool_t *pool) { const apr_xml_elem *elem; const apr_xml_elem *root; const apr_xml_attr *attr; const char *version = NULL; const char *subfolder = NULL; if(!doc) { return FALSE; } root = doc->root; /* Match document name */ if(!root || strcasecmp(root->name,"unimrcpclient") != 0) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Unknown Document <%s>",root ? root->name : "null"); return FALSE; } /* Read attributes */ for(attr = root->attr; attr; attr = attr->next) { if(strcasecmp(attr->name,"version") == 0) { version = attr->value; } else if(strcasecmp(attr->name,"subfolder") == 0) { subfolder = attr->value; } } /* Check version number first */ if(!version) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Unknown Version"); return FALSE; } loader->doc = doc; /* Navigate through document */ for(elem = root->first_child; elem; elem = elem->next) { if(strcasecmp(elem->name,"properties") == 0) { unimrcp_client_properties_load(loader,elem); } else if(strcasecmp(elem->name,"components") == 0) { unimrcp_client_components_load(loader,elem); } else if(strcasecmp(elem->name,"settings") == 0) { unimrcp_client_settings_load(loader,elem); } else if(strcasecmp(elem->name,"profiles") == 0) { unimrcp_client_profiles_load(loader,elem); } else if(strcasecmp(elem->name,"misc") == 0) { unimrcp_client_misc_load(loader,elem); } else { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Unknown Element <%s>",elem->name); } } if(subfolder && *subfolder != '\0') { apr_dir_t *dir; apr_finfo_t finfo; apr_status_t rv; char *subdir_path; if (!dir_path) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Attempt to Process Subdirectory when " "Creating from Config String"); return TRUE; } if(apr_filepath_merge(&subdir_path,dir_path,subfolder,APR_FILEPATH_NATIVE,pool) == APR_SUCCESS) { apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Enter Directory [%s]",subdir_path); rv = apr_dir_open(&dir,subdir_path,pool); if(rv == APR_SUCCESS) { while(apr_dir_read(&finfo, APR_FINFO_NAME, dir) == APR_SUCCESS) { if(apr_fnmatch("*.xml", finfo.name, 0) == APR_SUCCESS) { unimrcp_client_load(loader,subdir_path,finfo.name); } } apr_dir_close(dir); apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Leave Directory [%s]",dir_path); } else { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"No Such Directory %s",dir_path); } } } return TRUE; }