mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-21 10:25:57 +01:00
161 lines
3.9 KiB
C++
161 lines
3.9 KiB
C++
|
/* ---------------------------------------------------------------------------
|
||
|
Nullsoft Database Engine
|
||
|
--------------------
|
||
|
codename: Near Death Experience
|
||
|
--------------------------------------------------------------------------- */
|
||
|
|
||
|
/* ---------------------------------------------------------------------------
|
||
|
|
||
|
ColumnField Class
|
||
|
Mac OS X implementation
|
||
|
|
||
|
Field data layout:
|
||
|
[1 byte] Field Type
|
||
|
[1 byte] Unused (maybe convert to 'searchable')
|
||
|
[1 byte] Name Length
|
||
|
[Name Length bytes] Name (UTF-8)
|
||
|
--------------------------------------------------------------------------- */
|
||
|
|
||
|
#include "../nde.h"
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
ColumnField::ColumnField(unsigned char FieldID, CFStringRef FieldName, unsigned char FieldType, Table *parentTable)
|
||
|
{
|
||
|
InitField();
|
||
|
Type = FIELD_COLUMN;
|
||
|
MyType = FieldType;
|
||
|
Name = (CFStringRef)CFRetain(FieldName);
|
||
|
ID = FieldID;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
void ColumnField::InitField(void)
|
||
|
{
|
||
|
searchable = false;
|
||
|
MyType = FIELD_UNKNOWN;
|
||
|
Type = FIELD_COLUMN;
|
||
|
Name = NULL;
|
||
|
ID = 0;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
ColumnField::ColumnField()
|
||
|
{
|
||
|
InitField();
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
ColumnField::~ColumnField()
|
||
|
{
|
||
|
if (Name)
|
||
|
CFRelease(Name);
|
||
|
}
|
||
|
|
||
|
void ColumnField::SetSearchable(bool val)
|
||
|
{
|
||
|
searchable=val;
|
||
|
}
|
||
|
|
||
|
bool ColumnField::IsSearchableField() const
|
||
|
{
|
||
|
return searchable;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
void ColumnField::ReadTypedData(const uint8_t *data, size_t len)
|
||
|
{
|
||
|
unsigned char c;
|
||
|
int pos=0;
|
||
|
|
||
|
CHECK_CHAR(len);
|
||
|
MyType = GET_CHAR(); pos++;
|
||
|
|
||
|
CHECK_CHAR(len);
|
||
|
pos++;
|
||
|
|
||
|
CHECK_CHAR(len);
|
||
|
c = GET_CHAR(); pos++;
|
||
|
if (c)
|
||
|
{
|
||
|
CHECK_BIN(len, c);
|
||
|
if (Name)
|
||
|
CFRelease(Name);
|
||
|
Name = CFStringCreateWithBytes(kCFAllocatorDefault, data+pos, c, kCFStringEncodingUTF8, false);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
void ColumnField::WriteTypedData(uint8_t *data, size_t len)
|
||
|
{
|
||
|
int pos = 0;
|
||
|
|
||
|
CHECK_CHAR(len);
|
||
|
PUT_CHAR(MyType); pos++;
|
||
|
|
||
|
CHECK_CHAR(len);
|
||
|
PUT_CHAR(0/*(char)indexUnique*/);
|
||
|
pos++;
|
||
|
|
||
|
if (Name)
|
||
|
{
|
||
|
CFIndex lengthRequired=0;
|
||
|
CFStringGetBytes(Name, CFRangeMake(0, CFStringGetLength(Name)), kCFStringEncodingUTF8, 0, false, NULL, 0, &lengthRequired);
|
||
|
CHECK_BIN(len, lengthRequired+1);
|
||
|
PUT_CHAR(lengthRequired); pos++;
|
||
|
|
||
|
CFStringGetBytes(Name, CFRangeMake(0, CFStringGetLength(Name)), kCFStringEncodingUTF8, 0, false, data+pos, lengthRequired, 0);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
PUT_CHAR(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
unsigned char ColumnField::GetDataType(void)
|
||
|
{
|
||
|
return MyType;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
void ColumnField::SetDataType(unsigned char type)
|
||
|
{
|
||
|
if ((MyType == FIELD_INTEGER || MyType == FIELD_BOOLEAN || MyType == FIELD_DATETIME || MyType == FIELD_LENGTH) &&
|
||
|
(type == FIELD_INTEGER || type == FIELD_BOOLEAN || type == FIELD_DATETIME || type == FIELD_LENGTH)) {
|
||
|
MyType = type;
|
||
|
}
|
||
|
// going from string to filename or filename to string is OK
|
||
|
if ((MyType == FIELD_FILENAME && type == FIELD_STRING)
|
||
|
|| (MyType == FIELD_STRING && type == FIELD_FILENAME))
|
||
|
{
|
||
|
MyType = type;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
CFStringRef ColumnField::GetFieldName(void)
|
||
|
{
|
||
|
return Name;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
size_t ColumnField::GetDataSize(void)
|
||
|
{
|
||
|
if (Name)
|
||
|
{
|
||
|
CFIndex lengthRequired=0;
|
||
|
CFStringGetBytes(Name, CFRangeMake(0, CFStringGetLength(Name)), kCFStringEncodingUTF8, 0, false, NULL, 0, &lengthRequired);
|
||
|
return lengthRequired+3;
|
||
|
}
|
||
|
else
|
||
|
return 3;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
int ColumnField::Compare(Field * /*Entry*/)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|