CorbaBufferProxy.hpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #ifndef ORO_CORBA_BUFFER_PROXY_HPP
00041 #define ORO_CORBA_BUFFER_PROXY_HPP
00042
00043 #include "../BufferInterface.hpp"
00044 #include "corba.h"
00045 #include "DataFlowC.h"
00046 #include "corba.h"
00047 #ifdef CORBA_IS_TAO
00048 #include "DataFlowS.h"
00049 #endif
00050 #include "../DataSources.hpp"
00051 #include "CorbaLib.hpp"
00052
00053
00054 namespace RTT
00055 { namespace Corba {
00056
00060 template<class T>
00061 class CorbaBufferProxy
00062 :public BufferInterface<T>
00063 {
00065 BufferChannel_var buf;
00066 public:
00067
00068 typedef typename ReadInterface<T>::reference_t reference_t;
00069 typedef typename WriteInterface<T>::param_t param_t;
00070 typedef typename BufferInterface<T>::size_type size_type;
00071 typedef T value_t;
00072
00078 CorbaBufferProxy( BufferChannel_ptr ec )
00079 : buf( BufferChannel::_duplicate(ec) )
00080 {
00081 }
00082
00086 ~CorbaBufferProxy() {
00087 }
00088
00089 bool Push( param_t item )
00090 {
00091 ValueDataSource<T> vds(item);
00092 vds.ref();
00093 CORBA::Any_var toset = (CORBA::Any_ptr)vds.createBlob(ORO_CORBA_PROTOCOL_ID);
00094 try {
00095 buf->push( toset.in() );
00096 } catch (...) {
00097 return false;
00098 }
00099
00100 return true;
00101 }
00102
00103 size_type Push(const std::vector<T>& items)
00104 {
00105 typename std::vector<T>::const_iterator itl( items.begin() );
00106 while ( itl != items.end() ) {
00107 if ( this->Push( *itl ) == false )
00108 break;
00109 ++itl;
00110 }
00111 return (size_type)(itl - items.begin());
00112
00113 }
00114 bool Pop( reference_t item )
00115 {
00116 CORBA::Any_var res;
00117 try {
00118 if ( buf->pull( res.out() ) ) {
00119 ReferenceDataSource<T> rds(item);
00120 rds.ref();
00121 if ( rds.updateBlob(ORO_CORBA_PROTOCOL_ID, &res.in() ) == false) {
00122 Logger::log() <<Logger::Error << "Could not Convert remote value: wrong data type."<<Logger::endl;
00123 return false;
00124 }
00125 return true;
00126 }
00127 } catch(...) {
00128 return false;
00129 }
00130 return false;
00131 }
00132
00133 size_type Pop(std::vector<T>& items )
00134 {
00135 value_t item;
00136 if ( Pop(item) ) {
00137 items.push_back(item);
00138 return 1;
00139 }
00140 return 0;
00141 }
00142
00143 value_t front() const
00144 {
00145 value_t item = value_t();
00146
00147 CORBA::Any_var res;
00148 res = buf->front();
00149 ReferenceDataSource<T> rds( item );
00150 rds.ref();
00151 if ( rds.updateBlob(ORO_CORBA_PROTOCOL_ID, &res.in() ) == false) {
00152 Logger::log() <<Logger::Error << "Could not inspect remote value: wrong data type."<<Logger::endl;
00153 }
00154 return item;
00155 }
00156
00157 size_type capacity() const {
00158 try {
00159 return buf->capacity();
00160 } catch (...) {
00161 return 0;
00162 }
00163 }
00164
00165 size_type size() const {
00166 try {
00167 return buf->size();
00168 } catch (...) {
00169 return 0;
00170 }
00171 }
00172
00173 void clear() {
00174 try {
00175 buf->clear();
00176 } catch (...) {
00177 }
00178 }
00179
00180 bool empty() const {
00181 try {
00182 return buf->empty();
00183 } catch (...) {
00184 return true;
00185 }
00186 }
00187
00188 bool full() const {
00189 try {
00190 return buf->full();
00191 } catch (...) {
00192 return false;
00193 }
00194 }
00195 };
00196 }}
00197
00198 #endif // BUFFERSIMPLE_HPP