CigiIGMsgV3.cpp

Go to the documentation of this file.
00001 
00057 #define _EXPORT_CCL_
00058 
00059 #include "CigiIGMsgV3.h"
00060 #include "CigiSwapping.h"
00061 #include "CigiExceptions.h"
00062 
00063 
00064 // ====================================================================
00065 // Construction/Destruction
00066 // ====================================================================
00067 
00068 
00069 // ================================================
00070 // CigiIGMsgV3
00071 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // ~CigiIGMsgV3
00089 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00090 CigiIGMsgV3::~CigiIGMsgV3()
00091 {
00092 
00093 }
00094 
00095 // ====================================================================
00096 // Pack and Unpack
00097 // ====================================================================
00098 
00099 // ================================================
00100 // Pack
00101 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // Unpack
00124 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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++;  // Step over packet id
00136 
00137    tPktSz = *CDta.c++;  // Get packet size
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 // GetTruePacketSize
00171 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00172 int CigiIGMsgV3::GetTruePacketSize(CigiBaseVariableSizePckt &refPacket)
00173 {
00174    return(refPacket.GetVariableDataSize() + 4);
00175 }
00176 
00177 
00178 
00179 // ====================================================================
00180 // Accessors
00181 // ====================================================================
00182 
00183 
00184 // ================================================
00185 // SetMsg
00186 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 

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