CigiIGMsgV2.cpp

Go to the documentation of this file.
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 // Construction/Destruction
00081 // ====================================================================
00082 
00083 
00084 // ================================================
00085 // CigiIGMsgV2
00086 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // ~CigiIGMsgV2
00103 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00104 CigiIGMsgV2::~CigiIGMsgV2()
00105 {
00106 
00107 }
00108 
00109 // ====================================================================
00110 // Pack and Unpack
00111 // ====================================================================
00112 
00113 // ================================================
00114 // Pack
00115 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // Unpack
00141 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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++;  // Step over packet id
00151 
00152    tPktSz = *CDta++;  // Get packet size
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 // GetTruePacketSize
00186 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00187 int CigiIGMsgV2::GetTruePacketSize(CigiBaseVariableSizePckt &refPacket)
00188 {
00189    return(refPacket.GetVariableDataSize() + 4);
00190 }
00191 
00192 
00193 
00194 // ====================================================================
00195 // Accessors
00196 // ====================================================================
00197 
00198 
00199 // ================================================
00200 // SetMsg
00201 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 

Generated on Wed Apr 29 08:59:58 2009 for CCL by  doxygen 1.4.7