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