00001
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 };
00248 #endif // OutPortCorbaConsumer_h