Salome HOME
Copyright update 2022
[modules/yacs.git] / src / yacsloader / outputParsers.hxx
1 // Copyright (C) 2006-2022  CEA/DEN, EDF R&D
2 //
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, or (at your option) any later version.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #ifndef _OUTPUTPARSERS_HXX_
21 #define _OUTPUTPARSERS_HXX_
22
23 #include "nodeParsers.hxx"
24
25 #include "factory.hxx"
26
27 #include "DataNode.hxx"
28
29 namespace YACS
30 {
31
32 /*! \brief Class for outputdata parser.
33  *
34  *  Its XML schema is:
35  \verbatim
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" />
40      </xsd:complexType>
41  \endverbatim
42  */
43 struct outputdatatypeParser: parser
44 {
45   static outputdatatypeParser outputdataParser;
46
47   virtual void onStart(const XML_Char* el, const XML_Char** attr)
48     {
49       DEBTRACE("outputdatatypeParser::onStart");
50       std::string element(el);
51       parser* pp=&parser::main_parser;
52       SetUserDataAndPush(pp);
53       pp->init();
54       pp->pre();
55       pp->buildAttr(attr);
56     }
57   virtual void onEnd(const char *el,parser* child)
58     {
59     }
60   virtual void buildAttr(const XML_Char** attr)
61     {
62       if (!attr)
63         return;
64       DEBTRACE("outputdatatypeParser::buildAttr");
65       required("name",attr);
66       required("type",attr);
67       for (int i = 0; attr[i]; i += 2)
68       {
69         if(std::string(attr[i]) == "name")name(attr[i+1]);
70         if(std::string(attr[i]) == "type")type(attr[i+1]);
71         if(std::string(attr[i]) == "ref")ref(attr[i+1]);
72       }
73     }
74   virtual void name (const std::string& name)
75     {
76       DEBTRACE("outputdatatypeParser::name");
77       _param._name=name;
78     }
79   virtual void type (const std::string& type)
80     {
81       DEBTRACE("outputdatatypeParser::type");
82       _param._type=type;
83     }
84   virtual void ref (const std::string& ref)
85     {
86       _param.setProperty("ref",ref);
87     }
88
89   virtual void pre ()
90     {
91       DEBTRACE("outputdatatypeParser::pre");
92       _param.clear();
93     }
94   virtual myoutport& post()
95     {
96       return _param;
97     }
98   myoutport _param;
99 };
100
101 /*! \brief Class for OutNode parser.
102  *
103  *  Its XML schema is:
104  \verbatim
105      <xsd:complexType name="OutNodeType">
106        <xsd:attribute name="name" type="xsd:string" use="required"/>
107        <xsd:attribute name="kind" type="xsd:string" />
108        <xsd:attribute name="ref" type="xsd:string" />
109        <xsd:element name="parameter" type="OutputDataType"/>
110      </xsd:complexType>
111  \endverbatim
112  */
113 template <class T=ENGINE::DataNode*>
114 struct outnodetypeParser:public nodetypeParser<T>
115 {
116   static outnodetypeParser<T> outnodeParser;
117   virtual void onStart(const XML_Char* el, const XML_Char** attr);
118   virtual void onEnd(const char *el,parser* child);
119   virtual void buildAttr(const XML_Char** attr);
120   virtual void pre ();
121   virtual void name (const std::string& name);
122   virtual void kind (const std::string& kind);
123   virtual void ref (const std::string& ref);
124   virtual void create ();
125   virtual void parameter (myoutport& p);
126   virtual T post();
127   std::string _name;
128   std::string _kind;
129   std::string _ref;
130 };
131
132 template <class T> outnodetypeParser<T> outnodetypeParser<T>::outnodeParser;
133
134
135 template <class T>
136 void outnodetypeParser<T>::onStart(const XML_Char* el, const XML_Char** attr)
137     {
138       DEBTRACE("outnodetypeParser::onStart");
139       std::string element(el);
140       parser* pp=&parser::main_parser;
141       if(element == "parameter")pp=&outputdatatypeParser::outputdataParser;
142       if(element == "property")pp=&propertytypeParser::propertyParser;
143       this->SetUserDataAndPush(pp);
144       pp->init();
145       pp->pre();
146       pp->buildAttr(attr);
147     }
148
149 template <class T>
150 void outnodetypeParser<T>::onEnd(const char *el,parser* child)
151     {
152       DEBTRACE("outnodetypeParser::onEnd");
153       std::string element(el);
154       if(element == "parameter")parameter(((outputdatatypeParser*)child)->post());
155       if(element == "property")this->property(((propertytypeParser*)child)->post());
156     }
157
158 template <class T>
159 void outnodetypeParser<T>::buildAttr(const XML_Char** attr)
160     {
161       if (!attr)
162         return;
163       DEBTRACE("outnodetypeParser::buildAttr");
164       this->required("name",attr);
165       for (int i = 0; attr[i]; i += 2)
166         {
167           if(std::string(attr[i]) == "name")name(attr[i+1]);
168           if(std::string(attr[i]) == "kind")kind(attr[i+1]);
169           if(std::string(attr[i]) == "ref")ref(attr[i+1]);
170         }
171       create();
172     }
173
174 template <class T>
175 void outnodetypeParser<T>::pre ()
176 {
177   this->_node=0;
178   _kind="";
179   _ref="";
180 }
181
182 template <class T>
183 void outnodetypeParser<T>::name (const std::string& name)
184 {
185   _name=name;
186 }
187 template <class T>
188 void outnodetypeParser<T>::kind (const std::string& kind)
189 {
190   _kind=kind;
191 }
192 template <class T>
193 void outnodetypeParser<T>::ref (const std::string& ref)
194 {
195   _ref=ref;
196 }
197
198 template <class T>
199 void outnodetypeParser<T>::create ()
200 {
201   this->_node = theRuntime->createOutDataNode(_kind,_name);
202 }
203
204 template <class T>
205 void outnodetypeParser<T>::parameter (myoutport& p)
206 {
207   DEBTRACE("outnodetypeParser::parameter");
208   if(currentProc->typeMap.count(p._type)==0)
209     {
210       //Check if the typecode is defined in the runtime
211       YACS::ENGINE::TypeCode* t=theRuntime->getTypeCode(p._type);
212       if(t==0)
213       {
214         std::string msg="Unknown Type: ";
215         msg=msg+p._type+" for node: "+this->_node->getName()+" port name: "+p._name;
216         this->logError(msg);
217         return;
218       }
219       else
220       {
221         currentProc->typeMap[p._type]=t;
222         t->incrRef();
223       }
224     }
225   ENGINE::InputPort *port = this->_node->edAddInputPort(p._name,currentProc->typeMap[p._type]);
226   this->_node->setData(port,p._props["ref"]);
227 }
228
229 template <class T>
230 T outnodetypeParser<T>::post()
231 {
232   this->_node->setRef(_ref);
233   return this->_node;
234 }
235
236 }
237 #endif