Salome HOME
Update copyrights 2014.
[modules/yacs.git] / src / runtime / CppPorts.cxx
1 // Copyright (C) 2006-2014  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 #include "TypeConversions.hxx"
21 #include "CppPorts.hxx"
22 #include "Node.hxx"
23 #include "TypeCode.hxx"
24
25 #include <iostream>
26 #include <sstream>
27
28 //#define _DEVDEBUG_
29 #include "YacsTrace.hxx"
30
31 using namespace YACS::ENGINE;
32 using namespace std;
33
34 InputCppPort::InputCppPort(const std::string& name, Node *node, TypeCode * type)
35   : InputPort(name, node, type), DataPort(name, node, type), Port(node), _data(NULL),_initData(NULL)
36 {
37 }
38
39 InputCppPort::~InputCppPort()
40 {
41   if(_data)
42     {
43       DEBTRACE("_data ref count: " << _data->getRefCnt());
44       _data->decrRef();
45     }
46 }
47
48 InputCppPort::InputCppPort(const InputCppPort& other, Node *newHelder):InputPort(other,newHelder),DataPort(other,newHelder),Port(other,newHelder)
49 {
50   _initData=other._initData;
51   _data=other._data;
52 }
53
54 bool InputCppPort::edIsManuallyInitialized() const
55 {
56   return _initData!= NULL;
57 }
58
59 void InputCppPort::edRemoveManInit()
60 {
61   _initData=NULL;
62   InputPort::edRemoveManInit();
63 }
64
65 void InputCppPort::put(const void *data) throw(ConversionException)
66 {
67   put((YACS::ENGINE::Any *)data);
68 }
69
70 void InputCppPort::put(YACS::ENGINE::Any *data) throw(ConversionException)
71 {
72   if(_data)
73     _data->decrRef();
74   _data=data;
75   _data->incrRef();
76   DEBTRACE("value ref count: " << _data->getRefCnt());
77 }
78
79 InputPort *InputCppPort::clone(Node *newHelder) const
80 {
81   return new InputCppPort(*this,newHelder);
82 }
83
84 YACS::ENGINE::Any * InputCppPort::getCppObj() const
85 {
86   return _data;
87 }
88
89 void *InputCppPort::get() const throw(YACS::Exception)
90 {
91   return (void*) _data;
92 }
93
94 bool InputCppPort::isEmpty()
95 {
96   return _data == NULL;
97 }
98
99 //! Save the current data value for further reinitialization of the port
100 /*!
101  *
102  */
103 void InputCppPort::exSaveInit()
104 {
105   _initData=_data;
106   //DEBTRACE("_initData.ob refcnt: " << _initData->ob_refcnt);
107   //DEBTRACE("_data.ob refcnt: " << _data->ob_refcnt);
108 }
109
110 //! Restore the saved data value to current data value
111 /*!
112  * If no data has been saved (_initData == 0) don't restore
113  */
114 void InputCppPort::exRestoreInit()
115 {
116   if(!_initData)return;
117   _data=_initData;
118   //DEBTRACE("_initData.ob refcnt: " << _initData->ob_refcnt);
119   //DEBTRACE("_data.ob refcnt: " << _data->ob_refcnt);
120 }
121
122 std::string InputCppPort::dump()
123 {
124   if( _data == NULL)
125     return "<value>None</value>";
126
127   if (edGetType()->kind() != YACS::ENGINE::Objref)
128     return convertNeutralXml(edGetType(), _data);
129     //return convertCppXml(edGetType(), _data);
130   if (! _stringRef.empty())
131     return _stringRef;
132   else 
133     return convertNeutralXml(edGetType(), _data);
134 //     {
135 //       stringstream msg;
136 //       msg << "Cannot retreive init reference string for port " << _name
137 //           << " on node " << _node->getName();
138 //       throw Exception(msg.str());      
139 //     }
140 }
141
142
143 OutputCppPort::OutputCppPort(const std::string& name, Node *node, TypeCode * type)
144   : OutputPort(name, node, type), DataPort(name, node, type), Port(node)
145 {
146   _data = NULL;
147 }
148
149 OutputCppPort::~OutputCppPort()
150 {
151   if(_data)
152     {
153       DEBTRACE("_data ref count: " << _data->getRefCnt());
154       _data->decrRef();
155     }
156 }
157
158 OutputCppPort::OutputCppPort(const OutputCppPort& other, Node *newHelder):OutputPort(other,newHelder),DataPort(other,newHelder),Port(other,newHelder),
159                                                                        _data(NULL)
160 {
161 }
162
163 void OutputCppPort::put(const void *data) throw(ConversionException)
164 {
165   put((YACS::ENGINE::Any *)data);
166 }
167
168 void OutputCppPort::put(YACS::ENGINE::Any *data) throw(ConversionException)
169 {
170   InputPort *p;
171   if(_data)
172     _data->decrRef();
173   _data = data;
174   if(_data)
175     _data->incrRef();
176   OutputPort::put(data);
177 }
178
179 OutputPort *OutputCppPort::clone(Node *newHelder) const
180 {
181   return new OutputCppPort(*this,newHelder);
182 }
183
184 YACS::ENGINE::Any * OutputCppPort::get() const
185 {
186   return _data;
187 }
188
189 std::string OutputCppPort::dump()
190 {
191   if( _data == NULL)
192     return "<value>None</value>";
193   string xmldump = convertNeutralXml(edGetType(), _data);
194   return xmldump;
195 }
196