Salome HOME
Manage initnode and finalizenode in the foreachloop progress bar.
[modules/yacs.git] / src / yacsloader / blocParsers.hxx
index 05b46940db1d18dc042f3e2ec0f0bd1546f791bd..ea8d908a342af2869e8fcf9a751011578d45b426 100644 (file)
@@ -1,3 +1,22 @@
+// Copyright (C) 2006-2015  CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
 #ifndef _BLOCPARSER_HXX_
 #define _BLOCPARSER_HXX_
 
@@ -5,6 +24,11 @@
 #include "linkParsers.hxx"
 #include "xmlrpcParsers.hxx"
 #include "nodeParsers.hxx"
+#include "inlineParsers.hxx"
+#include "remoteParsers.hxx"
+#include "serverParsers.hxx"
+#include "sinlineParsers.hxx"
+#include "serviceParsers.hxx"
 
 
 #include "Proc.hxx"
@@ -12,6 +36,7 @@
 #include "Runtime.hxx"
 #include "ForLoop.hxx"
 #include "ForEachLoop.hxx"
+#include "OptimizerLoop.hxx"
 #include "WhileLoop.hxx"
 #include "Switch.hxx"
 #include "Bloc.hxx"
@@ -41,12 +66,15 @@ struct bloctypeParser:parser
     _orders["property"]=0;
     _orders["inline"]=2;
     _orders["service"]=2;
+    _orders["server"]=2;
+    _orders["remote"]=2;
     _orders["sinline"]=2;
     _orders["node"]=2;
     _orders["datanode"]=2;
     _orders["outnode"]=2;
     _orders["forloop"]=2;
     _orders["foreach"]=2;
+    _orders["optimizer"]=2;
     _orders["while"]=2;
     _orders["switch"]=2;
     _orders["bloc"]=2;
@@ -59,6 +87,8 @@ struct bloctypeParser:parser
   virtual void onEnd(const char *el,parser* child);
   virtual void buildAttr(const XML_Char** attr)
     {
+      if (!attr)
+        return;
       this->required("name",attr);
       for (int i = 0; attr[i]; i += 2) 
         {
@@ -107,6 +137,22 @@ struct bloctypeParser:parser
       currentProc->nodeMap[fullname]=n;
       currentProc->serviceMap[fullname]=n;
     }
+  virtual void remote (YACS::ENGINE::InlineNode* const& n)
+    {
+      DEBTRACE( "bloc_remote_set: " << n->getName() )             
+      _bloc->edAddChild(n);
+      std::string fullname = currentProc->names.back()+n->getName();
+      currentProc->nodeMap[fullname]=n;
+      currentProc->inlineMap[fullname]=n;
+    }
+  virtual void server (YACS::ENGINE::ServerNode* const& n)
+    {
+      DEBTRACE( "bloc_server_set: " << n->getName() )             
+      _bloc->edAddChild(n);
+      std::string fullname = currentProc->names.back()+n->getName();
+      currentProc->nodeMap[fullname]=n;
+      currentProc->inlineMap[fullname]=n;
+    }
   virtual void node (YACS::ENGINE::InlineNode* const& n)
     {
       DEBTRACE( "bloc_node_set: " << n->getName() )             
@@ -123,6 +169,15 @@ struct bloctypeParser:parser
       std::string fullname = currentProc->names.back()+b->getName();
       currentProc->nodeMap[fullname]=b;
     }
+  virtual void optimizer (YACS::ENGINE::OptimizerLoop* const& b)
+    {
+      DEBTRACE( "bloc_optimizer_set: " << b->getName() );
+      _bloc->edAddChild(b);
+      std::string fullname = currentProc->names.back()+b->getName();
+      currentProc->nodeMap[fullname]=b;
+      //fullname += ".splitter";
+      //currentProc->nodeMap[fullname]=b->getChildByShortName("splitter");
+    }
   virtual void foreach (YACS::ENGINE::ForEachLoop* const& b)
     {
       DEBTRACE( "bloc_foreach_set: " << b->getName() )             
@@ -361,6 +416,8 @@ void bloctypeParser<T>::onStart(const XML_Char* el, const XML_Char** attr)
   else if(element == "inline")pp=&inlinetypeParser<>::inlineParser;
   else if(element == "sinline")pp=&sinlinetypeParser<>::sinlineParser;
   else if(element == "service")pp=&servicetypeParser<>::serviceParser;
+  else if(element == "server")pp=&servertypeParser<>::serverParser;
+  else if(element == "remote")pp=&remotetypeParser<>::remoteParser;
   else if(element == "node")pp=&nodetypeParser<>::nodeParser;
   else if(element == "datanode")pp=&presettypeParser<>::presetParser;
   else if(element == "outnode")pp=&outnodetypeParser<>::outnodeParser;
@@ -368,6 +425,7 @@ void bloctypeParser<T>::onStart(const XML_Char* el, const XML_Char** attr)
   else if(element == "bloc")pp=&bloctypeParser<>::blocParser;
   else if(element == "forloop")pp=&forlooptypeParser<>::forloopParser;
   else if(element == "foreach")pp=&foreachlooptypeParser<>::foreachloopParser;
+  else if(element == "optimizer")pp=&optimizerlooptypeParser<>::optimizerloopParser;
   else if(element == "while")pp=&whilelooptypeParser<>::whileloopParser;
   else if(element == "switch")pp=&switchtypeParser::switchParser;
 
@@ -391,12 +449,15 @@ void bloctypeParser<T>::onEnd(const char *el,parser* child)
   else if(element == "inline")inline_(((inlinetypeParser<>*)child)->post());
   else if(element == "sinline")sinline(((sinlinetypeParser<>*)child)->post());
   else if(element == "service")service(((servicetypeParser<>*)child)->post());
+  else if(element == "server")server(((servertypeParser<>*)child)->post());
+  else if(element == "remote")remote(((remotetypeParser<>*)child)->post());
   else if(element == "node")node(((nodetypeParser<>*)child)->post());
   else if(element == "datanode")preset(((presettypeParser<>*)child)->post());
   else if(element == "outnode")outnode(((outnodetypeParser<>*)child)->post());
 
   else if(element == "bloc")bloc(((bloctypeParser<>*)child)->post());
   else if(element == "forloop")forloop(((forlooptypeParser<>*)child)->post());
+  else if(element == "optimizer")optimizer(((optimizerlooptypeParser<>*)child)->post());
   else if(element == "foreach")foreach(((foreachlooptypeParser<>*)child)->post());
   else if(element == "while")while_(((whilelooptypeParser<>*)child)->post());
   else if(element == "switch")switch_(((switchtypeParser*)child)->post());