diff options
Diffstat (limited to 'Src/nde/win/IndexField.cpp')
-rw-r--r-- | Src/nde/win/IndexField.cpp | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/Src/nde/win/IndexField.cpp b/Src/nde/win/IndexField.cpp new file mode 100644 index 00000000..8b619b41 --- /dev/null +++ b/Src/nde/win/IndexField.cpp @@ -0,0 +1,145 @@ +/* --------------------------------------------------------------------------- +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; +}
\ No newline at end of file |