1 // Copyright (C) 2006-2012 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #ifndef _OUTPUTPARSERS_HXX_
21 #define _OUTPUTPARSERS_HXX_
23 #include "nodeParsers.hxx"
25 #include "factory.hxx"
27 #include "DataNode.hxx"
32 /*! \brief Class for outputdata parser.
36 <xsd:complexType name="OutputDataType">
37 <xsd:attribute name="name" type="xsd:string" use="required"/>
38 <xsd:attribute name="type" type="xsd:string" use="required"/>
39 <xsd:attribute name="ref" type="xsd::string" />
43 struct outputdatatypeParser: parser
45 static outputdatatypeParser outputdataParser;
47 virtual void onStart(const XML_Char* el, const XML_Char** attr)
49 DEBTRACE("outputdatatypeParser::onStart");
50 std::string element(el);
51 parser* pp=&parser::main_parser;
52 SetUserDataAndPush(pp);
57 virtual void onEnd(const char *el,parser* child)
60 virtual void buildAttr(const XML_Char** attr)
62 DEBTRACE("outputdatatypeParser::buildAttr");
63 required("name",attr);
64 required("type",attr);
65 for (int i = 0; attr[i]; i += 2)
67 if(std::string(attr[i]) == "name")name(attr[i+1]);
68 if(std::string(attr[i]) == "type")type(attr[i+1]);
69 if(std::string(attr[i]) == "ref")ref(attr[i+1]);
72 virtual void name (const std::string& name)
74 DEBTRACE("outputdatatypeParser::name");
77 virtual void type (const std::string& type)
79 DEBTRACE("outputdatatypeParser::type");
82 virtual void ref (const std::string& ref)
84 _param.setProperty("ref",ref);
89 DEBTRACE("outputdatatypeParser::pre");
92 virtual myoutport& post()
99 /*! \brief Class for OutNode parser.
103 <xsd:complexType name="OutNodeType">
104 <xsd:attribute name="name" type="xsd:string" use="required"/>
105 <xsd:attribute name="kind" type="xsd:string" />
106 <xsd:attribute name="ref" type="xsd:string" />
107 <xsd:element name="parameter" type="OutputDataType"/>
111 template <class T=ENGINE::DataNode*>
112 struct outnodetypeParser:public nodetypeParser<T>
114 static outnodetypeParser<T> outnodeParser;
115 virtual void onStart(const XML_Char* el, const XML_Char** attr);
116 virtual void onEnd(const char *el,parser* child);
117 virtual void buildAttr(const XML_Char** attr);
119 virtual void name (const std::string& name);
120 virtual void kind (const std::string& kind);
121 virtual void ref (const std::string& ref);
122 virtual void create ();
123 virtual void parameter (myoutport& p);
130 template <class T> outnodetypeParser<T> outnodetypeParser<T>::outnodeParser;
134 void outnodetypeParser<T>::onStart(const XML_Char* el, const XML_Char** attr)
136 DEBTRACE("outnodetypeParser::onStart");
137 std::string element(el);
138 parser* pp=&parser::main_parser;
139 if(element == "parameter")pp=&outputdatatypeParser::outputdataParser;
140 if(element == "property")pp=&propertytypeParser::propertyParser;
141 this->SetUserDataAndPush(pp);
148 void outnodetypeParser<T>::onEnd(const char *el,parser* child)
150 DEBTRACE("outnodetypeParser::onEnd");
151 std::string element(el);
152 if(element == "parameter")parameter(((outputdatatypeParser*)child)->post());
153 if(element == "property")this->property(((propertytypeParser*)child)->post());
157 void outnodetypeParser<T>::buildAttr(const XML_Char** attr)
159 DEBTRACE("outnodetypeParser::buildAttr");
160 this->required("name",attr);
161 for (int i = 0; attr[i]; i += 2)
163 if(std::string(attr[i]) == "name")name(attr[i+1]);
164 if(std::string(attr[i]) == "kind")kind(attr[i+1]);
165 if(std::string(attr[i]) == "ref")ref(attr[i+1]);
171 void outnodetypeParser<T>::pre ()
179 void outnodetypeParser<T>::name (const std::string& name)
184 void outnodetypeParser<T>::kind (const std::string& kind)
189 void outnodetypeParser<T>::ref (const std::string& ref)
195 void outnodetypeParser<T>::create ()
197 this->_node = theRuntime->createOutDataNode(_kind,_name);
201 void outnodetypeParser<T>::parameter (myoutport& p)
203 DEBTRACE("outnodetypeParser::parameter");
204 if(currentProc->typeMap.count(p._type)==0)
206 //Check if the typecode is defined in the runtime
207 YACS::ENGINE::TypeCode* t=theRuntime->getTypeCode(p._type);
210 std::string msg="Unknown Type: ";
211 msg=msg+p._type+" for node: "+this->_node->getName()+" port name: "+p._name;
217 currentProc->typeMap[p._type]=t;
221 ENGINE::InputPort *port = this->_node->edAddInputPort(p._name,currentProc->typeMap[p._type]);
222 this->_node->setData(port,p._props["ref"]);
226 T outnodetypeParser<T>::post()
228 this->_node->setRef(_ref);