mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-11 09:15:58 +01:00
145 lines
3.4 KiB
C++
145 lines
3.4 KiB
C++
|
/* ---------------------------------------------------------------------------
|
||
|
Nullsoft Database Engine
|
||
|
--------------------
|
||
|
codename: Near Death Experience
|
||
|
--------------------------------------------------------------------------- */
|
||
|
|
||
|
/* ---------------------------------------------------------------------------
|
||
|
|
||
|
IndexField Class
|
||
|
Windows implementation
|
||
|
|
||
|
Field data layout
|
||
|
[4 bytes] Position
|
||
|
[4 bytes] Data Type
|
||
|
[1 byte] Name Length
|
||
|
[Name Length bytes] Name (UTF-8)
|
||
|
--------------------------------------------------------------------------- */
|
||
|
|
||
|
#include "../nde.h"
|
||
|
#include "../ndestring.h"
|
||
|
//---------------------------------------------------------------------------
|
||
|
IndexField::IndexField(unsigned char id, int Pos, int type, const wchar_t *FieldName)
|
||
|
{
|
||
|
InitField();
|
||
|
Type = FIELD_INDEX;
|
||
|
Name = ndestring_wcsdup(FieldName);
|
||
|
ID = id;
|
||
|
Position = Pos;
|
||
|
DataType = type;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
void IndexField::InitField(void)
|
||
|
{
|
||
|
index = 0;
|
||
|
Type = FIELD_INDEX;
|
||
|
Name = NULL;
|
||
|
ID = 0;
|
||
|
Position = -1;
|
||
|
DataType = FIELD_UNKNOWN;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
IndexField::IndexField()
|
||
|
{
|
||
|
InitField();
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
IndexField::~IndexField()
|
||
|
{
|
||
|
ndestring_release(Name);
|
||
|
delete index;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
void IndexField::ReadTypedData(const uint8_t *data, size_t len)
|
||
|
{
|
||
|
unsigned char c;
|
||
|
int pos=0;
|
||
|
CHECK_INT(len);
|
||
|
Position = GET_INT(); pos += 4;
|
||
|
CHECK_INT(len);
|
||
|
DataType = GET_INT(); pos += 4;
|
||
|
CHECK_CHAR(len);
|
||
|
c = GET_CHAR(); pos++;
|
||
|
if (c)
|
||
|
{
|
||
|
CHECK_BIN(len, c);
|
||
|
|
||
|
int string_length = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)(data+pos), c, 0, 0);
|
||
|
Name = ndestring_malloc((string_length+1)*sizeof(wchar_t));
|
||
|
MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)(data+pos), c, Name, string_length);
|
||
|
Name[string_length]=0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
void IndexField::WriteTypedData(uint8_t *data, size_t len)
|
||
|
{
|
||
|
int pos=0;
|
||
|
CHECK_INT(len);
|
||
|
PUT_INT(Position); pos += 4;
|
||
|
|
||
|
CHECK_INT(len);
|
||
|
PUT_INT(DataType); pos += 4;
|
||
|
CHECK_CHAR(len);
|
||
|
|
||
|
CHECK_CHAR(len);
|
||
|
|
||
|
if (Name)
|
||
|
{
|
||
|
size_t string_length = WideCharToMultiByte(CP_UTF8, 0, Name, -1, 0, 0, 0, 0);
|
||
|
if (string_length)
|
||
|
{
|
||
|
PUT_CHAR((uint8_t)string_length-1);
|
||
|
pos++;
|
||
|
|
||
|
CHECK_BIN(len, string_length-1);
|
||
|
WideCharToMultiByte(CP_UTF8, 0, Name, -1, (LPSTR)(data+pos), (int)string_length-1, 0, 0);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
PUT_CHAR(0);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
PUT_CHAR(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
wchar_t *IndexField::GetIndexName(void)
|
||
|
{
|
||
|
return Name;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
size_t IndexField::GetDataSize(void)
|
||
|
{
|
||
|
size_t s=9;
|
||
|
if (Name)
|
||
|
{
|
||
|
int string_length=WideCharToMultiByte(CP_UTF8, 0, Name, -1, 0, 0, 0, 0);
|
||
|
if (string_length)
|
||
|
s+=string_length-1;
|
||
|
}
|
||
|
s++;
|
||
|
return s;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
int IndexField::Compare(Field * /*Entry*/)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
int IndexField::TranslateToIndex(int Id, IndexField *toindex)
|
||
|
{
|
||
|
if (index && toindex && toindex->index)
|
||
|
return index->TranslateIndex(Id, toindex->index);
|
||
|
return -1;
|
||
|
}
|