Version: 6.5.0
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
Superv_Component_i.hxx
1 // Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 
23 // File : Superv_Component_i.hxx
24 // Author : André RIBES (EDF), Eric Fayolle (EDF)
25 // Module : KERNEL
26 //
27 #ifndef _SUPERV_COMPONENT_I_HXX_
28 #define _SUPERV_COMPONENT_I_HXX_
29 
30 #include "DSC_i.hxx"
31 #include "base_port.hxx"
32 #include "uses_port.hxx"
33 #include "provides_port.hxx"
34 #include "port_factory.hxx"
35 
36 #include "DSC_Exception.hxx"
37 #include <vector>
38 
39 //#define MYDEBUG
40 
54  public Engines_DSC_i,
55  virtual public POA_Engines::Superv_Component
56 {
57 public:
58  Superv_Component_i(CORBA::ORB_ptr orb,
59  PortableServer::POA_ptr poa,
60  PortableServer::ObjectId * contId,
61  const char *instanceName,
62  const char *interfaceName,
63  bool notif = false);
64  Superv_Component_i(CORBA::ORB_ptr orb,
65  PortableServer::POA_ptr poa,
66  Engines::Container_ptr container,
67  const char *instanceName,
68  const char *interfaceName,
69  bool notif = false,
70  bool regist = true );
71  virtual ~Superv_Component_i();
72 
73  // Exceptions declarations.
74  // There are defined on the Superv_Component_i.cxx to avoid problems
75  // from dlopen.
76  DSC_EXCEPTION(BadFabType);
77  DSC_EXCEPTION(BadType);
78  DSC_EXCEPTION(BadCast);
79  DSC_EXCEPTION(UnexpectedState);
80  DSC_EXCEPTION(PortAlreadyDefined);
81  DSC_EXCEPTION(PortNotDefined);
82  DSC_EXCEPTION(PortNotConnected);
83  DSC_EXCEPTION(NilPort);
84  DSC_EXCEPTION(BadProperty);
85 
90  {return NULL;}
91 
95  virtual provides_port * create_provides_data_and_control_port(const char* port_type)
96  {return NULL;}
97 
102  {return NULL;}
103 
107  virtual uses_port * create_uses_data_and_control_port(const char* port_type)
108  {return NULL;}
109 
120  virtual provides_port * create_provides_data_port(const std::string& port_fab_type)
121  throw (BadFabType);
122 
123 
134  virtual uses_port * create_uses_data_port(const std::string& port_fab_type)
135  throw (BadFabType);
136 
145  virtual void add_port(const char * port_fab_type,
146  const char * port_type,
147  const char * port_name)
148  throw (PortAlreadyDefined, BadFabType, BadType, BadProperty);
149 
159  template < typename SpecificPortType >
160  SpecificPortType * add_port(const char * port_fab_type,
161  const char * port_type,
162  const char * port_name)
163  throw (PortAlreadyDefined, BadFabType, BadType, BadCast, BadProperty);
164 
171  virtual void add_port(provides_port * port,
172  const char* provides_port_name)
173  throw (PortAlreadyDefined, NilPort, BadProperty);
174 
181  virtual void add_port(uses_port * port,
182  const char* uses_port_name)
183  throw (PortAlreadyDefined, NilPort, BadProperty);
184 
191  virtual void get_port(provides_port *& port,
192  const char* provides_port_name)
193  throw (PortNotDefined, PortNotConnected);
194 
201  virtual void get_port(uses_port *& port,
202  const char* uses_port_name)
203  throw (PortNotDefined, PortNotConnected);
204 
213  virtual void get_uses_port_names(std::vector<std::string> & port_names,
214  const std::string servicename="") const;
215 
222  template <typename SpecificPortType >
223  SpecificPortType * get_port( const char * port_name)
224  throw (PortNotDefined, PortNotConnected, BadCast, UnexpectedState);
225 
229  virtual void provides_port_changed(const char* provides_port_name,
230  int connection_nbr,
231  const Engines::DSC::Message message);
232 
236  virtual void uses_port_changed(const char* uses_port_name,
237  Engines::DSC::uses_port * new_uses_port,
238  const Engines::DSC::Message message);
239 
240 
249  static void register_factory(const std::string & factory_name,
250  port_factory * factory_ptr);
251 
258  virtual port_factory * get_factory(const std::string & factory_name);
259 
262  static long dscTimeOut;
263  static void setTimeOut();
264  void beginService(const char *serviceName);
265 
266 private:
267  // Factory map
268  typedef std::map<std::string, port_factory*> factory_map_t;
269  static factory_map_t _factory_map;
270 
271  /*-------------------------------------------------*/
272  // A Superv_Component port.
273  struct superv_port_t {
274  superv_port_t():u_ref(NULL),p_ref(NULL){};
275  ~superv_port_t()
276  {
277  if(u_ref)delete u_ref;
278  if(p_ref)
279  {
280  // do not delete CORBA servant : deactivate it and then call _remove_ref or delete
281  PortableServer::ServantBase* servant=dynamic_cast<PortableServer::ServantBase*>(p_ref);
282  if(servant)
283  {
284  PortableServer::POA_var poa =servant->_default_POA();
285  PortableServer::ObjectId_var oid = poa->servant_to_id(servant);
286  poa->deactivate_object(oid);
287  servant->_remove_ref();
288  }
289  }
290  };
291  // For uses ports.
292  uses_port * u_ref;
293  // For provides ports.
294  provides_port * p_ref;
295  };
296 
297  typedef std::map<std::string, superv_port_t *> superv_ports;
298 
299  /*-------------------------------------------------*/
300  /*-------------------------------------------------*/
301 
302  superv_ports my_superv_ports;
303  superv_ports::iterator my_superv_ports_it;
304 };
305 
306 
307 
308 template < typename SpecificPortType > SpecificPortType *
309 Superv_Component_i::add_port(const char * port_fab_type,
310  const char * port_type,
311  const char * port_name)
312  throw (PortAlreadyDefined, BadFabType, BadType, BadCast, BadProperty)
313 {
314  assert(port_fab_type);
315  assert(port_type);
316  assert(port_name);
317  SpecificPortType * retPort;
318 
319 #ifdef MYDEBUG
320  std::cout << "---- Superv_Component_i::add_port : Mark 0 ---- " << port_name << "----" << std::endl;
321 #endif
322 
323  std::string s_port_type(port_type);
324  if (s_port_type == "provides") {
325  provides_port * port = create_provides_data_port(port_fab_type);
326  add_port(port, port_name);
327  retPort = dynamic_cast<SpecificPortType *>(port);
328  if ( retPort == NULL ) { delete port;
329  throw BadCast( LOC("Can't cast to asked port type " ));
330  }
331  }
332  else if (s_port_type == "uses") {
333  uses_port * port = create_uses_data_port(port_fab_type);
334  add_port(port, port_name);
335 #ifdef MYDEBUG
336  std::cout << "---- Superv_Component_i::add_port : Mark 1 ---- " << port << "----" << std::endl;
337  std::cout << "---- Superv_Component_i::add_port : Mark 1 ---- get_repository_id()" << port->get_repository_id() << std::endl;
338 #endif
339  retPort = dynamic_cast<SpecificPortType *>(port);
340 #ifdef MYDEBUG
341  std::cout << "---- Superv_Component_i::add_port : Mark 2 ---- " << retPort << "----" << std::endl;
342 #endif
343  if ( retPort == NULL ) { delete port;
344  throw BadCast( LOC("Can't cast to asked port type " ));
345  }
346  }
347  else
348  throw BadType(LOC(OSS()<< "port_type must be either 'provides' either 'uses' not "
349  << port_type));
350 
351  return retPort;
352 };
353 
354 
355 template <typename SpecificPortType > SpecificPortType *
356 Superv_Component_i::get_port( const char * port_name)
358 {
359  assert(port_name);
360 
361  SpecificPortType * retPort;
362  base_port * port;
363 
364  my_superv_ports_it = my_superv_ports.find(port_name);
365  if (my_superv_ports_it == my_superv_ports.end())
366  {
367  throw PortNotDefined( LOC(OSS()<< "Port " << port_name <<" does not exist"));
368  }
369 
370  superv_port_t * superv_port = my_superv_ports[port_name];
371  try {
372  if ( superv_port->p_ref != NULL ) {
373  port = superv_port->p_ref;
374  Ports::Port_var portref=Engines_DSC_interface::get_provides_port(port_name, false);
375  }
376  else if ( superv_port->u_ref != NULL ) {
377  port = superv_port->u_ref;
379  delete portseq;
380  } else {
381  throw UnexpectedState( LOC(OSS()<< "Internal Error superv_port struct is inconsistent "));
382 
383  }
384  } catch (const Engines::DSC::PortNotDefined&) {
385  throw PortNotDefined( LOC(OSS()<< "port "
386  << port_name <<" does not exist."));
387  } catch (const Engines::DSC::PortNotConnected&) {
388  throw PortNotConnected( LOC(OSS()<< "port " << port_name
389  << " is not connected."));
390  }
391 
392  retPort = dynamic_cast<SpecificPortType *>(port);
393  if ( retPort == NULL ) {
394  throw BadCast( LOC("Can't cast to required port type " ));
395  }
396 
397  return retPort;
398 };
399 
400 
401 #endif
Copyright © 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
Copyright © 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS