Files
SLikeNet/DependentExtensions/SQLite3Plugin/Logger/SQLiteLoggerCommon.cpp
2025-11-24 14:19:51 +05:30

184 lines
4.8 KiB
C++

/*
* This file was taken from RakNet 4.082.
* Please see licenses/RakNet license.txt for the underlying license and related copyright.
*
* Modified work: Copyright (c) 2016-2017, SLikeSoft UG (haftungsbeschränkt)
*
* This source code was modified by SLikeSoft. Modifications are licensed under the MIT-style
* license found in the license.txt file in the root directory of this source tree.
*/
#include "SQLiteLoggerCommon.h"
#include "slikenet/BitStream.h"
#include "slikenet/linux_adapter.h"
#include "slikenet/osx_adapter.h"
using namespace SLNet;
static const char *sqlDataTypeNames[SQLLPDT_COUNT] =
{
"INTEGER",
"INTEGER",
"NUMERIC",
"TEXT",
"BLOB",
"BLOB",
};
extern "C" const char *GetSqlDataTypeName(SQLLoggerPrimaryDataType idx) {return sqlDataTypeNames[(int)idx];}
void LogParameter::Serialize(SLNet::BitStream *bs) const
{
// #med consider changing SQLLoggerPrimaryDataType to unsigned char type or add bounds checks here?
unsigned char c = static_cast<unsigned char>(type);
bs->Write(c);
bs->Write(size);
switch (type)
{
case SQLLPDT_POINTER:
case SQLLPDT_BLOB:
case SQLLPDT_TEXT:
bs->WriteAlignedBytes(data.ucptr, size);
break;
case SQLLPDT_IMAGE:
bs->WriteAlignedBytes(data.ucptr, size);
bs->Write(imageWidth);
bs->Write(imageHeight);
bs->Write(linePitch);
bs->Write(input_components);
bs->Write(compressionMode);
break;
case SQLLPDT_REAL:
case SQLLPDT_INTEGER:
{
bs->WriteAlignedBytes((const unsigned char*) &data, size);
bs->EndianSwapBytes(bs->GetNumberOfBytesUsed()-size,size);
}
break;
}
}
bool LogParameter::Deserialize(SLNet::BitStream *bs)
{
bool b;
unsigned char c;
bs->Read(c);
type=(SQLLoggerPrimaryDataType)c;
b=bs->Read(size);
if (size==0)
{
data.vptr=0;
return b;
}
switch (type)
{
case SQLLPDT_POINTER:
case SQLLPDT_BLOB:
case SQLLPDT_TEXT:
data.vptr=rakMalloc_Ex(size,_FILE_AND_LINE_);
b=bs->ReadAlignedBytes(data.ucptr, size);
break;
case SQLLPDT_IMAGE:
data.vptr=rakMalloc_Ex(size,_FILE_AND_LINE_);
bs->ReadAlignedBytes(data.ucptr, size);
bs->Read(imageWidth);
bs->Read(imageHeight);
bs->Read(linePitch);
bs->Read(input_components);
b=bs->Read(compressionMode);
break;
case SQLLPDT_REAL:
case SQLLPDT_INTEGER:
{
b=bs->ReadAlignedBytes((unsigned char*) &data, size);
if (bs->DoEndianSwap())
bs->ReverseBytesInPlace((unsigned char *)&data, size);
}
break;
}
return b;
}
void LogParameter::DoNotFree(void)
{
type=SQLLPDT_COUNT;
}
void LogParameter::Free(void)
{
if (type==SQLLPDT_BLOB || type==SQLLPDT_TEXT || type==SQLLPDT_IMAGE || type==SQLLPDT_POINTER)
Free(data.vptr);
}
void LogParameter::Free(void *v)
{
rakFree_Ex(v,_FILE_AND_LINE_);
}
#pragma pack(push)
#pragma pack(1)
// 18 bytes
struct TGAHEADER {
char idlength;
char colourmaptype;
char datatypecode;
short int colourmaporigin;
short int colourmaplength;
char colourmapdepth;
short int x_origin;
short int y_origin;
short width;
short height;
char bitsperpixel;
char imagedescriptor;
};
#pragma pack(pop)
void RGBImageBlob::SaveToTGA(const char *filename)
{
// DirectX Color format in memory is BGRA, and written as such to disk.
// Written to disk is the correct side up (point of triangle facing up, as it should). However, TGA displays this incorrectly (upside down)
// TGA color format, on disk, is BGRA.
// DXT compressor input format is ARGB.
// http://local.wasp.uwa.edu.au/~pbourke/dataformats/tga/
FILE *fptr;
fopen_s(&fptr, filename, "wb");
TGAHEADER h;
memset(&h,0,sizeof(h));
h.datatypecode=2;
h.width=imageWidth;
if (BitStream::IsBigEndian()==true)
BitStream::ReverseBytesInPlace((unsigned char*) &h.width,sizeof(h.width));
h.height=imageHeight;
if (BitStream::IsBigEndian()==true)
BitStream::ReverseBytesInPlace((unsigned char*) &h.height,sizeof(h.height));
h.bitsperpixel=input_components*8;
// TGAs have a flag indicating if they are upside down or right side up
// Be sure to set right side up.
// http://www.gamedev.net/community/forums/topic.asp?topic_id=42001
h.imagedescriptor=(1<<5);
fwrite(&h,1,sizeof(h),fptr);
/*
putc(0,fptr);
putc(0,fptr);
putc(2,fptr);
putc(0,fptr); putc(0,fptr);
putc(0,fptr); putc(0,fptr);
putc(0,fptr);
putc(0,fptr); putc(0,fptr);
putc(0,fptr); putc(0,fptr);
putc((imageWidth & 0x00FF),fptr);
putc((imageWidth & 0xFF00) / 256,fptr);
putc((imageHeight & 0x00FF),fptr);
putc((imageHeight & 0xFF00) / 256,fptr);
putc(input_components*8,fptr);
putc(0,fptr);
*/
for (int row=0; row < imageHeight; row++)
{
fwrite((char*) data+row*linePitch, input_components, imageWidth, fptr);
}
fclose(fptr);
}