InPortCorbaConsumer.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00020 #ifndef InPortCorbaConsumer_h
00021 #define InPortCorbaConsumer_h
00022 
00023 #include <rtm/idl/DataPortSkel.h>
00024 #include <rtm/BufferBase.h>
00025 #include <rtm/CorbaConsumer.h>
00026 #include <rtm/InPortConsumer.h>
00027 #include <iostream>
00028 
00029 namespace RTC
00030 {
00058   template <class DataType>
00059   class InPortCorbaConsumer
00060     : public InPortConsumer,
00061       public CorbaConsumer<RTC::InPortAny>
00062   {
00063   public:
00081     InPortCorbaConsumer(BufferBase<DataType>& buffer)
00082       : m_buffer(buffer)
00083     {
00084     }
00085     
00103     InPortCorbaConsumer(const InPortCorbaConsumer<DataType>& consumer)
00104       : CorbaConsumer<RTC::InPortAny>(consumer), m_buffer(consumer.m_buffer)
00105     {
00106     }
00107     
00129     InPortCorbaConsumer&
00130     operator=(const InPortCorbaConsumer<DataType>& consumer)
00131     {
00132       if (this == &consumer) return *this;
00133       m_buffer = consumer.m_buffer;
00134     }
00135     
00149     virtual ~InPortCorbaConsumer()
00150     {}
00151     
00169     void put(DataType& data)
00170     {
00171       CORBA::Any tmp;
00172       tmp <<= data;
00173       _ptr()->put(tmp);
00174     }
00175     
00189     void push()
00190     {
00191       DataType data;
00192       CORBA::Any tmp;
00193       m_buffer.read(data);
00194       tmp <<= data;
00195       
00196       // 本当はエラー処理をすべき
00197       if (CORBA::is_nil(_ptr())) return;
00198       try
00199         {
00200           _ptr()->put(tmp);
00201         }
00202       catch(...)
00203         {
00204           //hoge オブジェクトが無効になったらdisconnectすべき
00205           return;
00206         }
00207     }
00208     
00226     virtual InPortCorbaConsumer* clone() const
00227     {
00228       return new InPortCorbaConsumer<DataType>(*this);
00229     }
00230     
00253     virtual bool subscribeInterface(const SDOPackage::NVList& properties)
00254     {
00255       if (!NVUtil::isStringValue(properties,
00256                                  "dataport.dataflow_type",
00257                                  "Push"))
00258         {
00259           return false;
00260         }
00261       
00262       CORBA::Long index;
00263       index = NVUtil::find_index(properties,
00264                                  "dataport.corba_any.inport_ref");
00265       if (index < 0)
00266         {
00267           return false;
00268         }
00269       
00270       CORBA::Object_ptr obj;
00271       if (properties[index].value >>= CORBA::Any::to_object(obj))
00272         {
00273           if (!CORBA::is_nil(obj))
00274             {
00275               setObject(obj);
00276               return true;
00277             }
00278         }
00279       return false;;
00280     }
00281     
00299     virtual void unsubscribeInterface(const SDOPackage::NVList& properties)
00300     {
00301       ;
00302     }
00303     
00304   private:
00305     BufferBase<DataType>& m_buffer;
00306   };
00307 };     // namespace RTC
00308 #endif // InPortCorbaConsumer_h

Generated on Thu May 29 15:03:33 2008 for OpenRTM by  doxygen 1.5.3