1 #include "SQLiteLoggerCommon.h"
2 #include "BitStream.h"
3
4 using namespace RakNet;
5
6 static const char *sqlDataTypeNames[SQLLPDT_COUNT] =
7 {
8 "INTEGER",
9 "INTEGER",
10 "NUMERIC",
11 "TEXT",
12 "BLOB",
13 "BLOB",
14 };
15
GetSqlDataTypeName(SQLLoggerPrimaryDataType idx)16 extern "C" const char *GetSqlDataTypeName(SQLLoggerPrimaryDataType idx) {return sqlDataTypeNames[(int)idx];}
17
Serialize(RakNet::BitStream * bs) const18 void LogParameter::Serialize(RakNet::BitStream *bs) const
19 {
20 unsigned char c = type;
21 bs->Write(c);
22 bs->Write(size);
23 switch (type)
24 {
25 case SQLLPDT_POINTER:
26 case SQLLPDT_BLOB:
27 case SQLLPDT_TEXT:
28 bs->WriteAlignedBytes(data.ucptr, size);
29 break;
30 case SQLLPDT_IMAGE:
31 bs->WriteAlignedBytes(data.ucptr, size);
32 bs->Write(imageWidth);
33 bs->Write(imageHeight);
34 bs->Write(linePitch);
35 bs->Write(input_components);
36 bs->Write(compressionMode);
37 break;
38 case SQLLPDT_REAL:
39 case SQLLPDT_INTEGER:
40 {
41 bs->WriteAlignedBytes((const unsigned char*) &data, size);
42 bs->EndianSwapBytes(bs->GetNumberOfBytesUsed()-size,size);
43 }
44 break;
45 }
46 }
Deserialize(RakNet::BitStream * bs)47 bool LogParameter::Deserialize(RakNet::BitStream *bs)
48 {
49 bool b;
50 unsigned char c;
51 bs->Read(c);
52 type=(SQLLoggerPrimaryDataType)c;
53 b=bs->Read(size);
54 if (size==0)
55 {
56 data.vptr=0;
57 return b;
58 }
59 switch (type)
60 {
61 case SQLLPDT_POINTER:
62 case SQLLPDT_BLOB:
63 case SQLLPDT_TEXT:
64 data.vptr=rakMalloc_Ex(size,__FILE__,__LINE__);
65 b=bs->ReadAlignedBytes(data.ucptr, size);
66 break;
67 case SQLLPDT_IMAGE:
68 data.vptr=rakMalloc_Ex(size,__FILE__,__LINE__);
69 bs->ReadAlignedBytes(data.ucptr, size);
70 bs->Read(imageWidth);
71 bs->Read(imageHeight);
72 bs->Read(linePitch);
73 bs->Read(input_components);
74 b=bs->Read(compressionMode);
75 break;
76 case SQLLPDT_REAL:
77 case SQLLPDT_INTEGER:
78 {
79 b=bs->ReadAlignedBytes((unsigned char*) &data, size);
80 if (bs->DoEndianSwap())
81 bs->ReverseBytesInPlace((unsigned char *)&data, size);
82 }
83 break;
84 }
85
86 return b;
87 }
DoNotFree(void)88 void LogParameter::DoNotFree(void)
89 {
90 type=SQLLPDT_COUNT;
91 }
Free(void)92 void LogParameter::Free(void)
93 {
94 if (type==SQLLPDT_BLOB || type==SQLLPDT_TEXT || type==SQLLPDT_IMAGE || type==SQLLPDT_POINTER)
95 Free(data.vptr);
96 }
Free(void * v)97 void LogParameter::Free(void *v)
98 {
99 rakFree_Ex(v,__FILE__,__LINE__);
100 }
101 #pragma pack(push)
102 #pragma pack(1)
103 // 18 bytes
104 struct TGAHEADER {
105 char idlength;
106 char colourmaptype;
107 char datatypecode;
108 short int colourmaporigin;
109 short int colourmaplength;
110 char colourmapdepth;
111 short int x_origin;
112 short int y_origin;
113 short width;
114 short height;
115 char bitsperpixel;
116 char imagedescriptor;
117 };
118 #pragma pack(pop)
SaveToTGA(const char * filename)119 void RGBImageBlob::SaveToTGA(const char *filename)
120 {
121 // DirectX Color format in memory is BGRA, and written as such to disk.
122 // Written to disk is the correct side up (point of triangle facing up, as it should). However, TGA displays this incorrectly (upside down)
123 // TGA color format, on disk, is BGRA.
124 // DXT compressor input format is ARGB.
125
126 // http://local.wasp.uwa.edu.au/~pbourke/dataformats/tga/
127 FILE *fptr = fopen(filename, "wb");
128 TGAHEADER h;
129 memset(&h,0,sizeof(h));
130 h.datatypecode=2;
131 h.width=imageWidth;
132 if (BitStream::IsBigEndian()==true)
133 BitStream::ReverseBytesInPlace((unsigned char*) &h.width,sizeof(h.width));
134 h.height=imageHeight;
135 if (BitStream::IsBigEndian()==true)
136 BitStream::ReverseBytesInPlace((unsigned char*) &h.height,sizeof(h.height));
137 h.bitsperpixel=input_components*8;
138
139 // TGAs have a flag indicating if they are upside down or right side up
140 // Be sure to set right side up.
141 // http://www.gamedev.net/community/forums/topic.asp?topic_id=42001
142 h.imagedescriptor=(1<<5);
143
144 fwrite(&h,1,sizeof(h),fptr);
145
146 /*
147 putc(0,fptr);
148 putc(0,fptr);
149 putc(2,fptr);
150 putc(0,fptr); putc(0,fptr);
151 putc(0,fptr); putc(0,fptr);
152 putc(0,fptr);
153 putc(0,fptr); putc(0,fptr);
154 putc(0,fptr); putc(0,fptr);
155 putc((imageWidth & 0x00FF),fptr);
156 putc((imageWidth & 0xFF00) / 256,fptr);
157 putc((imageHeight & 0x00FF),fptr);
158 putc((imageHeight & 0xFF00) / 256,fptr);
159 putc(input_components*8,fptr);
160 putc(0,fptr);
161 */
162
163
164 for (int row=0; row < imageHeight; row++)
165 {
166 fwrite((char*) data+row*linePitch, input_components, imageWidth, fptr);
167 }
168 fclose(fptr);
169 }
170