/* * Oreka -- A media capture and retrieval platform * * Copyright (C) 2005, orecx LLC * * http://www.orecx.com * * This program is free software, distributed under the terms of * the GNU General Public License. * Please refer to http://www.gnu.org/copyleft/gpl.html * */ #pragma warning( disable: 4786 ) // disables truncated symbols in browse-info warning #define _WINSOCKAPI_ // prevents the inclusion of winsock.h #include "ace/OS_NS_dirent.h" #include "Utils.h" #include #include #include #include #include "serializers/DomSerializer.h" #include "ConfigManager.h" #define CONFIG_FILE_NAME "config.xml" #define ETC_CONFIG_FILE_NAME "/etc/orkaudio/config.xml" #ifdef WIN32 # define snprintf _snprintf #endif ConfigManager* ConfigManager::m_singleton = NULL; ConfigManager* ConfigManager::Instance() { if(m_singleton == NULL) { m_singleton = new ConfigManager(); } return m_singleton; } void ConfigManager::Initialize() { bool failed = false; m_configTopNode = NULL; try { char* cfgFilename = ""; char* cfgEnvPath = ""; int cfgAlloc = 0; cfgEnvPath = ACE_OS::getenv("ORKAUDIO_CONFIG_PATH"); if(cfgEnvPath) { ACE_DIR* dir = ACE_OS::opendir(cfgEnvPath); if(dir) { int len = 0; ACE_OS::closedir(dir); len = strlen(cfgEnvPath)+1+strlen(CONFIG_FILE_NAME)+1; cfgFilename = (char*)malloc(len); if(cfgFilename) { cfgAlloc = 1; snprintf(cfgFilename, len, "%s/%s", cfgEnvPath, CONFIG_FILE_NAME); } } } if(!cfgFilename || !strlen(cfgFilename)) { FILE* file = ACE_OS::fopen(CONFIG_FILE_NAME, "r"); if(file) { // config.xml exists in the current directory cfgFilename = CONFIG_FILE_NAME; fclose(file); } else { // config.xml could not be found in the current // directory, try to find it in system configuration directory cfgFilename = ETC_CONFIG_FILE_NAME; } } XMLPlatformUtils::Initialize(); // By default, the DOM document generated by the parser will be free() by the parser. // If we ever need to free the parser and the document separately, we need to do this: // DOMNode *doc = parser->getDocument(); // ... // parser->adoptDocument(); // doc->release(); // ... // delete parser; XercesDOMParser *m_parser = new XercesDOMParser; m_parser->parse(cfgFilename); DOMNode *doc = NULL; doc = m_parser->getDocument(); // XXX is it okay to free here? if(cfgAlloc) { free(cfgFilename); } if (doc) { DOMNode *firstChild = doc->getFirstChild(); if (firstChild) { m_configTopNode = firstChild; m_config.DeSerializeDom(firstChild); /* // Write out config to a file DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(XStr("Core").unicodeForm()); XERCES_CPP_NAMESPACE::DOMDocument* myDoc; myDoc = impl->createDocument( 0, // root element namespace URI. XStr("root").unicodeForm(), // root element name 0); // document type object (DTD). m_config.SerializeDom(myDoc); CStdString toto = DomSerializer::DomNodeToString(myDoc); FILE* file = fopen("zzz.xml", "w"); fwrite((PCSTR)toto,1,toto.GetLength(),file); fclose(file); */ } else { LOG4CXX_ERROR(LOG.configLog, CStdString("Could not parse config file:") + CONFIG_FILE_NAME); failed = true; } } else { LOG4CXX_WARN(LOG.configLog, CStdString("Could not find config file:") + CONFIG_FILE_NAME); } } catch (const CStdString& e) { LOG4CXX_ERROR(LOG.configLog, e); failed = true; } catch(const XMLException& e) { LOG4CXX_ERROR(LOG.configLog, e.getMessage()); failed = true; } if (failed) { exit(0); } } void ConfigManager::AddConfigureFunction(ConfigureFunction configureFunction) { m_configureFunctions.push_back(configureFunction); // Cal the external configure callback straight away configureFunction(m_configTopNode); }