X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FConfig%2FConfig_XMLReader.cpp;h=a29eaab64cf67b41d80c4bf7350601b27b3dac59;hb=3828ae57873e6bda6ff760b85172bd439d1b4483;hp=723ddf089af402c16613507a5f6ca163931f1c0d;hpb=a78a826e270a123f0857360bf0d2de19df7114c1;p=modules%2Fshaper.git diff --git a/src/Config/Config_XMLReader.cpp b/src/Config/Config_XMLReader.cpp index 723ddf089..a29eaab64 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,14 +8,21 @@ */ #include +#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 @@ -21,37 +30,44 @@ #endif Config_XMLReader::Config_XMLReader(const std::string& theXmlFileName) + : myXmlDoc(NULL) { - std::string prefix; - //Get path to *.xml files (typically ./bin/../plugins/) + 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/) + + * the problem: application may be launched using python executable, + * to use environment variable (at least for the current moment) + */ + if (prefix.empty()) { + char* anEnv = getenv("NEW_GEOM_CONFIG_FILE"); + if (anEnv) { + prefix = std::string(anEnv); + } + } #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\\"); + prefix += "\\"; #else - //TODO(sbh): Find full path to binary on linux - prefix = "../plugins/"; + prefix += "/"; #endif - myDocumentPath = prefix + theXmlFileName; + std::ifstream aTestFile(myDocumentPath); + if (!aTestFile) Events_Error::send("Unable to open " + myDocumentPath); + aTestFile.close(); } Config_XMLReader::~Config_XMLReader() { + xmlFreeDoc(myXmlDoc); } -/* - * Read all nodes (recursively if processChildren() is true - * for a node). For each read node the processNode will be - * called. +/*! + * Read all nodes in associated xml file, + * recursively if processChildren(xmlNode) is true for the xmlNode. + * For each read node the processNode will be called. */ void Config_XMLReader::readAll() { @@ -59,41 +75,53 @@ void Config_XMLReader::readAll() readRecursively(aRoot); } -/* +/*! * Allows to customize reader's behavior for a node. Virtual. - * The default implementation does nothing. (In debug mode prints + * The default impl does nothing. (In debug mode prints * some info) */ -void Config_XMLReader::processNode(xmlNodePtr aNode) +void Config_XMLReader::processNode(xmlNodePtr theNode) { + 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::processNode: " - << aNode->name << " content: " - << aNode->content << std::endl; + std::cout << "Config_XMLReader::sourced node: " << aSourceFile << std::endl; #endif + } else if (isNode(theNode, NODE_VALIDATOR, NULL)) { + processValidator(theNode); + } else if (isNode(theNode, NODE_SELFILTER, NULL)) { + processSelectionFilter(theNode); + } } -/* +/*! * Defines which nodes should be processed recursively. Virtual. - * The default implementation to read all nodes. + * The default impl is to read all nodes. */ bool Config_XMLReader::processChildren(xmlNodePtr aNode) { return true; } +/*! + * Returns xmlNodePtr to the root of reader's document + * or NULL if not found + */ xmlNodePtr Config_XMLReader::findRoot() { - xmlDocPtr aDoc; - aDoc = xmlParseFile(myDocumentPath.c_str()); - if (aDoc == NULL) { + 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) { std::cout << "Config_XMLReader::import: " << "Error: empty document"; @@ -102,28 +130,29 @@ xmlNodePtr Config_XMLReader::findRoot() return aRoot; } -/* +/*! * Calls processNode() for each child (for some - recursively) * of the given node. * \sa ReadAll() */ void Config_XMLReader::readRecursively(xmlNodePtr theParent) { - static Event_ID aFeatureEvent = Event_Loop::EventByName("Feature"); - if (!theParent) return; xmlNodePtr aNode = theParent->xmlChildrenNode; - for(; aNode; aNode = aNode->next) { + for (; aNode; aNode = aNode->next) { + //Still no text processing in features... + if (!isElementNode(aNode)) { + continue; + } processNode(aNode); if (processChildren(aNode)) { readRecursively(aNode); - Config_FeatureMessage aMessage(aFeatureEvent, this); } } } -/* +/*! * void* -> xmlNodePtr */ xmlNodePtr Config_XMLReader::node(void* theNode) @@ -131,43 +160,66 @@ xmlNodePtr Config_XMLReader::node(void* theNode) return static_cast(theNode); } -/* - * Returns named property for a given node as std::string. +/*! + * Gets xml node name */ -std::string Config_XMLReader::getProperty(xmlNodePtr theNode, const char* name) +std::string Config_XMLReader::getNodeName(xmlNodePtr theNode) { std::string result = ""; - char* aPropChars = (char*) xmlGetProp(theNode, BAD_CAST name); + char* aPropChars = (char*) theNode->name; if (!aPropChars || aPropChars[0] == 0) return result; result = std::string(aPropChars); return result; } -/* - * Returns true if theNode is XML node with a given name. +/*! + * Retrieves all the necessary info from the validator node. + * Sends ValidatorLoaded event */ -bool Config_XMLReader::isNode(xmlNodePtr theNode, const char* theNodeName, ...) +void Config_XMLReader::processValidator(xmlNodePtr theNode) { - bool result = false; - const xmlChar* aName = theNode->name; - if (!aName || theNode->type != XML_ELEMENT_NODE) - return false; - - if (!xmlStrcmp(aName, (const xmlChar *) theNodeName)) - return true; - - va_list args; // define argument list variable - va_start(args, theNodeName); // init list; point to last defined argument - while(true) { - char *anArg = va_arg (args, char *); // get next argument - if (anArg == NULL) - break; - if (!xmlStrcmp(aName, (const xmlChar *) anArg)) { - va_end(args); // cleanup the system stack - return true; - } + Events_ID aValidatoEvent = Events_Loop::eventByName(EVENT_VALIDATOR_LOADED); + Events_Loop* aEvLoop = Events_Loop::loop(); + std::shared_ptr + aMessage(new Config_ValidatorMessage(aValidatoEvent, this)); + std::string aValidatorId; + std::list aParameters; + getParametersInfo(theNode, aValidatorId, aParameters); + aMessage->setValidatorId(aValidatorId); + aMessage->setValidatorParameters(aParameters); + xmlNodePtr aFeatureOrWdgNode = theNode->parent; + if (isNode(aFeatureOrWdgNode, NODE_FEATURE, NULL)) { + aMessage->setFeatureId(getProperty(aFeatureOrWdgNode, _ID)); + } else { + aMessage->setAttributeId(getProperty(aFeatureOrWdgNode, _ID)); + aMessage->setFeatureId(myCurrentFeature); + } + aEvLoop->send(aMessage); +} + +/*! + * Retrieves all the necessary info from the SelectionFilter node. + * Sends SelectionFilterLoaded event + */ +void Config_XMLReader::processSelectionFilter(xmlNodePtr theNode) +{ + Events_ID aFilterEvent = Events_Loop::eventByName(EVENT_SELFILTER_LOADED); + Events_Loop* aEvLoop = Events_Loop::loop(); + std::shared_ptr aMessage = + std::make_shared(aFilterEvent, this); + std::string aSelectionFilterId; + std::list aParameters; + getParametersInfo(theNode, aSelectionFilterId, aParameters); + aMessage->setSelectionFilterId(aSelectionFilterId); + aMessage->setFilterParameters(aParameters); + + xmlNodePtr aFeatureOrWdgNode = theNode->parent; + if (isNode(aFeatureOrWdgNode, NODE_FEATURE, NULL)) { + aMessage->setFeatureId(getProperty(aFeatureOrWdgNode, _ID)); + } else { + aMessage->setAttributeId(getProperty(aFeatureOrWdgNode, _ID)); + aMessage->setFeatureId(myCurrentFeature); } - va_end(args); // cleanup the system stack - return false; + aEvLoop->send(aMessage); }