00001 
00032 #ifndef LL_LLDATAPACKER_H 
00033 #define LL_LLDATAPACKER_H
00034 
00035 class LLColor4;
00036 class LLColor4U;
00037 class LLVector2;
00038 class LLVector3;
00039 class LLVector4;
00040 class LLUUID;
00041 
00042 class LLDataPacker
00043 {
00044 public:
00045         virtual ~LLDataPacker() {}
00046         
00047         virtual void            reset()         { llerrs << "Using unimplemented datapacker reset!" << llendl; };
00048         virtual void dumpBufferToLog()  { llerrs << "dumpBufferToLog not implemented for this type!" << llendl; }
00049 
00050         virtual BOOL            hasNext() const = 0;
00051 
00052         virtual BOOL            packString(const char *value, const char *name) = 0;
00053         virtual BOOL            unpackString(std::string& value, const char *name) = 0;
00054 
00055         virtual BOOL            packBinaryData(const U8 *value, S32 size, const char *name) = 0;
00056         virtual BOOL            unpackBinaryData(U8 *value, S32 &size, const char *name) = 0;
00057 
00058         
00059         virtual BOOL            packBinaryDataFixed(const U8 *value, S32 size, const char *name) = 0;
00060         virtual BOOL            unpackBinaryDataFixed(U8 *value, S32 size, const char *name) = 0;
00061 
00062         virtual BOOL            packU8(const U8 value, const char *name) = 0;
00063         virtual BOOL            unpackU8(U8 &value, const char *name) = 0;
00064 
00065         virtual BOOL            packU16(const U16 value, const char *name) = 0;
00066         virtual BOOL            unpackU16(U16 &value, const char *name) = 0;
00067 
00068         virtual BOOL            packU32(const U32 value, const char *name) = 0;
00069         virtual BOOL            unpackU32(U32 &value, const char *name) = 0;
00070 
00071         virtual BOOL            packS32(const S32 value, const char *name) = 0;
00072         virtual BOOL            unpackS32(S32 &value, const char *name) = 0;
00073 
00074         virtual BOOL            packF32(const F32 value, const char *name) = 0;
00075         virtual BOOL            unpackF32(F32 &value, const char *name) = 0;
00076 
00077         
00078         
00079         BOOL                            packFixed(const F32 value, const char *name,
00080                                                                 const BOOL is_signed, const U32 int_bits, const U32 frac_bits);
00081         BOOL                            unpackFixed(F32 &value, const char *name,
00082                                                                 const BOOL is_signed, const U32 int_bits, const U32 frac_bits);
00083 
00084         virtual BOOL            packColor4(const LLColor4 &value, const char *name) = 0;
00085         virtual BOOL            unpackColor4(LLColor4 &value, const char *name) = 0;
00086 
00087         virtual BOOL            packColor4U(const LLColor4U &value, const char *name) = 0;
00088         virtual BOOL            unpackColor4U(LLColor4U &value, const char *name) = 0;
00089 
00090         virtual BOOL            packVector2(const LLVector2 &value, const char *name) = 0;
00091         virtual BOOL            unpackVector2(LLVector2 &value, const char *name) = 0;
00092 
00093         virtual BOOL            packVector3(const LLVector3 &value, const char *name) = 0;
00094         virtual BOOL            unpackVector3(LLVector3 &value, const char *name) = 0;
00095 
00096         virtual BOOL            packVector4(const LLVector4 &value, const char *name) = 0;
00097         virtual BOOL            unpackVector4(LLVector4 &value, const char *name) = 0;
00098 
00099         virtual BOOL            packUUID(const LLUUID &value, const char *name) = 0;
00100         virtual BOOL            unpackUUID(LLUUID &value, const char *name) = 0;
00101                         U32                     getPassFlags() const    { return mPassFlags; }
00102                         void            setPassFlags(U32 flags) { mPassFlags = flags; }
00103 protected:
00104         LLDataPacker();
00105 protected:
00106         U32     mPassFlags;
00107         BOOL mWriteEnabled; 
00108 };
00109 
00110 class LLDataPackerBinaryBuffer : public LLDataPacker
00111 {
00112 public:
00113         LLDataPackerBinaryBuffer(U8 *bufferp, S32 size)
00114         :       LLDataPacker(),
00115                 mBufferp(bufferp),
00116                 mCurBufferp(bufferp),
00117                 mBufferSize(size)
00118         {
00119                 mWriteEnabled = TRUE;
00120         }
00121 
00122         LLDataPackerBinaryBuffer()
00123         :       LLDataPacker(),
00124                 mBufferp(NULL),
00125                 mCurBufferp(NULL),
00126                 mBufferSize(0)
00127         {
00128         }
00129 
00130          BOOL                packString(const char *value, const char *name);
00131          BOOL                unpackString(std::string& value, const char *name);
00132 
00133          BOOL                packBinaryData(const U8 *value, S32 size, const char *name);
00134          BOOL                unpackBinaryData(U8 *value, S32 &size, const char *name);
00135 
00136         
00137          BOOL                packBinaryDataFixed(const U8 *value, S32 size, const char *name);
00138          BOOL                unpackBinaryDataFixed(U8 *value, S32 size, const char *name);
00139 
00140          BOOL                packU8(const U8 value, const char *name);
00141          BOOL                unpackU8(U8 &value, const char *name);
00142 
00143          BOOL                packU16(const U16 value, const char *name);
00144          BOOL                unpackU16(U16 &value, const char *name);
00145 
00146          BOOL                packU32(const U32 value, const char *name);
00147          BOOL                unpackU32(U32 &value, const char *name);
00148 
00149          BOOL                packS32(const S32 value, const char *name);
00150          BOOL                unpackS32(S32 &value, const char *name);
00151 
00152          BOOL                packF32(const F32 value, const char *name);
00153          BOOL                unpackF32(F32 &value, const char *name);
00154 
00155          BOOL                packColor4(const LLColor4 &value, const char *name);
00156          BOOL                unpackColor4(LLColor4 &value, const char *name);
00157 
00158          BOOL                packColor4U(const LLColor4U &value, const char *name);
00159          BOOL                unpackColor4U(LLColor4U &value, const char *name);
00160 
00161          BOOL                packVector2(const LLVector2 &value, const char *name);
00162          BOOL                unpackVector2(LLVector2 &value, const char *name);
00163 
00164          BOOL                packVector3(const LLVector3 &value, const char *name);
00165          BOOL                unpackVector3(LLVector3 &value, const char *name);
00166 
00167          BOOL                packVector4(const LLVector4 &value, const char *name);
00168          BOOL                unpackVector4(LLVector4 &value, const char *name);
00169 
00170          BOOL                packUUID(const LLUUID &value, const char *name);
00171          BOOL                unpackUUID(LLUUID &value, const char *name);
00172 
00173                                 S32                     getCurrentSize() const  { return (S32)(mCurBufferp - mBufferp); }
00174                                 S32                     getBufferSize() const   { return mBufferSize; }
00175                                 void            reset()                         { mCurBufferp = mBufferp; mWriteEnabled = (mCurBufferp != NULL); }
00176                                 void            freeBuffer()            { delete [] mBufferp; mBufferp = mCurBufferp = NULL; mBufferSize = 0; mWriteEnabled = FALSE; }
00177                                 void            assignBuffer(U8 *bufferp, S32 size)
00178                                 {
00179                                         mBufferp = bufferp;
00180                                         mCurBufferp = bufferp;
00181                                         mBufferSize = size;
00182                                         mWriteEnabled = TRUE;
00183                                 }
00184                                 const LLDataPackerBinaryBuffer& operator=(const LLDataPackerBinaryBuffer &a);
00185 
00186          BOOL                hasNext() const                 { return getCurrentSize() < getBufferSize(); }
00187 
00188          void dumpBufferToLog();
00189 protected:
00190         inline BOOL verifyLength(const S32 data_size, const char *name);
00191 
00192         U8 *mBufferp;
00193         U8 *mCurBufferp;
00194         S32 mBufferSize;
00195 };
00196 
00197 inline BOOL LLDataPackerBinaryBuffer::verifyLength(const S32 data_size, const char *name)
00198 {
00199         if (mWriteEnabled && (mCurBufferp - mBufferp) > mBufferSize - data_size)
00200         {
00201                 llwarns << "Buffer overflow in BinaryBuffer length verify, field name " << name << "!" << llendl;
00202                 llwarns << "Current pos: " << (int)(mCurBufferp - mBufferp) << " Buffer size: " << mBufferSize << " Data size: " << data_size << llendl;
00203                 return FALSE;
00204         }
00205 
00206         return TRUE;
00207 }
00208 
00209 class LLDataPackerAsciiBuffer : public LLDataPacker
00210 {
00211 public:
00212         LLDataPackerAsciiBuffer(char* bufferp, S32 size)
00213         {
00214                 mBufferp = bufferp;
00215                 mCurBufferp = bufferp;
00216                 mBufferSize = size;
00217                 mPassFlags = 0;
00218                 mIncludeNames = FALSE;
00219                 mWriteEnabled = TRUE;
00220         }
00221 
00222         LLDataPackerAsciiBuffer()
00223         {
00224                 mBufferp = NULL;
00225                 mCurBufferp = NULL;
00226                 mBufferSize = 0;
00227                 mPassFlags = 0;
00228                 mIncludeNames = FALSE;
00229                 mWriteEnabled = FALSE;
00230         }
00231 
00232          BOOL                packString(const char *value, const char *name);
00233          BOOL                unpackString(std::string& value, const char *name);
00234 
00235          BOOL                packBinaryData(const U8 *value, S32 size, const char *name);
00236          BOOL                unpackBinaryData(U8 *value, S32 &size, const char *name);
00237 
00238         
00239          BOOL                packBinaryDataFixed(const U8 *value, S32 size, const char *name);
00240          BOOL                unpackBinaryDataFixed(U8 *value, S32 size, const char *name);
00241 
00242          BOOL                packU8(const U8 value, const char *name);
00243          BOOL                unpackU8(U8 &value, const char *name);
00244 
00245          BOOL                packU16(const U16 value, const char *name);
00246          BOOL                unpackU16(U16 &value, const char *name);
00247 
00248          BOOL                packU32(const U32 value, const char *name);
00249          BOOL                unpackU32(U32 &value, const char *name);
00250 
00251          BOOL                packS32(const S32 value, const char *name);
00252          BOOL                unpackS32(S32 &value, const char *name);
00253 
00254          BOOL                packF32(const F32 value, const char *name);
00255          BOOL                unpackF32(F32 &value, const char *name);
00256 
00257          BOOL                packColor4(const LLColor4 &value, const char *name);
00258          BOOL                unpackColor4(LLColor4 &value, const char *name);
00259 
00260          BOOL                packColor4U(const LLColor4U &value, const char *name);
00261          BOOL                unpackColor4U(LLColor4U &value, const char *name);
00262 
00263          BOOL                packVector2(const LLVector2 &value, const char *name);
00264          BOOL                unpackVector2(LLVector2 &value, const char *name);
00265 
00266          BOOL                packVector3(const LLVector3 &value, const char *name);
00267          BOOL                unpackVector3(LLVector3 &value, const char *name);
00268 
00269          BOOL                packVector4(const LLVector4 &value, const char *name);
00270          BOOL                unpackVector4(LLVector4 &value, const char *name);
00271 
00272          BOOL                packUUID(const LLUUID &value, const char *name);
00273          BOOL                unpackUUID(LLUUID &value, const char *name);
00274 
00275         void            setIncludeNames(BOOL b) { mIncludeNames = b; }
00276 
00277         
00278         S32                     getCurrentSize() const  { return (S32)(mCurBufferp - mBufferp) + 1; }
00279 
00280         S32                     getBufferSize() const   { return mBufferSize; }
00281          void                reset()                                 { mCurBufferp = mBufferp; mWriteEnabled = (mCurBufferp != NULL); }
00282 
00283          BOOL                hasNext() const                 { return getCurrentSize() < getBufferSize(); }
00284 
00285         inline void     freeBuffer();
00286         inline void     assignBuffer(char* bufferp, S32 size);
00287         void            dump();
00288 
00289 protected:
00290         void writeIndentedName(const char *name);
00291         BOOL getValueStr(const char *name, char *out_value, const S32 value_len);
00292         
00293 protected:
00294         inline BOOL verifyLength(const S32 data_size, const char *name);
00295 
00296         char *mBufferp;
00297         char *mCurBufferp;
00298         S32 mBufferSize;
00299         BOOL mIncludeNames;     
00300 };
00301 
00302 inline void     LLDataPackerAsciiBuffer::freeBuffer()
00303 {
00304         delete [] mBufferp; 
00305         mBufferp = mCurBufferp = NULL; 
00306         mBufferSize = 0;
00307         mWriteEnabled = FALSE;
00308 }
00309 
00310 inline void     LLDataPackerAsciiBuffer::assignBuffer(char* bufferp, S32 size)
00311 {
00312         mBufferp = bufferp;
00313         mCurBufferp = bufferp;
00314         mBufferSize = size;
00315         mWriteEnabled = TRUE;
00316 }
00317 
00318 inline BOOL LLDataPackerAsciiBuffer::verifyLength(const S32 data_size, const char *name)
00319 {
00320         if (mWriteEnabled && (mCurBufferp - mBufferp) > mBufferSize - data_size)
00321         {
00322                 llwarns << "Buffer overflow in AsciiBuffer length verify, field name " << name << "!" << llendl;
00323                 llwarns << "Current pos: " << (int)(mCurBufferp - mBufferp) << " Buffer size: " << mBufferSize << " Data size: " << data_size << llendl;
00324                 return FALSE;
00325         }
00326 
00327         return TRUE;
00328 }
00329 
00330 class LLDataPackerAsciiFile : public LLDataPacker
00331 {
00332 public:
00333         LLDataPackerAsciiFile(FILE *fp, const S32 indent = 2)
00334         :       LLDataPacker(),
00335                 mIndent(indent),
00336                 mFP(fp),
00337                 mOutputStream(NULL),
00338                 mInputStream(NULL)
00339         {
00340         }
00341 
00342         LLDataPackerAsciiFile(std::ostream& output_stream, const S32 indent = 2)
00343         :       LLDataPacker(),
00344                 mIndent(indent),
00345                 mFP(NULL),
00346                 mOutputStream(&output_stream),
00347                 mInputStream(NULL)
00348         {
00349                 mWriteEnabled = TRUE;
00350         }
00351 
00352         LLDataPackerAsciiFile(std::istream& input_stream, const S32 indent = 2)
00353         :       LLDataPacker(),
00354                 mIndent(indent),
00355                 mFP(NULL),
00356                 mOutputStream(NULL),
00357                 mInputStream(&input_stream)
00358         {
00359         }
00360 
00361          BOOL                packString(const char *value, const char *name);
00362          BOOL                unpackString(std::string& value, const char *name);
00363 
00364          BOOL                packBinaryData(const U8 *value, S32 size, const char *name);
00365          BOOL                unpackBinaryData(U8 *value, S32 &size, const char *name);
00366 
00367          BOOL                packBinaryDataFixed(const U8 *value, S32 size, const char *name);
00368          BOOL                unpackBinaryDataFixed(U8 *value, S32 size, const char *name);
00369 
00370          BOOL                packU8(const U8 value, const char *name);
00371          BOOL                unpackU8(U8 &value, const char *name);
00372 
00373          BOOL                packU16(const U16 value, const char *name);
00374          BOOL                unpackU16(U16 &value, const char *name);
00375 
00376          BOOL                packU32(const U32 value, const char *name);
00377          BOOL                unpackU32(U32 &value, const char *name);
00378 
00379          BOOL                packS32(const S32 value, const char *name);
00380          BOOL                unpackS32(S32 &value, const char *name);
00381 
00382          BOOL                packF32(const F32 value, const char *name);
00383          BOOL                unpackF32(F32 &value, const char *name);
00384 
00385          BOOL                packColor4(const LLColor4 &value, const char *name);
00386          BOOL                unpackColor4(LLColor4 &value, const char *name);
00387 
00388          BOOL                packColor4U(const LLColor4U &value, const char *name);
00389          BOOL                unpackColor4U(LLColor4U &value, const char *name);
00390 
00391          BOOL                packVector2(const LLVector2 &value, const char *name);
00392          BOOL                unpackVector2(LLVector2 &value, const char *name);
00393 
00394          BOOL                packVector3(const LLVector3 &value, const char *name);
00395          BOOL                unpackVector3(LLVector3 &value, const char *name);
00396 
00397          BOOL                packVector4(const LLVector4 &value, const char *name);
00398          BOOL                unpackVector4(LLVector4 &value, const char *name);
00399 
00400          BOOL                packUUID(const LLUUID &value, const char *name);
00401          BOOL                unpackUUID(LLUUID &value, const char *name);
00402 protected:
00403         void writeIndentedName(const char *name);
00404         BOOL getValueStr(const char *name, char *out_value, const S32 value_len);
00405         
00406          BOOL                hasNext() const                 { return true; }
00407 
00408 protected:
00409         S32 mIndent;
00410         FILE *mFP;
00411         std::ostream* mOutputStream;
00412         std::istream* mInputStream;
00413 };
00414 
00415 #endif // LL_LLDATAPACKER
00416