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