X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FConfig%2FConfig_XMLReader.cpp;h=4cd1149f8db927c8669506b1507e5b22cebbcb33;hb=b5893b0a30fac08134c24de4565cb513a43affa6;hp=658d62478a0bba00239e3a6ac2eaf625fd4b554f;hpb=24a99a1363325ac341314c3f2e18326841940fb7;p=modules%2Fshaper.git diff --git a/src/Config/Config_XMLReader.cpp b/src/Config/Config_XMLReader.cpp index 658d62478..4cd1149f8 100644 --- a/src/Config/Config_XMLReader.cpp +++ b/src/Config/Config_XMLReader.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + /* * Config_XMLReader.cpp * @@ -6,162 +8,203 @@ */ #include +#include +#include +#include +#include + +#include +#include +#include +#include -#include +#include -#include -#include #ifdef WIN32 -//For GetModuleFileNameW -#include +#pragma warning(disable : 4996) // for getenv #endif #ifdef _DEBUG #include #endif -static bool IsNode(xmlNodePtr theNode, const char* theNodeName) +#ifdef WIN32 + static const char FSEP = '\\'; +#else + static const char FSEP = '/'; +#endif + +Config_XMLReader::Config_XMLReader(const std::string& theXmlFileName) + : myXmlDoc(NULL) { - return theNode->type == XML_ELEMENT_NODE - && !xmlStrcmp(theNode->name, (const xmlChar *) theNodeName); -} + std::string prefix = ""; + Config_Prop* aProp = Config_PropManager::findProp("Plugins", "default_path"); + if (aProp) + prefix = aProp->value(); + /* + * Get path to *.xml files (typically ./bin/../plugins/) -const static char* FEATURE_ID = "id"; -const static char* FEATURE_TEXT = "text"; -const static char* FEATURE_TOOLTIP = "tooltip"; -const static char* FEATURE_ICON = "icon"; -const static char* FEATURE_KEYSEQUENCE = "keysequence"; -const static char* FEATURE_GROUP_NAME = "name"; + * the problem: application may be launched using python executable, + * to use environment variable (at least for the current moment) + */ + if (prefix.empty()) + prefix = pluginConfigFile(); -Config_XMLReader::Config_XMLReader(const std::string& theXmlFile) -{ - setDocumentPath(theXmlFile); + myDocumentPath = prefix + FSEP + theXmlFileName; + std::ifstream aTestFile(myDocumentPath); + if (!aTestFile) + Events_InfoMessage("Config_XMLReader", "Unable to open %1").arg(myDocumentPath).send(); + aTestFile.close(); } Config_XMLReader::~Config_XMLReader() { + xmlFreeDoc(myXmlDoc); +} + +std::string Config_XMLReader::pluginConfigFile() +{ + std::string aValue; + char* anEnv = getenv("SHAPER_ROOT_DIR"); + if (anEnv) { + aValue = std::string(anEnv) + + FSEP + "share" + FSEP + "salome" + FSEP + "resources" + FSEP + "shaper"; + } else { + anEnv = getenv("OPENPARTS_ROOT_DIR"); + if (anEnv) { + aValue = std::string(anEnv) + FSEP + "plugins"; + } + } + return aValue; } -std::string Config_XMLReader::documentPath() const +void Config_XMLReader::readAll() { - return m_DocumentPath; + // to load external modules dependencies (like GEOm for Connector Feature + Config_ModuleReader::loadScript("salome.shaper.initConfig", false); + + xmlNodePtr aRoot = findRoot(); + readRecursively(aRoot); } -void Config_XMLReader::setDocumentPath(std::string documentPath) +void Config_XMLReader::processNode(xmlNodePtr theNode) { - std::string prefix; -#ifdef WIN32 - HMODULE hModule = GetModuleHandleW(NULL); - WCHAR wchar_path[MAX_PATH]; - GetModuleFileNameW(hModule, wchar_path, MAX_PATH); - char char_path[MAX_PATH]; - char DefChar = ' '; - WideCharToMultiByte(CP_ACP, 0, wchar_path, -1, char_path, MAX_PATH, &DefChar, NULL); - prefix = std::string(char_path); - //chop "bin\XGUI.exe" - unsigned found = prefix.rfind("bin"); - if(found != std::string::npos) - prefix.replace(found, prefix.length(), "plugins\\"); -#else - //TODO(sbh): Find full path to binary on linux - prefix = "../plugins/"; + if (isNode(theNode, NODE_SOURCE, NULL)) { + std::string aSourceFile = getProperty(theNode, SOURCE_FILE); + Config_XMLReader aSourceReader = Config_XMLReader(aSourceFile); + readRecursively(aSourceReader.findRoot()); +#ifdef _DEBUG + //std::cout << "Config_XMLReader::sourced node: " << aSourceFile << std::endl; #endif - m_DocumentPath = prefix + documentPath; + } } -void Config_XMLReader::readAll() +void Config_XMLReader::cleanup(xmlNodePtr) { - import(); + // do nothing; } -/* - * TODO: make virtual as beforeImport - */ -bool Config_XMLReader::import() +bool Config_XMLReader::processChildren(xmlNodePtr aNode) { - bool result = false; - xmlDocPtr aDoc; - aDoc = xmlParseFile(m_DocumentPath.c_str()); - if(aDoc == NULL) { - #ifdef _DEBUG - std::cout << "Config_XMLReader::import: " << "Document " << m_DocumentPath - << " is not parsed successfully." << std::endl; - #endif - return result; + return true; +} + +xmlNodePtr Config_XMLReader::findRoot() +{ + if (myXmlDoc == NULL) { + myXmlDoc = xmlParseFile(myDocumentPath.c_str()); + } + if (myXmlDoc == NULL) { +#ifdef _DEBUG + std::cout << "Config_XMLReader::import: " << "Document " << myDocumentPath + << " is not parsed successfully." << std::endl; +#endif + return NULL; } - xmlNodePtr aRoot = xmlDocGetRootElement(aDoc); + xmlNodePtr aRoot = xmlDocGetRootElement(myXmlDoc); +#ifdef _DEBUG if(aRoot == NULL) { - #ifdef _DEBUG std::cout << "Config_XMLReader::import: " << "Error: empty document"; - #endif - return result; } - xmlNodePtr aWbSec; - for(aWbSec = aRoot->xmlChildrenNode; aWbSec; aWbSec = aWbSec->next) { // searching for higher level element "workbench" - if(IsNode(aWbSec, "workbench")) { - result = importWorkbench(aWbSec); - } else { - #ifdef _DEBUG - std::cout << "Config_XMLReader::import: " - << "Found strange section, should be workbench" << std::endl; - #endif - continue; - } - } - return result; +#endif + return aRoot; } -/* - * TODO(sbh): make virtual as doImport - */ -bool Config_XMLReader::importWorkbench(void* theRoot) -{ - xmlNodePtr aGroupNode = (static_cast(theRoot))->xmlChildrenNode; - Event_Loop* aEvLoop = Event_Loop::Loop(); - if(!aEvLoop) { - #ifdef _DEBUG - std::cout << "Config_XMLReader::importWorkbench: " - << "No event loop registered" << std::endl; - #endif - return false; - } - for(; aGroupNode; aGroupNode = aGroupNode->next) { // searching for record - if(!IsNode(aGroupNode, "group")) - continue; - std::string aGroupName = getProperty(aGroupNode, FEATURE_GROUP_NAME); - if(aGroupName.empty()) +void Config_XMLReader::readRecursively(xmlNodePtr theParent) +{ + if (!theParent) + return; + xmlNodePtr aNode = theParent->xmlChildrenNode; + for (; aNode; aNode = aNode->next) { + //Still no text processing in features... + if (!isElementNode(aNode)) { continue; - xmlNodePtr aFtNode = aGroupNode->xmlChildrenNode; - for(; aFtNode; aFtNode = aFtNode->next) { - if(!IsNode(aFtNode, "feature")) - continue; - //Create feature... - Config_FeatureMessage aMessage(aEvLoop->EventByName("Feature"), this); - fillFeature(aFtNode, aMessage); - aMessage.m_group = aGroupName; - aEvLoop->Send(aMessage); } + processNode(aNode); + if (processChildren(aNode)) { + readRecursively(aNode); + } + cleanup(aNode); } - return true; } -void Config_XMLReader::fillFeature(void *theRoot, - Config_FeatureMessage& outFeatureMessage) +xmlNodePtr Config_XMLReader::node(void* theNode) { - outFeatureMessage.m_id = getProperty(theRoot, FEATURE_ID); - outFeatureMessage.m_text = getProperty(theRoot, FEATURE_TEXT); - outFeatureMessage.m_tooltip = getProperty(theRoot, FEATURE_TOOLTIP); - outFeatureMessage.m_icon = getProperty(theRoot, FEATURE_ICON); - outFeatureMessage.m_keysequence = getProperty(theRoot, FEATURE_KEYSEQUENCE); + return static_cast(theNode); } -std::string Config_XMLReader::getProperty(void *theRoot, const char* name) +std::string Config_XMLReader::getNodeName(xmlNodePtr theNode) { std::string result = ""; - xmlNodePtr aNode = (static_cast(theRoot)); - char* aPropChars = (char*) xmlGetProp(aNode, BAD_CAST name); - if(!aPropChars || aPropChars[0] == 0) + char* aPropChars = (char*) theNode->name; + if (!aPropChars || aPropChars[0] == 0) return result; result = std::string(aPropChars); return result; } + +void Config_XMLReader::storeAttribute(xmlNodePtr theNode, const char* theAttribute, bool doClean) +{ + std::string aKey = getNodeName(theNode) + ":" + std::string(theAttribute); + std::string aValue = getProperty(theNode, theAttribute); + if (doClean || !aValue.empty()) { + myCachedAttributes[aKey] = aValue; + } +} + +std::string Config_XMLReader::restoreAttribute(xmlNodePtr theNode, const char* theAttribute) +{ + return restoreAttribute(getNodeName(theNode).c_str(), theAttribute); +} + +std::string Config_XMLReader::restoreAttribute(const char* theNodeName, const char* theAttribute) +{ + std::string aKey = std::string(theNodeName) + ":" + std::string(theAttribute); + std::string result = ""; + if(myCachedAttributes.find(aKey) != myCachedAttributes.end()) { + result = myCachedAttributes[aKey]; + } + return result; +} + +bool Config_XMLReader::cleanupAttribute(xmlNodePtr theNode, const char* theNodeAttribute) +{ + return cleanupAttribute(getNodeName(theNode).c_str(), theNodeAttribute); +} + +bool Config_XMLReader::cleanupAttribute(const char* theNodeName, const char* theNodeAttribute) +{ + std::string aKey = std::string(theNodeName) + ":" + std::string(theNodeAttribute); + bool result = false; + std::map::iterator anEntry = myCachedAttributes.find(aKey); + if( anEntry != myCachedAttributes.end()) { + myCachedAttributes.erase(anEntry); + result = true; + } + return result; +} + +const char* Config_XMLReader::encoding() const +{ + return (const char*) myXmlDoc->encoding; +} \ No newline at end of file