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