OutPortCorbaConsumer.h

説明を見る。
00001 // -*- C++ -*-
00020 #ifndef OutPortCorbaConsumer_h
00021 #define OutPortCorbaConsumer_h
00022 
00023 #include <rtm/Manager.h>
00024 #include <rtm/idl/DataPortSkel.h>
00025 #include <rtm/BufferBase.h>
00026 #include <rtm/CorbaConsumer.h>
00027 #include <rtm/OutPortConsumer.h>
00028 
00029 namespace RTC
00030 {
00057   template <class DataType>
00058   class OutPortCorbaConsumer
00059     : public OutPortConsumer,
00060       public CorbaConsumer<RTC::OutPortAny>
00061   {
00062   public:
00080     OutPortCorbaConsumer(BufferBase<DataType>& buffer)
00081       : m_buffer(buffer)
00082     {}
00083     
00097     virtual ~OutPortCorbaConsumer(void){} 
00098     
00120     bool get(DataType& data)
00121     {
00122       const DataType* d;
00123       try
00124         {
00125           CORBA::Any_var a_var(_ptr()->get());
00126           if (*((const CORBA::Any*)(a_var.operator->())) >>= d)
00127             {
00128               data = (*d);
00129               return true;
00130             }
00131         }
00132       catch (...)
00133         {
00134           return false;
00135         }
00136       return false;
00137     }
00138     
00154     virtual void pull()
00155     {
00156       DataType data;
00157       if (get(data))
00158         {
00159           m_buffer.write(data);
00160         }
00161     }
00162     
00185     virtual bool subscribeInterface(const SDOPackage::NVList& properties)
00186     {
00187       CORBA::Long index;
00188       index = NVUtil::find_index(properties,
00189                                  "dataport.corba_any.outport_ref");
00190       if (index < 0) return false;
00191 
00192       if (NVUtil::isString(properties,
00193                            "dataport.corba_any.outport_ref"))
00194         {
00195           const char* ior;
00196           properties[index].value >>= ior;
00197           std::cout << "OutPOrt ref: " << ior << std::endl;
00198           CORBA::ORB_ptr orb = ::RTC::Manager::instance().getORB();
00199           CORBA::Object_var var = orb->string_to_object(ior);
00200           setObject(var.in());
00201           return true;
00202         }
00203       
00204       return false;
00205     }
00206     
00224     virtual void unsubscribeInterface(const SDOPackage::NVList& properties)
00225     {
00226       CORBA::Long index;
00227       index = NVUtil::find_index(properties,
00228                                  "dataport.corba_any.outport_ref");
00229       if (index < 0) return;
00230       
00231       const char* ior;
00232       if (properties[index].value >>= ior)
00233         {
00234           CORBA::ORB_ptr orb = RTC::Manager::instance().getORB();
00235           CORBA::Object_var var = orb->string_to_object(ior);
00236           if (_ptr()->_is_equivalent(var))
00237             {
00238               releaseObject();
00239             }
00240         }
00241     }
00242     
00243   private:
00244     RTC::OutPortAny_var m_outport;
00245     BufferBase<DataType>& m_buffer;
00246   };
00247 };     // namespace RTC
00248 #endif // OutPortCorbaConsumer_h

OpenRTMに対してSun May 24 14:08:25 2009に生成されました。  doxygen 1.5.3