Version: 6.5.0
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)
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
This class implements DSC_User component.
Definition: Superv_Component_i.hxx:53
Definition: Superv_Component_i.hxx:81
This class implements the interface Engines::DSC.
Definition: DSC_i.hxx:45
static void register_factory(const std::string &factory_name, port_factory *factory_ptr)
Definition: Superv_Component_i.cxx:80
Definition: Superv_Component_i.hxx:77
Definition: Superv_Component_i.hxx:78
char * instanceName()
Definition: Component_i.cxx:212
Definition: Superv_Component_i.hxx:80
virtual const char * get_repository_id()=0
virtual void get_port(provides_port *&port, const char *provides_port_name)
Definition: Superv_Component_i.cxx:249
virtual void get_uses_port_names(std::vector< std::string > &port_names, const std::string servicename="") const
Definition: Superv_Component_i.cxx:316
Definition: base_port.hxx:35
virtual void uses_port_changed(const char *uses_port_name, Engines::DSC::uses_port *new_uses_port, const Engines::DSC::Message message)
Definition: Superv_Component_i.cxx:301
char * interfaceName()
Definition: Component_i.cxx:223
virtual provides_port * create_provides_data_and_control_port(const char *port_type)
Definition: Superv_Component_i.hxx:95
sequence< Ports::Port > uses_port
a uses port
Definition: DSC_Engines.idl:73
Definition: Superv_Component_i.hxx:79
virtual provides_port * create_provides_data_port(const std::string &port_fab_type)
Definition: Superv_Component_i.cxx:106
virtual provides_port * create_provides_control_port()
Definition: Superv_Component_i.hxx:89
This exception is raised when a port is used before it is added to the component. ...
Definition: DSC_Engines.idl:84
virtual Ports::Port_ptr get_provides_port(const char *provides_port_name, const CORBA::Boolean connection_error)
Definition: DSC_interface.cxx:114
Definition: Superv_Component_i.hxx:84
virtual uses_port * create_uses_data_and_control_port(const char *port_type)
Definition: Superv_Component_i.hxx:107
Definition: Superv_Component_i.hxx:76
Definition: Superv_Component_i.hxx:83
virtual port_factory * get_factory(const std::string &factory_name)
Definition: Superv_Component_i.cxx:92
virtual void add_port(const char *port_fab_type, const char *port_type, const char *port_name)
Definition: Superv_Component_i.cxx:156
virtual Engines::DSC::uses_port * get_uses_port(const char *uses_port_name)
Definition: DSC_i.hxx:111
virtual void provides_port_changed(const char *provides_port_name, int connection_nbr, const Engines::DSC::Message message)
Definition: Superv_Component_i.cxx:290
This class implements a DSC_User provides C++ port.
Definition: provides_port.hxx:40
This class implements a DSC_User uses C++ port.
Definition: uses_port.hxx:43
Message
This enumeration is used when the connection of a port (uses or provides) is changed.
Definition: DSC_Engines.idl:79
This exception is raised when you try to use a port that is not connected.
Definition: DSC_Engines.idl:90
virtual uses_port * create_uses_data_port(const std::string &port_fab_type)
Definition: Superv_Component_i.cxx:131
Definition: Superv_Component_i.hxx:82
This class is an abstract for all the DSC ports factories that have to be registered into the compone...
Definition: port_factory.hxx:37
virtual uses_port * create_uses_control_port()
Definition: Superv_Component_i.hxx:101
Class OSS is useful when streaming data through a function that expect a string as parameter...
Definition: DSC_Exception.hxx:64
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