00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 #ifndef ORO_MQ_TEMPATE_PROTOCOL_HPP
00040 #define ORO_MQ_TEMPATE_PROTOCOL_HPP
00041 
00042 #include "MQLib.hpp"
00043 #include "../../types/TypeMarshaller.hpp"
00044 #include "MQChannelElement.hpp"
00045 
00046 #include <boost/type_traits/has_virtual_destructor.hpp>
00047 #include <boost/static_assert.hpp>
00048 
00049 namespace RTT
00050 { namespace mqueue
00051   {
00059       template<class T>
00060       class MQTemplateProtocol
00061           : public RTT::types::TypeMarshaller
00062       {
00063       public:
00069           BOOST_STATIC_ASSERT( !boost::has_virtual_destructor<T>::value );
00073           typedef T UserType;
00074 
00075           virtual std::pair<void const*,int> fillBlob( base::DataSourceBase::shared_ptr source, void* blob, int size, void* cookie) const
00076           {
00077               if ( sizeof(T) <= (unsigned int)size)
00078                   return std::make_pair(source->getRawConstPointer(), int(sizeof(T)));
00079               return std::make_pair((void const*)0,int(0));
00080           }
00081 
00082           virtual bool updateFromBlob(const void* blob, int size, base::DataSourceBase::shared_ptr target, void* cookie) const
00083           {
00084             typename internal::AssignableDataSource<T>::shared_ptr ad = internal::AssignableDataSource<T>::narrow( target.get() );
00085             assert( size == sizeof(T) );
00086             if ( ad ) {
00087                 ad->set( *(T*)(blob) );
00088                 return true;
00089             }
00090             return false;
00091           }
00092 
00093           virtual unsigned int getSampleSize(base::DataSourceBase::shared_ptr ignored, void* cookie) const
00094           {
00095               
00096               return sizeof(T);
00097           }
00098 
00099           virtual base::ChannelElementBase::shared_ptr createStream(base::PortInterface* port, const ConnPolicy& policy, bool is_sender) const {
00100               try {
00101                   base::ChannelElementBase::shared_ptr mq = new MQChannelElement<T>(port, *this, policy, is_sender);
00102                   if ( !is_sender ) {
00103                       
00104                       base::ChannelElementBase::shared_ptr buf = detail::DataSourceTypeInfo<T>::getTypeInfo()->buildDataStorage(policy);
00105                       mq->setOutput(buf);
00106                   }
00107                   return mq;
00108               } catch(std::exception& e) {
00109                   log(Error) << "Failed to create MQueue Channel element: " << e.what() << endlog();
00110               }
00111               return base::ChannelElementBase::shared_ptr();
00112           }
00113 
00114       };
00115 }
00116 }
00117 
00118 #endif