00001
00057 #define _EXPORT_CCL_
00058
00059 #include "CigiIGMsgV2.h"
00060 #include "CigiSwapping.h"
00061 #include "CigiExceptions.h"
00062
00063 #include <memory.h>
00064
00065
00066 #ifdef CIGI_LITTLE_ENDIAN
00067 #define CIGI_SCOPY2 CigiSwap2
00068 #define CIGI_SCOPY4 CigiSwap4
00069 #define CIGI_SCOPY8 CigiSwap8
00070 #else
00071 #define CIGI_SCOPY2 CigiCopy2
00072 #define CIGI_SCOPY4 CigiCopy4
00073 #define CIGI_SCOPY8 CigiCopy8
00074 #endif
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 CigiIGMsgV2::CigiIGMsgV2()
00088 {
00089
00090 PacketID = CIGI_IG_MSG_PACKET_ID_V2;
00091 PacketSize = 8;
00092 Version = 2;
00093 MinorVersion = 0;
00094
00095 MsgID = 0;
00096 memset(Msg,0,4);
00097 VariableDataSize = MsgLen = 4;
00098
00099 }
00100
00101
00102
00103
00104 CigiIGMsgV2::~CigiIGMsgV2()
00105 {
00106
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116 int CigiIGMsgV2::Pack(CigiBasePacket * Base, Cigi_uint8 * Buff, void *Spec) const
00117 {
00118
00119 Cigi_int16 tbuf;
00120
00121 CigiBaseIGMsg * Data = ( CigiBaseIGMsg *)Base;
00122
00123 Cigi_uint8 *CDta = Buff;
00124
00125 *CDta++ = PacketID;
00126 *CDta++ = Data->PacketSize;
00127
00128 CIGI_SCOPY2(&tbuf, &Data->MsgID);
00129 memcpy(CDta,&tbuf,2);
00130 CDta += 2;
00131
00132
00133 memcpy(CDta,Data->Msg,Data->MsgLen);
00134
00135 return(Data->PacketSize);
00136
00137 }
00138
00139
00140
00141
00142 int CigiIGMsgV2::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00143 {
00144
00145 Cigi_int16 tbuf;
00146 int tPktSz;
00147
00148 Cigi_uint8 *CDta = Buff;
00149
00150 CDta++;
00151
00152 tPktSz = *CDta++;
00153
00154 memcpy(&tbuf,CDta,2);
00155 CIGI_SCOPY2(&MsgID, &tbuf);
00156
00157 CDta += 2;
00158
00159 if(tPktSz > 104)
00160 {
00161 PacketSize = 104;
00162 memcpy(&Msg,CDta,99);
00163 Msg[99] = 0;
00164 }
00165 else if(tPktSz <= 5)
00166 {
00167 PacketSize = tPktSz;
00168 Msg[0] = 0;
00169 }
00170 else
00171 {
00172 PacketSize = tPktSz;
00173 memcpy(&Msg,CDta,(tPktSz - 4));
00174 Msg[(tPktSz - 5)] = 0;
00175 }
00176
00177 MsgLen = PacketSize - 4;
00178
00179 return(tPktSz);
00180
00181 }
00182
00183
00184
00185
00186
00187 int CigiIGMsgV2::GetTruePacketSize(CigiBaseVariableSizePckt &refPacket)
00188 {
00189 return(refPacket.GetVariableDataSize() + 4);
00190 }
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202 int CigiIGMsgV2::SetMsg(const Cigi_Ascii *MsgIn, bool bndchk)
00203 {
00204
00205 MsgLen = strlen(MsgIn);
00206
00207 if(MsgLen == 0)
00208 {
00209 MsgLen = 4;
00210 memset(Msg,0,4);
00211 }
00212 else if(MsgLen >= 95)
00213 {
00214 MsgLen = 100;
00215 memcpy(Msg,MsgIn,95);
00216 memset(&Msg[MsgLen],0,5);
00217 Msg[99] = 0;
00218 }
00219 else
00220 {
00221 memcpy(Msg,MsgIn,MsgLen);
00222
00223 int tadj = (MsgLen + 1) % 4;
00224
00225 tadj = (tadj == 0) ? 1 : (5 - tadj);
00226
00227 memset(&Msg[MsgLen],0,(tadj+4));
00228
00229 MsgLen += tadj;
00230 }
00231
00232 VariableDataSize = MsgLen;
00233 PacketSize = VariableDataSize + 4;
00234
00235 return(CIGI_SUCCESS);
00236 }
00237