1 // Copyright (C) 2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // File : DSC_interface.cxx
23 // Author : André RIBES (EDF)
27 #include "DSC_interface.hxx"
29 Engines_DSC_interface::Engines_DSC_interface() {}
31 Engines_DSC_interface::~Engines_DSC_interface()
33 my_ports_it = my_ports.begin();
34 for(;my_ports_it != my_ports.end();my_ports_it++)
35 delete my_ports_it->second;
40 Engines_DSC_interface::add_provides_port(Ports::Port_ptr ref,
41 const char* provides_port_name,
42 Ports::PortProperties_ptr port_prop)
43 throw (Engines::DSC::PortAlreadyDefined,
44 Engines::DSC::NilPort,
45 Engines::DSC::BadProperty)
48 assert(provides_port_name);
49 if (CORBA::is_nil(ref))
50 throw Engines::DSC::NilPort();
51 if (CORBA::is_nil(port_prop))
52 throw Engines::DSC::BadProperty();
54 my_ports_it = my_ports.find(provides_port_name);
55 if (my_ports_it == my_ports.end()) {
56 // Creating a new port provides
57 port_t * new_port = new port_t();
58 new_port->type = provides;
59 new_port->connection_nbr = 0;
60 new_port->provides_port_ref = Ports::Port::_duplicate(ref);
61 new_port->port_prop = Ports::PortProperties::_duplicate(port_prop);
63 // Port into the port's map
64 my_ports[provides_port_name] = new_port;
67 throw Engines::DSC::PortAlreadyDefined();
71 Engines_DSC_interface::add_uses_port(const char* repository_id,
72 const char* uses_port_name,
73 Ports::PortProperties_ptr port_prop)
74 throw (Engines::DSC::PortAlreadyDefined,
75 Engines::DSC::BadProperty)
78 // Note : We can't be shure that repository id
79 // is a correct CORBA id.
80 assert(repository_id);
81 assert(uses_port_name);
82 if (CORBA::is_nil(port_prop))
83 throw Engines::DSC::BadProperty();
85 my_ports_it = my_ports.find(uses_port_name);
86 if (my_ports_it == my_ports.end()) {
87 // Creating a new uses port
88 port_t * new_port = new port_t();
89 new_port->type = uses;
90 new_port->connection_nbr = 0;
91 new_port->uses_port_refs.length(0);
92 new_port->repository_id = repository_id;
93 new_port->port_prop = Ports::PortProperties::_duplicate(port_prop);
95 // Port into port's map
96 my_ports[uses_port_name] = new_port;
99 throw Engines::DSC::PortAlreadyDefined();
103 Engines_DSC_interface::get_provides_port(const char* provides_port_name,
104 const CORBA::Boolean connection_error)
105 throw (Engines::DSC::PortNotDefined,
106 Engines::DSC::PortNotConnected,
107 Engines::DSC::BadPortType)
110 assert(provides_port_name);
112 Ports::Port_ptr rtn_port = Ports::Port::_nil();
113 // std::cout << "---- DSC_Interface : MARK 1 ---- Recherche de : " << provides_port_name << "----" << std::endl;
114 // ports::iterator it;
115 // std::cout << "----> ";
116 // for(it=my_ports.begin();it!=my_ports.end();++it)
117 // std::cout << "|"<<(*it).first<<"|, ";
118 // std::cout << std::endl;
120 // Searching the port
121 my_ports_it = my_ports.find(provides_port_name);
122 if (my_ports_it == my_ports.end())
123 throw Engines::DSC::PortNotDefined();
124 if (my_ports[provides_port_name]->type != provides) {
125 Engines::DSC::BadPortType BPT;
126 BPT.expected = CORBA::string_dup("Expected a provides port");
127 BPT.received = CORBA::string_dup((std::string("Received a uses/none port : ")+provides_port_name).c_str());
131 if (my_ports[provides_port_name]->connection_nbr == 0 && connection_error)
132 throw Engines::DSC::PortNotConnected();
134 rtn_port = Ports::Port::_duplicate(my_ports[provides_port_name]->provides_port_ref);
138 Engines::DSC::uses_port *
139 Engines_DSC_interface::get_uses_port(const char* uses_port_name)
140 throw (Engines::DSC::PortNotDefined,
141 Engines::DSC::PortNotConnected,
142 Engines::DSC::BadPortType)
145 assert(uses_port_name);
147 Engines::DSC::uses_port * rtn_port = NULL;
149 // Searching the uses port
150 my_ports_it = my_ports.find(uses_port_name);
151 if (my_ports_it == my_ports.end())
152 throw Engines::DSC::PortNotDefined();
153 if (my_ports[uses_port_name]->type != uses){
154 Engines::DSC::BadPortType BPT;
155 BPT.expected = CORBA::string_dup("Expected a uses port");
156 BPT.received = CORBA::string_dup((std::string("Received a provides/none port : ")+uses_port_name).c_str());
157 std::cout << "---- DSC_Interface : MARK 1 ---- exception : " << uses_port_name << "----" << std::endl;
161 // Is the port connected ?
162 if (my_ports[uses_port_name]->connection_nbr > 0) {
163 rtn_port = new Engines::DSC::uses_port(my_ports[uses_port_name]->uses_port_refs);
167 std::cout << "---- DSC_Interface : MARK 2 ---- exception : " << uses_port_name << "----" << std::endl;
168 throw Engines::DSC::PortNotConnected();
175 Engines_DSC_interface::connect_provides_port(const char* provides_port_name)
176 throw (Engines::DSC::PortNotDefined)
179 assert(provides_port_name);
181 // Searching the provides port
182 my_ports_it = my_ports.find(provides_port_name);
183 if (my_ports_it == my_ports.end())
184 throw Engines::DSC::PortNotDefined();
185 if (my_ports[provides_port_name]->type != provides)
186 throw Engines::DSC::PortNotDefined();
189 // Adding a new connection
190 my_ports[provides_port_name]->connection_nbr += 1;
191 // User code is informed
192 provides_port_changed(provides_port_name,
193 my_ports[provides_port_name]->connection_nbr,
194 Engines::DSC::AddingConnection
199 Engines_DSC_interface::connect_uses_port(const char* uses_port_name,
200 Ports::Port_ptr provides_port_ref)
201 throw (Engines::DSC::PortNotDefined,
202 Engines::DSC::BadPortType,
203 Engines::DSC::NilPort)
206 assert(uses_port_name);
208 if (CORBA::is_nil(provides_port_ref))
209 throw Engines::DSC::NilPort();
211 // Searching the uses port
212 my_ports_it = my_ports.find(uses_port_name);
213 if (my_ports_it == my_ports.end())
214 throw Engines::DSC::PortNotDefined();
215 if (my_ports[uses_port_name]->type != uses) {
216 Engines::DSC::BadPortType BPT;
217 BPT.expected = CORBA::string_dup("Expected a uses port");
218 BPT.received = CORBA::string_dup((std::string("Received a provides/none port : ")+uses_port_name).c_str());
222 // repository_id test
223 const char * repository_id = my_ports[uses_port_name]->repository_id.c_str();
224 if (provides_port_ref->_is_a(repository_id))
226 // Adding provides port into the uses port sequence
227 CORBA::ULong lgth = my_ports[uses_port_name]->uses_port_refs.length();
228 my_ports[uses_port_name]->
229 uses_port_refs.length(lgth + 1);
230 my_ports[uses_port_name]->uses_port_refs[lgth] =
231 Ports::Port::_duplicate(provides_port_ref);
233 // Adding a new connection
234 my_ports[uses_port_name]->connection_nbr += 1;
235 // User code is informed
236 uses_port_changed(uses_port_name,
237 new Engines::DSC::uses_port(my_ports[uses_port_name]->uses_port_refs),
238 Engines::DSC::AddingConnection);
241 Engines::DSC::BadPortType BPT;
242 BPT.expected = CORBA::string_dup("Expected ...");
243 BPT.received = CORBA::string_dup((std::string("Received an incorrect repository id type ")+
244 repository_id).c_str());
251 Engines_DSC_interface::is_connected(const char* port_name)
252 throw (Engines::DSC::PortNotDefined)
254 CORBA::Boolean rtn = false;
259 my_ports_it = my_ports.find(port_name);
260 if (my_ports_it == my_ports.end())
261 throw Engines::DSC::PortNotDefined();
264 if (my_ports[port_name]->connection_nbr > 0)
271 Engines_DSC_interface::disconnect_provides_port(const char* provides_port_name,
272 const Engines::DSC::Message message)
273 throw (Engines::DSC::PortNotDefined,
274 Engines::DSC::PortNotConnected)
277 assert(provides_port_name);
279 my_ports_it = my_ports.find(provides_port_name);
280 if (my_ports_it == my_ports.end())
281 throw Engines::DSC::PortNotDefined();
282 if (my_ports[provides_port_name]->type != provides)
283 throw Engines::DSC::PortNotDefined();
286 if (my_ports[provides_port_name]->connection_nbr > 0)
288 my_ports[provides_port_name]->connection_nbr -= 1;
289 provides_port_changed(provides_port_name,
290 my_ports[provides_port_name]->connection_nbr,
294 throw Engines::DSC::PortNotConnected();
298 Engines_DSC_interface::disconnect_uses_port(const char* uses_port_name,
299 Ports::Port_ptr provides_port_ref,
300 const Engines::DSC::Message message)
301 throw (Engines::DSC::PortNotDefined,
302 Engines::DSC::PortNotConnected,
303 Engines::DSC::BadPortReference)
306 assert(uses_port_name);
308 my_ports_it = my_ports.find(uses_port_name);
309 if (my_ports_it == my_ports.end())
310 throw Engines::DSC::PortNotDefined();
311 if (my_ports[uses_port_name]->type != uses)
312 throw Engines::DSC::PortNotDefined();
314 if (CORBA::is_nil(provides_port_ref))
315 throw Engines::DSC::BadPortReference();
318 if (my_ports[uses_port_name]->connection_nbr > 0) {
319 CORBA::Long port_index = -1;
320 CORBA::ULong seq_length = my_ports[uses_port_name]->uses_port_refs.length();
321 for(int i = 0; i < seq_length; i++)
323 if (my_ports[uses_port_name]->uses_port_refs[i]->_is_equivalent(provides_port_ref))
329 if (port_index == -1)
330 throw Engines::DSC::BadPortReference();
332 my_ports[uses_port_name]->connection_nbr -= 1;
333 Engines::DSC::uses_port * new_uses_port =
334 new Engines::DSC::uses_port();
335 new_uses_port->length(seq_length - 1);
337 int index_ancien = 0;
338 int index_nouveau = 0;
339 for(;index_ancien < seq_length;) {
340 if (index_ancien == port_index)
343 // On ne change pas le index du nouveau tableau
348 (*new_uses_port)[index_nouveau] = my_ports[uses_port_name]->uses_port_refs[index_ancien];
354 // New uses port's sequence
355 my_ports[uses_port_name]->uses_port_refs = *new_uses_port;
357 // The user code is informed
358 uses_port_changed(uses_port_name,
363 throw Engines::DSC::PortNotConnected();
366 Ports::PortProperties_ptr
367 Engines_DSC_interface::get_port_properties(const char* port_name)
368 throw (Engines::DSC::PortNotDefined)
370 Ports::PortProperties_ptr rtn_properties = Ports::PortProperties::_nil();
375 my_ports_it = my_ports.find(port_name);
376 if (my_ports_it == my_ports.end())
377 throw Engines::DSC::PortNotDefined();
379 rtn_properties = Ports::PortProperties::_duplicate(my_ports[port_name]->port_prop);
380 return rtn_properties;