00001 #include "cmwfwList.h"
00002 #include "cmwfwTime.h"
00003 #include "cmwfwTypes.h"
00004 #include "cmwfw_defs.h"
00005 #include "cmwfwIOValue.h"
00006 #include "cmwfwForwarder.h"
00007 #include "cmwfwIOPMapper.h"
00008 #include "cmwfwDeviceServer.h"
00009 #include "cmwfwSubscribtionManager.h"
00010
00011 extern cmwfwIOPMapper framework_iop_mapper;
00012
00013
00014 #define FILE "source file:cmwfwForwarder.cc"
00015 #define ID "Contact Steen JENSEN, PS/CO"
00016 #define PROGRAM "Middleware server framework"
00017 #define T(a,b,c,d,e) TRACE(a,"%s(%s): %s %s %s %s\n",myname,FILE,b,c,d,e)
00018 #define E(a,b,c,d) ERROR("%s:%s(%s):ERROR: %s %s %s %s - %s\n",PROGRAM,myname,FILE,a,b,c,d,ID)
00019
00020
00030 cmwfwForwarder::cmwfwForwarder(){
00031 char* myname = "cmwfwForwarder::cmwfwForwarder";
00032 T(CMWFW_TRACE_CALLS,"Entering","","","");
00033 T(CMWFW_TRACE_SERVER,"Constructing forwarder","","","");
00034 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00035 };
00036
00037
00038
00048 cmwfwForwarder::~cmwfwForwarder(){
00049 char* myname = "cmwfwForwarder::~cmwfwForwarder";
00050 T(CMWFW_TRACE_CALLS,"Entering","","","");
00051 T(CMWFW_TRACE_SERVER,"Destroying forwarder","","","");
00052 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00053 };
00054
00055
00056
00067 void cmwfwForwarder::processIOP(const cmwfwIOPoint& iop,
00068 const cmwfwData& data,
00069 const cmwfwValueQualifier& qualifier){
00070 char* myname = "cmwfwForwarder::processIOP";
00071 T(CMWFW_TRACE_CALLS,"Entering","","","");
00072
00073 cmwfwDeviceServer* srv = framework_iop_mapper.getServer(iop);
00074 cmwfwIOValue* iov_ptr = 0;
00075
00076
00077 if(!srv){
00078 char errmess[50] = "cmwfwForwarder::processIOP - no server for ";
00079 strcat(errmess,iop.getDeviceName());
00080 E("No server found","","","");
00081 throw cmwfwBadParameter("no server specified");
00082 T(CMWFW_TRACE_CALLS,"Returning - no server","","","");
00083 return;
00084 };
00085
00086 srv->iovalues->lock();
00087 iov_ptr = srv->getIOValue(iop,false);
00088 if(iov_ptr)
00089 iov_ptr->update(data,qualifier);
00090 else{
00091 E("Unable to retrieve iopoint from server","","","");
00092
00093
00094 T(CMWFW_TRACE_CALLS,"Returning - no iovalue","","","");
00095 };
00096 srv->iovalues->unlock();
00097 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00098 };
00099
00100
00101
00102
00114 void cmwfwForwarder::push(const cmwfwIOPoint& iop,
00115 cmwfwData& data,
00116 const cmwfwValueQualifier& qualifier){
00117 char* myname = "cmwfwForwarder::push";
00118 T(CMWFW_TRACE_CALLS,"Entering","","","");
00119
00120
00121
00122 processIOP(iop,data,qualifier);
00123
00124 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00125 };
00126
00127
00128
00129
00140 void cmwfwForwarder::push(cmwfwData& data,
00141 const cmwfwValueQualifier& qualifier){
00142
00143 char* myname = "cmwfwForwarder::push";
00144 T(CMWFW_TRACE_CALLS,"Entering","","","");
00145
00146 bool stat = false;
00147 cmwfwIOPoint* iop_ptr = 0;
00148
00149
00150
00151 iopoints->lock();
00152
00153 iopoints->resetCurrent(false);
00154 stat = iopoints->getCurrent(&iop_ptr,false);
00155 if(stat)
00156 processIOP(*iop_ptr,data,qualifier);
00157 else{
00158 iopoints->unlock();
00159 T(CMWFW_TRACE_CALLS,"Returning - no iopoint","","","");
00160 return;
00161 };
00162
00163 while(stat){
00164 stat = iopoints->getNext(&iop_ptr,false);
00165 if(stat)
00166 processIOP(*iop_ptr,data,qualifier);
00167 else{
00168 iopoints->unlock();
00169 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00170 return;
00171 };
00172 };
00173 iopoints->unlock();
00174 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00175 return;
00176 };
00177
00178
00179