![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /******************************************************************************* 00002 ** Copyright (c) 2010 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 *******************************************************************************/ 00005 00009 00010 #pragma once 00011 00012 #include <vrvControl/vrvControlToolkitDataTypes.h> 00013 00014 #include <vlutil/vlPrint.h> 00015 #include <vl/datumRecSet.h> 00016 00017 namespace vrvControlToolkit 00018 { 00019 00023 template<class DataMsg> 00024 class DtVrlinkDataInterMarshaller 00025 { 00026 public: 00027 DtVrlinkDataInterMarshaller(); 00028 virtual ~DtVrlinkDataInterMarshaller(); 00029 00031 virtual void encode(DtVrvControl_v1* cmd, DataMsg* msg); 00032 00038 virtual DtVrvControl_v1* decode(const DataMsg* msg); 00039 00040 protected: 00041 00042 }; 00043 00044 00045 00046 template<class DataMsg> 00047 DtVrlinkDataInterMarshaller<DataMsg>::DtVrlinkDataInterMarshaller() 00048 { 00049 00050 } 00051 00052 template<class DataMsg> 00053 DtVrlinkDataInterMarshaller<DataMsg>::~DtVrlinkDataInterMarshaller() 00054 { 00055 00056 } 00057 00058 template<class DataMsg> 00059 void DtVrlinkDataInterMarshaller<DataMsg>::encode(DtVrvControl_v1* cmd, DataMsg* msg) 00060 { 00061 DtDatumRetCode ret; 00062 00063 //setup the var field 00064 msg->setNumVarFields(1); 00065 00066 //odd that these start their indexes at 1 00067 msg->setDatumParam(DtVar, 1, (DtDatumParam)DtVrvControlDatumParamId); 00068 msg->setVarDataBytes(1, cmd->mySize, &ret); 00069 msg->setDatumValByteArray(DtVar, 1, (char*)cmd, &ret); 00070 } 00071 00072 template<class DataMsg> 00073 DtVrvControl_v1* DtVrlinkDataInterMarshaller<DataMsg>::decode(const DataMsg* msg) 00074 { 00075 DtDatumRetCode ret; 00076 DtDatumRecordType type; 00077 int index; 00078 int size; 00079 00080 msg->getIndex((DtDatumParam)DtVrvControlDatumParamId, &type, &index, &ret); 00081 if(ret!=DtDatumValid) 00082 { 00083 return NULL; 00084 } 00085 00086 //actually get the data out of the pdu/interaction 00087 size=msg->datumSizeBytes(type, index); 00088 const char* buffer=msg->datumValByteArray(type, index); 00089 00090 //create some memory 00091 char* cmdBuffer=new char[size]; 00092 00093 //copy message to buffer; 00094 memcpy(cmdBuffer, buffer, size); 00095 00096 //cast a control structure 00097 DtVrvControl_v1* cmd=(DtVrvControl_v1*)cmdBuffer; 00098 00099 //check magic number for endiness 00100 if(cmd->myMagicNumber!=DtVrvMagicNumber) 00101 { 00102 delete [] cmdBuffer; 00103 return NULL; 00104 } 00105 00106 return cmd; 00107 } 00108 00109 } //vrvControlToolkit::