CigiSymbolTextDefV3_3.cpp

Go to the documentation of this file.
00001 
00043 #define _EXPORT_CCL_
00044 
00045 
00046 #include "CigiSymbolTextDefV3_3.h"
00047 #include "CigiSwapping.h"
00048 #include "CigiExceptions.h"
00049 
00050 
00051 using namespace std;
00052 
00053 // ====================================================================
00054 // Construction/Destruction
00055 // ====================================================================
00056 
00057 // ================================================
00058 // CigiBaseEntityCtrl
00059 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00060 CigiSymbolTextDefV3_3::CigiSymbolTextDefV3_3(void)
00061 {
00062    PacketID = CIGI_SYMBOL_TEXT_DEFINITION_PACKET_ID_V3_3;
00063    PacketSize = CIGI_SYMBOL_TEXT_DEFINITION_PACKET_SIZE_V3_3;
00064    Version = 3;
00065    MinorVersion = 3;
00066    VariableDataSize = 4;
00067 
00068    SymbolID = 0;
00069    Alignment = TopLeft;
00070    Orientation = LeftToRight;
00071    FontID = 0;
00072    FontSize = 10.0;
00073    Text.clear();
00074 }
00075 
00076 // ================================================
00077 // ~CigiBaseEntityCtrl
00078 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00079 CigiSymbolTextDefV3_3::~CigiSymbolTextDefV3_3(void)
00080 {
00081 }
00082 
00083 // ================================================
00084 // CigiSymbolTextDefV3_3 - Constructor with text
00085 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00086 CigiSymbolTextDefV3_3::CigiSymbolTextDefV3_3(const std::string &TextIn)
00087 {
00088    PacketID = CIGI_SYMBOL_TEXT_DEFINITION_PACKET_ID_V3_3;
00089    PacketSize = CIGI_SYMBOL_TEXT_DEFINITION_PACKET_SIZE_V3_3;
00090    Version = 3;
00091    MinorVersion = 3;
00092    VariableDataSize = 4;
00093 
00094    SymbolID = 0;
00095    Alignment = TopLeft;
00096    Orientation = LeftToRight;
00097    FontID = 0;
00098    FontSize = 10.0;
00099 
00100    SetText(TextIn,false);
00101 }
00102 
00103 // ================================================
00104 // CigiSymbolTextDefV3_3 - Copy Constructor
00105 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00106 CigiSymbolTextDefV3_3::CigiSymbolTextDefV3_3(const CigiSymbolTextDefV3_3 &BaseIn)
00107 : CigiBaseSymbolTextDef((CigiBaseSymbolTextDef &)BaseIn)
00108 {
00109    PacketID = CIGI_SYMBOL_TEXT_DEFINITION_PACKET_ID_V3_3;
00110    PacketSize = CIGI_SYMBOL_TEXT_DEFINITION_PACKET_SIZE_V3_3;
00111    Version = 3;
00112    MinorVersion = 3;
00113 }
00114 
00115 
00116 
00117 // ====================================================================
00118 // Pack and Unpack
00119 // ====================================================================
00120 
00121 // ================================================
00122 // Pack
00123 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00124 int CigiSymbolTextDefV3_3::Pack(CigiBasePacket * Base, Cigi_uint8 * Buff, void *Spec) const
00125 {
00126    PackPointer CDta;
00127 
00128    CigiSymbolTextDefV3_3 * Data =
00129       ( CigiSymbolTextDefV3_3 *)Base;
00130 
00131    CDta.c = Buff;
00132 
00133    *CDta.c++ = PacketID;
00134    *CDta.c++ = (PacketSize + Data->VariableDataSize);
00135 
00136    *CDta.s++ = Data->SymbolID;
00137 
00138    unsigned char HDta = 0;
00139    HDta |= (Data->Alignment & 0x0F);
00140    HDta |= ((Data->Orientation << 4) & 0x30);
00141    *CDta.c++ = HDta;
00142 
00143    *CDta.c++ = Data->FontID;
00144    *CDta.s++ = 0;
00145 
00146    *CDta.f++ = Data->FontSize;
00147 
00148    int tSz = Data->Text.size();
00149    memcpy(CDta.c,Data->Text.c_str(),tSz);
00150    CDta.c += tSz;
00151    memset(CDta.c,0,(Data->VariableDataSize - tSz));
00152 
00153    return(PacketSize + Data->VariableDataSize);
00154 
00155 }
00156 
00157 // ================================================
00158 // Unpack
00159 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00160 int CigiSymbolTextDefV3_3::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00161 {
00162    PackPointer CDta;
00163    unsigned char HDta = 0;
00164 
00165    CDta.c = Buff;
00166 
00167    CDta.c++;  // Step over packet id
00168 
00169    // Determine variable data size;
00170    VariableDataSize = *CDta.c - CIGI_SYMBOL_TEXT_DEFINITION_PACKET_SIZE_V3_3;
00171    CDta.c++;
00172 
00173    if(!Swap)
00174    {
00175       SymbolID = *CDta.s++;
00176 
00177       HDta = *CDta.c++;
00178 
00179       FontID = *CDta.c++;
00180 
00181       CDta.s++;
00182 
00183       FontSize = *CDta.f++;
00184    }
00185    else
00186    {
00187       CigiSwap2(&SymbolID, CDta.s++);
00188 
00189       HDta = *CDta.c++;
00190 
00191       FontID = *CDta.c++;
00192 
00193       CDta.s++;
00194 
00195       CigiSwap4(&FontSize, CDta.f++);
00196    }
00197 
00198 #ifdef WIN32
00199    // this version will walk off the end of the array if the array is not 
00200    // null-terminated
00201    Text = (char*)CDta.c;
00202 #elif defined( __GNUC__ )
00203    // this version adds bogus nulls to the end
00204 //   Text.assign( (char*)CDta.c, VariableDataSize );
00205    // this version is correct, but traverses the string twice (once to 
00206    // determine length, and again to copy)
00207    Text.assign( (char*)CDta.c, strnlen( (char*)CDta.c, VariableDataSize ) );
00208 #else
00209    // unsafe version for unrecognized compilers
00210    // this version will walk off the end of the array if the array is not 
00211    // null-terminated
00212    Text = (char*)CDta.c;
00213 #endif
00214 
00215    Alignment = (AlignmentGrp)(HDta & 0x0f);
00216    Orientation = (OrientationGrp)((HDta >> 4) & 0x03);
00217 
00218    return(PacketSize + VariableDataSize);
00219 
00220 }
00221 
00222 
00223 
00224 

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