/*!
@file
@author Albert Semenov
@date 09/2008
@module
*/
/*
This file is part of MyGUI.
MyGUI is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MyGUI is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with MyGUI. If not, see .
*/
#include "MyGUI_Precompiled.h"
#include "MyGUI_Guid.h"
#if MYGUI_PLATFORM == MYGUI_PLATFORM_LINUX || MYGUI_PLATFORM == MYGUI_PLATFORM_APPLE
#include
#elif MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
#include
#endif
namespace MyGUI
{
const char Guid::convert_hex[64] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 64, 64, 64, 64, 64, 64,
64, 10, 11, 12, 13, 14, 15, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 10, 11, 12, 13, 14, 15, 64, 64, 64, 64, 64, 64, 64, 64, 64
};
Guid Guid::parse(const std::string& _value)
{
Guid ret;
size_t start=0;
// формат со скобками { ... }
if (_value.size() == 38)
{
start ++;
#if MYGUI_DEBUG_MODE == 1
if ((_value[0] != '{') || (_value[37] != '}'))
{
return ret;
}
#endif
}
// формат без скобок ...
else if (_value.size() != 36)
{
return ret;
}
#if MYGUI_DEBUG_MODE == 1
if ((_value[start + 8] != '-') || (_value[start + 13] != '-') || (_value[start + 18] != '-') || (_value[start + 23] != '-'))
{
return ret;
}
#endif
#define MYGUI_CONVERT_HEX(value) ((convert_hex[ ((value) - 48) & 0x3F]) & 0x3F)
#if MYGUI_DEBUG_MODE == 1
#define MYGUI_CHECK_CONVERT_HEX(value) \
{ \
char tmp = ((value) - 48); \
if ((tmp > 63) || (tmp < 0)) \
{ \
/*MYGUI_LOG(Error, "error parse guid'" << _value << "'");*/ \
return Guid(); \
} \
tmp = convert_hex[(int)tmp]; \
if (tmp > 63) \
{ \
/*MYGUI_LOG(Error, "error parse guid'" << _value << "'");*/ \
return Guid(); \
} \
}
#else
#define MYGUI_CHECK_CONVERT_HEX(value)
#endif
size_t count = 8;
size_t pos = start;
while (count > 0)
{
MYGUI_CHECK_CONVERT_HEX(_value[pos]);
ret.original.data1 <<= 4;
ret.original.data1 += MYGUI_CONVERT_HEX(_value[pos]);
count --;
pos ++;
}
count = 4;
pos ++;
while (count > 0)
{
MYGUI_CHECK_CONVERT_HEX(_value[pos]);
ret.original.data2 <<= 4;
ret.original.data2 += MYGUI_CONVERT_HEX(_value[pos]);
count --;
pos ++;
}
count = 4;
pos ++;
while (count > 0)
{
MYGUI_CHECK_CONVERT_HEX(_value[pos]);
ret.original.data3 <<= 4;
ret.original.data3 += MYGUI_CONVERT_HEX(_value[pos]);
count --;
pos ++;
}
count = 2; // здесь по два байта парсится
pos ++;
size_t num = 0;
while (count > 0)
{
MYGUI_CHECK_CONVERT_HEX(_value[pos]);
ret.original.data4[num] = MYGUI_CONVERT_HEX(_value[pos++]) << 4;
MYGUI_CHECK_CONVERT_HEX(_value[pos]);
ret.original.data4[num++] += MYGUI_CONVERT_HEX(_value[pos++]);
count --;
}
count = 6; // здесь по два байта парсится
pos ++;
while (count > 0)
{
MYGUI_CHECK_CONVERT_HEX(_value[pos]);
ret.original.data4[num] = MYGUI_CONVERT_HEX(_value[pos++]) << 4;
MYGUI_CHECK_CONVERT_HEX(_value[pos]);
ret.original.data4[num++] += MYGUI_CONVERT_HEX(_value[pos++]);
count --;
}
#undef MYGUI_CHECK_CONVERT_HEX
#undef MYGUI_CONVERT_HEX
return ret;
}
std::string Guid::print() const
{
const size_t SIZE = 39;
char buff[SIZE];
sprintf(buff, "{%.8X-%.4X-%.4X-%.2X%.2X-%.2X%.2X%.2X%.2X%.2X%.2X}", (int)(original.data1), (int)(original.data2), (int)(original.data3),
(int)(original.data4[0]), (int)(original.data4[1]),
(int)(original.data4[2]), (int)(original.data4[3]), (int)(original.data4[4]), (int)(original.data4[5]), (int)(original.data4[6]), (int)(original.data4[7])
);
return buff;
}
Guid Guid::generate()
{
Guid ret;
#if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
HRESULT result = CoCreateGuid((GUID*)&ret.original.data1);
MYGUI_ASSERT(S_OK == result, "Error generate GUID");
#elif MYGUI_PLATFORM == MYGUI_PLATFORM_LINUX
uuid_generate(ret.vec._data1);
#else
//FIXME
uuid_generate(ret.vec._data1);// or what else?
#endif
return ret;
}
} // namespace MyGUI