X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FConfig%2FConfig_XMLReader.cpp;h=768232b7457e05006f7e9b44caf1ba726fb124bd;hb=7b13546ebd4d7a935189869b0a0c7b72a6f84479;hp=44c806ce919faebbb6e70e7121e6ee6eecf0cd4c;hpb=35a88fdd724349275bbff32b9596a44e7cd422e2;p=modules%2Fshaper.git diff --git a/src/Config/Config_XMLReader.cpp b/src/Config/Config_XMLReader.cpp index 44c806ce9..768232b74 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 * @@ -9,11 +11,16 @@ #include #include #include +#include +#include #include +#include #include #include +#include + #ifdef WIN32 #pragma warning(disable : 4996) // for getenv #endif @@ -25,19 +32,31 @@ Config_XMLReader::Config_XMLReader(const std::string& theXmlFileName) : myXmlDoc(NULL) { - std::string prefix = ""; + 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) */ - char* anEnv = getenv("NEW_GEOM_CONFIG_FILE"); - if (anEnv) { - prefix = std::string(anEnv) + "/"; + if (prefix.empty()) { + char* anEnv = getenv("NEW_GEOM_CONFIG_FILE"); + if (anEnv) { + prefix = std::string(anEnv); + } } - +#ifdef WIN32 + prefix += "\\"; +#else + prefix += "/"; +#endif myDocumentPath = prefix + theXmlFileName; + std::ifstream aTestFile(myDocumentPath); + if (!aTestFile) Events_Error::send("Unable to open " + myDocumentPath); + aTestFile.close(); } Config_XMLReader::~Config_XMLReader() @@ -45,22 +64,12 @@ Config_XMLReader::~Config_XMLReader() xmlFreeDoc(myXmlDoc); } -/* - * 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() { xmlNodePtr aRoot = findRoot(); readRecursively(aRoot); } -/* - * Allows to customize reader's behavior for a node. Virtual. - * The default impl does nothing. (In debug mode prints - * some info) - */ void Config_XMLReader::processNode(xmlNodePtr theNode) { if (isNode(theNode, NODE_SOURCE, NULL)) { @@ -72,21 +81,21 @@ void Config_XMLReader::processNode(xmlNodePtr theNode) #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 impl is to read all nodes. - */ +void Config_XMLReader::cleanup(xmlNodePtr) +{ + // do nothing; +} + bool Config_XMLReader::processChildren(xmlNodePtr aNode) { return true; } -/* - * - */ xmlNodePtr Config_XMLReader::findRoot() { if (myXmlDoc == NULL) { @@ -108,11 +117,6 @@ 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) { if (!theParent) @@ -127,12 +131,10 @@ void Config_XMLReader::readRecursively(xmlNodePtr theParent) if (processChildren(aNode)) { readRecursively(aNode); } + cleanup(aNode); } } -/* - * void* -> xmlNodePtr - */ xmlNodePtr Config_XMLReader::node(void* theNode) { return static_cast(theNode); @@ -155,10 +157,32 @@ void Config_XMLReader::processValidator(xmlNodePtr theNode) std::shared_ptr aMessage(new Config_ValidatorMessage(aValidatoEvent, this)); std::string aValidatorId; - std::list aValidatorParameters; - getValidatorInfo(theNode, aValidatorId, aValidatorParameters); + std::list aParameters; + getParametersInfo(theNode, aValidatorId, aParameters); aMessage->setValidatorId(aValidatorId); - aMessage->setValidatorParameters(aValidatorParameters); + 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); +} + +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));