34#ifndef HPP_CORBASERVER_SERVANT_BASE_HH
35#define HPP_CORBASERVER_SERVANT_BASE_HH
41namespace corbaServer {
73#define SERVANT_BASE_TYPEDEFS(idlObj, hppObj) \
75 using ::hpp::corbaServer::AbstractServantBase<hppObj>::server_; \
79 typedef _Storage Storage; \
80 typedef idlObj Object; \
81 typedef idlObj##_ptr Object_ptr; \
82 typedef idlObj##_var Object_var; \
83 typedef ::hpp::corbaServer::ServantBase<hppObj, _Storage> _ServantBase; \
84 using _ServantBase::get; \
85 using _ServantBase::getT; \
86 using _ServantBase::getS
121template <
typename T,
typename _Storage>
172 PortableServer::Servant servant =
173 dynamic_cast<PortableServer::Servant
>(
this);
175 throw Error(
"The object was deleted. I could not delete the servant.");
178 PortableServer::ObjectId_var
objectId =
180 this->
server_->
poa()->deactivate_object(objectId.in());
200 void objectExpired()
const {
202 PortableServer::Servant servant =
203 dynamic_cast<PortableServer::Servant
>(
const_cast<ServantBase*
>(
this));
205 throw Error(
"The object was deleted. I could not delete the servant.");
208 PortableServer::ObjectId_var
objectId =
210 this->
server_->
poa()->deactivate_object(objectId.in());
211 throw Error(
"The object has been deleted. I delete the servant.");
232template <
typename T,
typename Base>
249typedef PortableServer::Servant_var<PortableServer::ServantBase>
252template <
typename S,
typename P>
255 PortableServer::Servant
s =
server->poa()->reference_to_servant(
p);
256 if (
s ==
NULL)
throw Error(
"The servant is not located here");
257 return dynamic_cast<S*
>(
s);
262template <
typename T,
typename P>
265 if (
s.in() ==
NULL)
throw Error(
"The servant is not located here");
278template <
typename P,
typename S>
282 if (servant !=
NULL) {
284 return servant->_this();
287 PortableServer::Servant_var<S>
d(
s);
299template <
typename U,
typename V,
template <
typename>
class StorageTpl>
301 static StorageTpl<U> run(
const StorageTpl<V>& o) {
302 return o.template cast<U>();
307template <
typename U,
typename V>
309 static shared_ptr<U> run(
const shared_ptr<V>& o) {
310 return dynamic_pointer_cast<U>(o);
315template <
typename U,
typename V>
317 static weak_ptr<U> run(
const weak_ptr<V>& o) {
318 return dynamic_pointer_cast<U>(o.lock());
325template <
typename U,
typename V,
template <
typename>
class StorageTpl>
327 return details::storage_cast_impl<U, V, StorageTpl>::run(
o);
332template <
typename T,
typename P>
335 if (
s.in() ==
NULL)
throw Error(
"The servant is not located here");
339 if (
asb ==
NULL)
throw Error(
"Not an object of the correct type.");
341 if (!
ret)
throw Error(
"Object is not of the correct type.");
348template <
typename ServantBaseType>
351 typedef typename ServantBaseType::Storage
Storage;
367template <
typename ServantBaseType,
typename ServantType>
376 typedef typename ServantType::Storage
Storage;
379 if (
u.use_count() > 0)
385template <
typename ServantBaseType>
388template <
typename ServantBaseType>
390 typedef std::vector<ServantFactoryBase<ServantBaseType>*>
vector_t;
391 typedef typename vector_t::iterator
iterator;
396 if (
d >= (*_obj)->depth()) {
401 vec.push_back(
object);
406template <
typename ServantBaseType,
typename ReturnType>
408 Server*
server,
const typename ServantBaseType::Storage&
t) {
410 typedef typename ReturnType::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;
419 servant = (*_obj)->servant(
server,
t);
420 if (!CORBA::Object_Helper::is_nil(servant.in())) {
422 return Object_var(ReturnType::Object::_narrow(servant._retn()));
428template <
typename ServantBaseType>
430 Server*
server,
const typename ServantBaseType::Storage&
t) {
433 typedef typename ServantBaseType::Object_var Object_var;
435 assert(CORBA::Object_Helper::is_nil(servant.in()));
437 typedef std::vector<ServantFactoryBase<ServantBaseType>*>
vector_t;
438 typedef typename vector_t::iterator
iterator;
442 servant = (*_obj)->servant(
server,
t);
443 if (!CORBA::Object_Helper::is_nil(servant.in()))
break;
456 template <
typename InContainer>
460 seq->length((CORBA::ULong)
len);
463 typename InContainer::const_iterator
it =
input.begin();
465 (*seq)[(CORBA::ULong)
i] =
487#define HPP_CORBASERVER_ADD_DOWNCAST_OBJECT(ServantType, BaseServantType, \
489 struct HPP_CORE_DLLAPI __InitializerClass_##ServantType { \
490 __InitializerClass_##ServantType() { \
491 ::hpp::corbaServer::addDowncastObjects<BaseServantType>( \
492 new ::hpp::corbaServer::ServantFactory<BaseServantType, \
493 ServantType>(depth)); \
496 HPP_CORBASERVER_DLLLOCAL __InitializerClass_##ServantType \
497 __instance_##ServantType;
Definition servant-base.hh:104
weak_ptr< T > TWkPtr_t
Definition servant-base.hh:109
virtual ~AbstractServantBase()
Definition servant-base.hh:106
shared_ptr< T > TShPtr_t
Definition servant-base.hh:108
AbstractServantBase(Server *server)
Definition servant-base.hh:116
Server * server_
Definition servant-base.hh:118
virtual TShPtr_t get() const =0
virtual Server::ServantKey getServantKey() const
Definition servant-base.hh:113
Abstract class used to avoid duplication of the servants.
Definition servant-base.hh:92
virtual bool expired() const =0
virtual Server::ServantKey getServantKey() const =0
Definition servant-base.hh:233
long use_count() const
Definition servant-base.hh:242
weak_ptr< T > ptr_t
Definition servant-base.hh:235
T element_type
Definition servant-base.hh:245
ptr_t element
Definition servant-base.hh:237
AbstractStorage(const ptr_t &_element)
Definition servant-base.hh:239
Definition servant-base.hh:122
void deleteThis()
Definition servant-base.hh:168
bool persistantStorage() const
See persistantStorage(bool)
Definition servant-base.hh:166
virtual ~ServantBase()
Definition servant-base.hh:130
const Storage & getS() const
Definition servant-base.hh:155
_Storage Storage
Definition servant-base.hh:124
Storage wrappedObject_
Definition servant-base.hh:197
bool deleteIfExpired()
Definition servant-base.hh:183
ServantBase(Server *server, const Storage &_s)
Definition servant-base.hh:192
weak_ptr< typename Storage::element_type > StorageElementWkPtr_t
Definition servant-base.hh:127
shared_ptr< typename Storage::element_type > StorageElementShPtr_t
Definition servant-base.hh:128
bool expired() const final
Definition servant-base.hh:141
void persistantStorage(bool persistant)
Set to true if the servant should take ownership of this object.
Definition servant-base.hh:158
StorageElementShPtr_t getT() const
Definition servant-base.hh:146
virtual TShPtr_t get() const
Definition servant-base.hh:132
Definition servant-base.hh:349
ServantBaseType::Object_var Object_var
Definition servant-base.hh:352
size_type depth() const
Definition servant-base.hh:361
ServantFactoryBase(const size_type &depth)
Definition servant-base.hh:354
virtual Object_var servant(Server *server, const Storage &obj)=0
ServantBaseType::Storage Storage
Definition servant-base.hh:351
Implementation of Hpp module Corba server.
Definition server.hh:78
void removeServant(PortableServer::Servant servant)
PortableServer::POA_var poa()
Definition server.hh:114
void * ServantKey
Definition server.hh:161
Corba exception travelling through the Corba channel.
Definition common.idl:27
ReturnType::Object_var makeServantDownCast(Server *server, const typename ServantBaseType::Storage &t)
Definition servant-base.hh:407
PortableServer::Servant_var< S > reference_to_servant(Server *server, const P &p)
Definition servant-base.hh:253
P makeServant(Server *server, S *s)
Definition servant-base.hh:279
void addDowncastObjects(ServantFactoryBase< ServantBaseType > *const object)
Definition servant-base.hh:389
PortableServer::Servant_var< PortableServer::ServantBase > ServantBase_var
Definition servant-base.hh:250
std::vector< ServantFactoryBase< ServantBaseType > * > & objectDowncasts()
auto reference_to_object(Server *server, const P &p)
Definition servant-base.hh:333
AbstractServantBase< T > * reference_to_servant_base(Server *server, const P &p)
Definition servant-base.hh:263
pinocchio::vector_t vector_t
Definition fwd.hh:107
pinocchio::size_type size_type
Definition fwd.hh:110
Implement CORBA interface `‘Obstacle’'.
Definition client.hh:46
Definition servant-base.hh:368
ServantBaseType::Storage StorageBase
Definition servant-base.hh:370
ServantBaseType::Object_var Object_var
Definition servant-base.hh:369
ServantFactory(const size_type &depth)
Definition servant-base.hh:372
virtual Object_var servant(Server *s, const StorageBase &o)
Definition servant-base.hh:375
Definition servant-base.hh:89
Definition servant-base.hh:451
OutType * operator()(const InContainer &input)
Definition servant-base.hh:457
Server * wrappedObject_
Definition servant-base.hh:452
vectorToSeqServant(Server *_s)
Definition servant-base.hh:454