11 #ifndef HPP_CORBASERVER_SERVANT_BASE_HH 12 # define HPP_CORBASERVER_SERVANT_BASE_HH 52 #define SERVANT_BASE_TYPEDEFS(idlObj, hppObj) \ 54 using ::hpp::corbaServer::AbstractServantBase<hppObj>::server_; \ 57 typedef _Storage Storage; \ 58 typedef idlObj Object; \ 59 typedef idlObj ## _ptr Object_ptr; \ 60 typedef idlObj ## _var Object_var; \ 61 typedef ::hpp::corbaServer::ServantBase<hppObj, _Storage> _ServantBase; \ 62 using _ServantBase::get; \ 63 using _ServantBase::getT; \ 64 using _ServantBase::getS 87 virtual TShPtr_t
get()
const = 0;
111 virtual TShPtr_t
get ()
const 113 TWkPtr_t wk ((StorageElementWkPtr_t) wrappedObject_);
121 StorageElementShPtr_t
getT ()
const 123 StorageElementWkPtr_t wk ((StorageElementWkPtr_t) wrappedObject_);
133 return wrappedObject_;
139 if (persistant) p_ =
get();
151 persistantStorage(
false);
154 PortableServer::Servant servant =
dynamic_cast<PortableServer::Servant
>(
this);
156 throw Error (
"The object was deleted. I could not delete the servant.");
157 this->server_->removeServant (servant);
159 PortableServer::ObjectId_var objectId
160 = this->server_->poa()->servant_to_id(servant);
161 this->server_->poa()->deactivate_object(objectId.in());
168 persistantStorage (
true);
174 void objectExpired ()
const 177 PortableServer::Servant servant =
dynamic_cast<PortableServer::Servant
>(
const_cast<ServantBase*
>(
this));
179 throw Error (
"The object was deleted. I could not delete the servant.");
180 this->server_->removeServant (servant);
182 PortableServer::ObjectId_var objectId
183 = this->server_->poa()->servant_to_id(servant);
184 this->server_->poa()->deactivate_object(objectId.in());
185 throw Error (
"The object has been deleted. I delete the servant.");
214 operator shared_ptr<T > ()
const {
return element.lock(); }
215 operator weak_ptr <T > ()
const {
return element; }
220 operator bool ()
const {
return use_count()>0; }
227 PortableServer::Servant s = server->
poa()->reference_to_servant(p);
228 if (s == NULL)
throw Error (
"The servant is not located here");
229 return dynamic_cast<S*
> (s);
236 ServantBase_var s = server->
poa()->reference_to_servant(p);
237 if (s.in() == NULL)
throw Error (
"The servant is not located here");
252 S* servant =
dynamic_cast<S*
> (server->
getServant (servantKey));
253 if (servant != NULL) {
255 return servant->_this();
258 PortableServer::Servant_var<S> d (s);
260 PortableServer::ObjectId_var servantId = server->
poa()->activate_object(d);
271 template <
typename U,
typename V,
template<
typename>
class StorageTpl>
272 struct storage_cast_impl {
273 static StorageTpl<U> run (
const StorageTpl<V>& o) {
274 return o.template cast<U>();
279 template <
typename U,
typename V>
280 struct storage_cast_impl<U, V, shared_ptr> {
281 static shared_ptr<U> run (
const shared_ptr<V>& o) {
282 return dynamic_pointer_cast<U>(o);
287 template <
typename U,
typename V>
288 struct storage_cast_impl<U, V, weak_ptr> {
289 static weak_ptr<U> run (
const weak_ptr<V>& o) {
290 return dynamic_pointer_cast<U>(o.lock());
297 template <
typename U,
typename V,
template<
typename>
class StorageTpl>
298 static StorageTpl<U> storage_cast(
const StorageTpl<V>& o)
300 return details::storage_cast_impl<U, V, StorageTpl>::run (o);
307 ServantBase_var s = server->
poa()->reference_to_servant(p);
308 if (s.in() == NULL)
throw Error (
"The servant is not located here");
311 if (asb == NULL)
throw Error (
"Not an object of the correct type.");
312 auto ret = storage_cast<T>(asb->
get());
313 if (!ret)
throw Error(
"Object is not of the correct type.");
320 template <
typename ServantBaseType>
324 typedef typename ServantBaseType::Storage
Storage;
329 virtual Object_var servant (
Server* server,
const Storage& obj) = 0;
342 template <
typename ServantBaseType,
typename ServantType>
353 typedef typename ServantType::Storage
Storage;
354 Storage u = storage_cast<
typename Storage::element_type>(o);
356 if (u.use_count()>0) ret = makeServant <Object_var> (s,
new ServantType (s, u));
361 template <
typename ServantBaseType>
362 std::vector< ServantFactoryBase<ServantBaseType>* >&
objectDowncasts ();
364 template <
typename ServantBaseType>
367 typedef std::vector< ServantFactoryBase<ServantBaseType>* >
vector_t;
368 typedef typename vector_t::iterator iterator;
370 vector_t& vec = objectDowncasts<ServantBaseType>();
372 for (iterator _obj = vec.begin(); _obj != vec.end(); ++_obj) {
373 if (d >= (*_obj)->depth()) {
374 vec.insert(_obj,
object);
378 vec.push_back(
object);
383 template <
typename ServantBaseType,
typename ReturnType>
386 typedef typename ServantBaseType::Object_var BaseObject_var;
387 typedef typename ReturnType::Object_var Object_var;
388 BaseObject_var servant;
389 assert (CORBA::Object_Helper::is_nil(servant.in()));
391 typedef std::vector< ServantFactoryBase<ServantBaseType>* >
vector_t;
392 typedef typename vector_t::iterator iterator;
394 vector_t& vec = objectDowncasts<ServantBaseType>();
395 for (iterator _obj = vec.begin(); _obj != vec.end(); ++_obj) {
396 servant = (*_obj)->servant(server, t);
397 if (!CORBA::Object_Helper::is_nil(servant.in())) {
399 return Object_var (ReturnType::Object::_narrow (servant._retn()));
405 template <
typename ServantBaseType>
410 typedef typename ServantBaseType::Object_var Object_var;
412 assert (CORBA::Object_Helper::is_nil(servant.in()));
414 typedef std::vector< ServantFactoryBase<ServantBaseType>* >
vector_t;
415 typedef typename vector_t::iterator iterator;
417 vector_t& vec = objectDowncasts<ServantBaseType>();
418 for (iterator _obj = vec.begin(); _obj != vec.end(); ++_obj) {
419 servant = (*_obj)->servant(server, t);
420 if (!CORBA::Object_Helper::is_nil(servant.in()))
break;
426 template <
typename OutType,
typename InnerBaseType,
typename InnerType = InnerBaseType>
433 template <
typename InContainer>
434 inline OutType* operator() (
const InContainer& input)
436 std::size_t len = std::distance (input.begin(), input.end());
437 OutType* seq =
new OutType ();
438 seq->length ((CORBA::ULong) len);
441 typename InContainer::const_iterator it = input.begin();
442 while (it != input.end()) {
444 InnerType> (wrappedObject_, *it)._retn();
464 #define HPP_CORBASERVER_ADD_DOWNCAST_OBJECT(ServantType, BaseServantType, depth) \ 465 struct HPP_CORE_DLLAPI __InitializerClass_##ServantType { \ 466 __InitializerClass_##ServantType () { \ 467 ::hpp::corbaServer::addDowncastObjects<BaseServantType> \ 468 ( new ::hpp::corbaServer::ServantFactory<BaseServantType, ServantType> (depth)); \ 471 HPP_CORBASERVER_DLLLOCAL __InitializerClass_##ServantType __instance_##ServantType; 473 #endif // HPP_CORBASERVER_SERVANT_BASE_HH Definition: servant-base.hh:100
auto reference_to_object(Server *server, const P &p)
Definition: servant-base.hh:305
PortableServer::Servant_var< PortableServer::ServantBase > ServantBase_var
Definition: servant-base.hh:223
std::vector< ServantFactoryBase< ServantBaseType > *> & objectDowncasts()
ServantFactory(const size_type &depth)
Definition: servant-base.hh:348
Definition: servant-base.hh:343
ServantBaseType::Object_var Object_var
Definition: servant-base.hh:325
Implement CORBA interface ``Obstacle''.
Definition: basic-server.hh:27
AbstractServantBase(Server *server)
Definition: servant-base.hh:95
weak_ptr< typename Storage::element_type > StorageElementWkPtr_t
Definition: servant-base.hh:106
AbstractServantBase< T > * reference_to_servant_base(Server *server, const P &p)
Definition: servant-base.hh:234
T element_type
Definition: servant-base.hh:219
ptr_t element
Definition: servant-base.hh:211
size_type depth() const
Definition: servant-base.hh:334
Abstract class used to avoid duplication of the servants.
Definition: servant-base.hh:69
PortableServer::Servant_var< S > reference_to_servant(Server *server, const P &p)
Definition: servant-base.hh:225
virtual TShPtr_t get() const =0
void addServantKeyAndServant(ServantKey servantKey, PortableServer::Servant servant)
Server * server_
Definition: servant-base.hh:97
Corba exception travelling through the Corba channel.
Definition: common.idl:25
Storage wrappedObject_
Definition: servant-base.hh:171
Definition: servant-base.hh:206
bool persistantStorage() const
See persistantStorage(bool)
Definition: servant-base.hh:144
Definition: servant-base.hh:321
void addDowncastObjects(ServantFactoryBase< ServantBaseType > *const object)
Definition: servant-base.hh:365
pinocchio::vector_t vector_t
Definition: fwd.hh:89
const Storage & getS() const
Definition: servant-base.hh:131
ReturnType::Object_var makeServantDownCast(Server *server, const typename ServantBaseType::Storage &t)
Definition: servant-base.hh:384
PortableServer::POA_var poa()
Definition: server.hh:88
ServantBase(Server *server, const Storage &_s)
Definition: servant-base.hh:165
P makeServant(Server *server, S *s)
Definition: servant-base.hh:249
Server * wrappedObject_
Definition: servant-base.hh:429
AbstractStorage(const ptr_t &_element)
Definition: servant-base.hh:213
ServantBaseType::Object_var Object_var
Definition: servant-base.hh:345
virtual ~ServantBase()
Definition: servant-base.hh:109
vectorToSeqServant(Server *_s)
Definition: servant-base.hh:431
Definition: servant-base.hh:427
virtual Object_var servant(Server *s, const StorageBase &o)
Definition: servant-base.hh:351
weak_ptr< T > ptr_t
Definition: servant-base.hh:209
ServantBaseType::Storage StorageBase
Definition: servant-base.hh:346
Implementation of Hpp module Corba server.
Definition: server.hh:54
virtual Server::ServantKey getServantKey() const
Definition: servant-base.hh:89
PortableServer::Servant getServant(ServantKey servantKey) const
shared_ptr< typename Storage::element_type > StorageElementShPtr_t
Definition: servant-base.hh:107
Definition: servant-base.hh:79
void persistantStorage(bool persistant)
Set to true if the servant should take ownership of this object.
Definition: servant-base.hh:137
void * ServantKey
Definition: server.hh:146
Definition: servant-base.hh:66
shared_ptr< T > TShPtr_t
Definition: servant-base.hh:84
_Storage Storage
Definition: servant-base.hh:103
StorageElementShPtr_t getT() const
Definition: servant-base.hh:121
_CORBA_MODULE hpp _CORBA_MODULE_BEG _CORBA_MODULE core_idl _CORBA_MODULE_BEG typedef ::CORBA::ULongLong size_t
Definition: paths-idl.hh:75
void deleteThis()
Definition: servant-base.hh:149
weak_ptr< T > TWkPtr_t
Definition: servant-base.hh:85
ServantBaseType::Storage Storage
Definition: servant-base.hh:324
long use_count() const
Definition: servant-base.hh:216
pinocchio::size_type size_type
Definition: fwd.hh:92
virtual ~AbstractServantBase()
Definition: servant-base.hh:82
ServantFactoryBase(const size_type &depth)
Definition: servant-base.hh:327