11 #ifndef HPP_CORBASERVER_SERVANT_BASE_HH 12 # define HPP_CORBASERVER_SERVANT_BASE_HH 14 # include <boost/type.hpp> 54 #define SERVANT_BASE_TYPEDEFS(idlObj, hppObj) \ 56 using ::hpp::corbaServer::AbstractServantBase<hppObj>::server_; \ 59 typedef _Storage Storage; \ 60 typedef idlObj Object; \ 61 typedef idlObj ## _ptr Object_ptr; \ 62 typedef idlObj ## _var Object_var; \ 63 typedef ::hpp::corbaServer::ServantBase<hppObj, _Storage> _ServantBase; \ 64 using _ServantBase::get; \ 65 using _ServantBase::getT; \ 66 using _ServantBase::getS 87 virtual TShPtr_t
get()
const = 0;
113 TWkPtr_t wk ((StorageElementWkPtr_t) s);
121 StorageElementShPtr_t
getT ()
const 123 StorageElementWkPtr_t wk ((StorageElementWkPtr_t) s);
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 boost::shared_ptr<T > ()
const {
return element.lock(); }
215 operator boost::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, boost::shared_ptr> {
281 static boost::shared_ptr<U> run (
const boost::shared_ptr<V>& o) {
282 return boost::dynamic_pointer_cast<U>(o);
287 template <
typename U,
typename V>
288 struct storage_cast_impl<U, V, boost::weak_ptr> {
289 static boost::weak_ptr<U> run (
const boost::weak_ptr<V>& o) {
290 return boost::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);
306 template <
typename ServantBaseType>
310 typedef typename ServantBaseType::Storage
Storage;
315 virtual Object_var servant (
Server* server,
const Storage& obj) = 0;
328 template <
typename ServantBaseType,
typename ServantType>
339 typedef typename ServantType::Storage
Storage;
340 Storage u = storage_cast<
typename Storage::element_type>(o);
342 if (u.use_count()>0) ret = makeServant <Object_var> (s,
new ServantType (s, u));
347 template <
typename ServantBaseType>
348 std::vector< ServantFactoryBase<ServantBaseType>* >&
objectDowncasts ();
350 template <
typename ServantBaseType>
353 typedef std::vector< ServantFactoryBase<ServantBaseType>* >
vector_t;
354 typedef typename vector_t::iterator iterator;
356 vector_t& vec = objectDowncasts<ServantBaseType>();
358 for (iterator _obj = vec.begin(); _obj != vec.end(); ++_obj) {
359 if (d >= (*_obj)->depth()) {
360 vec.insert(_obj,
object);
364 vec.push_back(
object);
369 template <
typename ServantBaseType,
typename ReturnType>
372 typedef typename ServantBaseType::Object_var BaseObject_var;
373 typedef typename ReturnType::Object_var Object_var;
374 BaseObject_var servant;
375 assert (CORBA::Object_Helper::is_nil(servant.in()));
377 typedef std::vector< ServantFactoryBase<ServantBaseType>* >
vector_t;
378 typedef typename vector_t::iterator iterator;
380 vector_t& vec = objectDowncasts<ServantBaseType>();
381 for (iterator _obj = vec.begin(); _obj != vec.end(); ++_obj) {
382 servant = (*_obj)->servant(server, t);
383 if (!CORBA::Object_Helper::is_nil(servant.in())) {
385 return Object_var (ReturnType::Object::_narrow (servant._retn()));
391 template <
typename ServantBaseType>
396 typedef typename ServantBaseType::Object_var Object_var;
398 assert (CORBA::Object_Helper::is_nil(servant.in()));
400 typedef std::vector< ServantFactoryBase<ServantBaseType>* >
vector_t;
401 typedef typename vector_t::iterator iterator;
403 vector_t& vec = objectDowncasts<ServantBaseType>();
404 for (iterator _obj = vec.begin(); _obj != vec.end(); ++_obj) {
405 servant = (*_obj)->servant(server, t);
406 if (!CORBA::Object_Helper::is_nil(servant.in()))
break;
412 template <
typename OutType,
typename InnerBaseType,
typename InnerType = InnerBaseType>
419 template <
typename InContainer>
420 inline OutType* operator() (
const InContainer& input)
422 std::size_t len = std::distance (input.begin(), input.end());
423 OutType* seq =
new OutType ();
424 seq->length ((CORBA::ULong) len);
427 typename InContainer::const_iterator it = input.begin();
428 while (it != input.end()) {
430 InnerType> (s, *it)._retn();
450 #define HPP_CORBASERVER_ADD_DOWNCAST_OBJECT(ServantType, BaseServantType, depth) \ 451 struct HPP_CORE_DLLAPI __InitializerClass_##ServantType { \ 452 __InitializerClass_##ServantType () { \ 453 ::hpp::corbaServer::addDowncastObjects<BaseServantType> \ 454 ( new ::hpp::corbaServer::ServantFactory<BaseServantType, ServantType> (depth)); \ 457 HPP_CORBASERVER_DLLLOCAL __InitializerClass_##ServantType __instance_##ServantType; 459 #endif // HPP_CORBASERVER_SERVANT_BASE_HH Definition: servant-base.hh:100
PortableServer::Servant_var< PortableServer::ServantBase > ServantBase_var
Definition: servant-base.hh:223
boost::shared_ptr< T > TShPtr_t
Definition: servant-base.hh:84
std::vector< ServantFactoryBase< ServantBaseType > *> & objectDowncasts()
ServantFactory(const size_type &depth)
Definition: servant-base.hh:334
boost::shared_ptr< typename Storage::element_type > StorageElementShPtr_t
Definition: servant-base.hh:107
Definition: servant-base.hh:329
ServantBaseType::Object_var Object_var
Definition: servant-base.hh:311
Implement CORBA interface ``Obstacle''.
Definition: basic-server.hh:27
AbstractServantBase(Server *server)
Definition: servant-base.hh:95
AbstractServantBase< T > * reference_to_servant_base(Server *server, const P &p)
Definition: servant-base.hh:234
boost::weak_ptr< T > ptr_t
Definition: servant-base.hh:209
T element_type
Definition: servant-base.hh:219
ptr_t element
Definition: servant-base.hh:211
size_type depth() const
Definition: servant-base.hh:320
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
void addServantKeyAndServant(ServantKey servantKey, PortableServer::Servant servant)
boost::weak_ptr< typename Storage::element_type > StorageElementWkPtr_t
Definition: servant-base.hh:106
Server * server_
Definition: servant-base.hh:97
Corba exception travelling through the Corba channel.
Definition: common.idl:24
Definition: servant-base.hh:206
bool persistantStorage() const
See persistantStorage(bool)
Definition: servant-base.hh:144
Definition: servant-base.hh:307
void addDowncastObjects(ServantFactoryBase< ServantBaseType > *const object)
Definition: servant-base.hh:351
virtual Server::ServantKey getServantKey() const =0
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:370
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
Storage s
Definition: servant-base.hh:171
AbstractStorage(const ptr_t &_element)
Definition: servant-base.hh:213
ServantBaseType::Object_var Object_var
Definition: servant-base.hh:331
virtual ~ServantBase()
Definition: servant-base.hh:109
vectorToSeqServant(Server *_s)
Definition: servant-base.hh:417
Definition: servant-base.hh:413
virtual Object_var servant(Server *s, const StorageBase &o)
Definition: servant-base.hh:337
ServantBaseType::Storage StorageBase
Definition: servant-base.hh:332
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
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
boost::weak_ptr< T > TWkPtr_t
Definition: servant-base.hh:85
_Storage Storage
Definition: servant-base.hh:103
Server * s
Definition: servant-base.hh:415
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
ServantBaseType::Storage Storage
Definition: servant-base.hh:310
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:313