hpp-corbaserver
4.12.0
Corba server for Humanoid Path Planner applications
|
Go to the documentation of this file.
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
139 if (persistant) p_ =
get();
154 PortableServer::Servant servant =
dynamic_cast<PortableServer::Servant
>(
this);
156 throw Error (
"The object was deleted. I could not delete the servant.");
159 PortableServer::ObjectId_var objectId
160 = this->
server_->
poa()->servant_to_id(servant);
161 this->
server_->
poa()->deactivate_object(objectId.in());
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.");
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; }
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);
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);
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;
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>
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()) {
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
AbstractServantBase(Server *server)
Definition: servant-base.hh:95
virtual Object_var servant(Server *s, const StorageBase &o)
Definition: servant-base.hh:351
Definition: servant-base.hh:343
Storage wrappedObject_
Definition: servant-base.hh:171
weak_ptr< T > TWkPtr_t
Definition: servant-base.hh:85
ServantBaseType::Storage StorageBase
Definition: servant-base.hh:346
bool persistantStorage() const
See persistantStorage(bool)
Definition: servant-base.hh:144
vectorToSeqServant(Server *_s)
Definition: servant-base.hh:431
void removeServant(PortableServer::Servant servant)
Server * wrappedObject_
Definition: servant-base.hh:429
StorageElementShPtr_t getT() const
Definition: servant-base.hh:121
virtual ~AbstractServantBase()
Definition: servant-base.hh:82
Implementation of Hpp module Corba server.
Definition: server.hh:54
Corba exception travelling through the Corba channel.
Definition: common.idl:25
void addServantKeyAndServant(ServantKey servantKey, PortableServer::Servant servant)
_CORBA_MODULE hpp _CORBA_MODULE_BEG _CORBA_MODULE core_idl _CORBA_MODULE_BEG typedef ::CORBA::ULongLong size_t
Definition: paths-idl.hh:75
Server * server_
Definition: servant-base.hh:97
void addDowncastObjects(ServantFactoryBase< ServantBaseType > *const object)
Definition: servant-base.hh:365
virtual TShPtr_t get() const =0
AbstractStorage(const ptr_t &_element)
Definition: servant-base.hh:213
auto reference_to_object(Server *server, const P &p)
Definition: servant-base.hh:305
long use_count() const
Definition: servant-base.hh:216
ServantFactory(const size_type &depth)
Definition: servant-base.hh:348
virtual ~ServantBase()
Definition: servant-base.hh:109
PortableServer::POA_var poa()
Definition: server.hh:88
ServantBaseType::Storage Storage
Definition: servant-base.hh:324
std::vector< ServantFactoryBase< ServantBaseType > * > & objectDowncasts()
Definition: servant-base.hh:206
Definition: servant-base.hh:79
pinocchio::vector_t vector_t
Definition: fwd.hh:89
AbstractServantBase< T > * reference_to_servant_base(Server *server, const P &p)
Definition: servant-base.hh:234
PortableServer::Servant_var< S > reference_to_servant(Server *server, const P &p)
Definition: servant-base.hh:225
Implement CORBA interface `‘Obstacle’'.
Definition: basic-server.hh:27
void * ServantKey
Definition: server.hh:146
ServantFactoryBase(const size_type &depth)
Definition: servant-base.hh:327
ServantBaseType::Object_var Object_var
Definition: servant-base.hh:345
Definition: servant-base.hh:427
const Storage & getS() const
Definition: servant-base.hh:131
T element_type
Definition: servant-base.hh:219
Definition: servant-base.hh:66
ServantBaseType::Object_var Object_var
Definition: servant-base.hh:325
virtual Object_var servant(Server *server, const Storage &obj)=0
PortableServer::Servant getServant(ServantKey servantKey) const
Abstract class used to avoid duplication of the servants.
Definition: servant-base.hh:69
void deleteThis()
Definition: servant-base.hh:149
virtual Server::ServantKey getServantKey() const
Definition: servant-base.hh:89
weak_ptr< T > ptr_t
Definition: servant-base.hh:209
P makeServant(Server *server, S *s)
Definition: servant-base.hh:249
size_type depth() const
Definition: servant-base.hh:334
OutType * operator()(const InContainer &input)
Definition: servant-base.hh:434
ptr_t element
Definition: servant-base.hh:211
virtual Server::ServantKey getServantKey() const =0
pinocchio::size_type size_type
Definition: fwd.hh:92
virtual TShPtr_t get() const
Definition: servant-base.hh:111
Definition: servant-base.hh:321
void persistantStorage(bool persistant)
Set to true if the servant should take ownership of this object.
Definition: servant-base.hh:137
_Storage Storage
Definition: servant-base.hh:103
shared_ptr< T > TShPtr_t
Definition: servant-base.hh:84
weak_ptr< typename Storage::element_type > StorageElementWkPtr_t
Definition: servant-base.hh:106
ReturnType::Object_var makeServantDownCast(Server *server, const typename ServantBaseType::Storage &t)
Definition: servant-base.hh:384
PortableServer::Servant_var< PortableServer::ServantBase > ServantBase_var
Definition: servant-base.hh:223
Definition: servant-base.hh:100
shared_ptr< typename Storage::element_type > StorageElementShPtr_t
Definition: servant-base.hh:107
ServantBase(Server *server, const Storage &_s)
Definition: servant-base.hh:165