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