Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

InPortCorbaConsumer.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00020 /*
00021  * $Log: InPortCorbaConsumer.h,v $
00022  * Revision 1.3  2007/01/09 09:56:38  n-ando
00023  * Kanji-code has changed.
00024  *
00025  * Revision 1.2  2007/01/06 17:50:57  n-ando
00026  * Interface subscription/unsubscription functions (subscribeInterface()
00027  * and unsubscribeInterface()) are added.
00028  * The clone() function to clone the instance is added.
00029  *
00030  * Revision 1.1  2006/12/02 18:39:57  n-ando
00031  * InPortCorbaConsumer class was moved from InPortConsumer.h
00032  *
00033  */
00034 
00035 #ifndef InPortCorbaConsumer_h
00036 #define InPortCorbaConsumer_h
00037 
00038 #include <rtm/idl/DataPortSkel.h>
00039 #include <rtm/BufferBase.h>
00040 #include <rtm/CorbaConsumer.h>
00041 #include <rtm/InPortConsumer.h>
00042 #include <iostream>
00043  
00044 namespace RTC
00045 {
00046   template <class DataType>
00047   class InPortCorbaConsumer
00048     : public InPortConsumer,
00049       public CorbaConsumer<RTC::InPortAny>
00050   {
00051   public:
00052     InPortCorbaConsumer(BufferBase<DataType>& buffer)
00053       : m_buffer(buffer)
00054     {
00055     }
00056 
00057 
00058     InPortCorbaConsumer(const InPortCorbaConsumer<DataType>& consumer)
00059       : CorbaConsumer<RTC::InPortAny>(consumer), m_buffer(consumer.m_buffer)
00060     {
00061     }
00062 
00063     InPortCorbaConsumer&
00064     operator=(const InPortCorbaConsumer<DataType>& consumer)
00065     {
00066       if (this == &consumer) return *this;
00067       m_buffer = consumer.m_buffer;
00068     }
00069 
00070 
00071     virtual ~InPortCorbaConsumer()
00072     {}
00073 
00074     void put(DataType& data)
00075     {
00076       CORBA::Any tmp;
00077       tmp <<= data;
00078       _ptr()->put(tmp);
00079     }
00080 
00081     void push()
00082     {
00083       DataType data;
00084       CORBA::Any tmp;
00085       m_buffer.read(data);
00086       tmp <<= data;
00087 
00088       //hoge 本当はエラー処理をすべき
00089       if (CORBA::is_nil(_ptr())) return;
00090       try
00091         {
00092           _ptr()->put(tmp);
00093         }
00094       catch(...)
00095         {
00096           //hoge オブジェクトが無効になったらdisconnectすべき
00097           return;
00098         }
00099     }
00100 
00101     virtual InPortCorbaConsumer* clone() const
00102     {
00103       return new InPortCorbaConsumer<DataType>(*this);
00104     }
00105 
00106     virtual bool subscribeInterface(const SDOPackage::NVList& properties)
00107     {
00108       if (!NVUtil::isStringValue(properties,
00109                                  "dataport.dataflow_type",
00110                                  "Push"))
00111         {
00112           return false;
00113         }
00114       
00115       CORBA::Long index;
00116       index = NVUtil::find_index(properties,
00117                                  "dataport.corba_any.inport_ref");
00118       if (index < 0)
00119         {
00120           return false;
00121         }
00122       
00123       CORBA::Object_ptr obj;
00124       if (properties[index].value >>= CORBA::Any::to_object(obj))
00125         {
00126           if (!CORBA::is_nil(obj))
00127             {
00128               setObject(obj);
00129               return true;
00130             }
00131         }
00132       return false;;
00133     }
00134 
00135 
00136     virtual void unsubscribeInterface(const SDOPackage::NVList& properties)
00137     {
00138       ;
00139     }
00140 
00141 
00142   private:
00143     BufferBase<DataType>& m_buffer;
00144   };
00145 };     // namespace RTC
00146 #endif // InPortCorbaConsumer_h
00147 

Generated on Tue May 29 16:45:37 2007 for OpenRTM by  doxygen 1.4.1