00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "MyGUI_Precompiled.h"
00024 #include "MyGUI_Guid.h"
00025 #include "MyGUI_Common.h"
00026 #if MYGUI_PLATFORM == MYGUI_PLATFORM_LINUX
00027 #include <uuid/uuid.h>
00028 #elif MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
00029 #include <objbase.h>
00030 #endif
00031
00032 namespace MyGUI
00033 {
00034 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 };
00035
00036 Guid Guid::parse(const std::string& _value)
00037 {
00038 Guid ret;
00039 size_t start=0;
00040
00041 if (_value.size() == 38)
00042 {
00043 start ++;
00044 #if MYGUI_DEBUG_MODE == 1
00045 if ((_value[0] != '{') || (_value[37] != '}'))
00046 {
00047
00048 return ret;
00049 }
00050 #endif
00051 }
00052
00053 else if (_value.size() != 36)
00054 {
00055
00056 return ret;
00057 }
00058
00059 #if MYGUI_DEBUG_MODE == 1
00060 if ((_value[start + 8] != '-') || (_value[start + 13] != '-') || (_value[start + 18] != '-') || (_value[start + 23] != '-'))
00061 {
00062
00063 return ret;
00064 }
00065 #endif
00066
00067 #define MYGUI_CONVERT_HEX(value) ((convert_hex[ ((value) - 48) & 0x3F]) & 0x3F)
00068
00069 #if MYGUI_DEBUG_MODE == 1
00070 #define MYGUI_CHECK_CONVERT_HEX(value) \
00071 { \
00072 char tmp = ((value) - 48); \
00073 if ((tmp > 63) || (tmp < 0)) \
00074 { \
00075 \
00076 return Guid(); \
00077 } \
00078 tmp = convert_hex[(int)tmp]; \
00079 if (tmp > 63) \
00080 { \
00081 \
00082 return Guid(); \
00083 } \
00084 }
00085 #else
00086 #define MYGUI_CHECK_CONVERT_HEX(value)
00087 #endif
00088
00089
00090 size_t count = 8;
00091 size_t pos = start;
00092 while (count > 0)
00093 {
00094 MYGUI_CHECK_CONVERT_HEX(_value[pos]);
00095 ret.original.data1 <<= 4;
00096 ret.original.data1 += MYGUI_CONVERT_HEX(_value[pos]);
00097 count --;
00098 pos ++;
00099 };
00100
00101 count = 4;
00102 pos ++;
00103 while (count > 0)
00104 {
00105 MYGUI_CHECK_CONVERT_HEX(_value[pos]);
00106 ret.original.data2 <<= 4;
00107 ret.original.data2 += MYGUI_CONVERT_HEX(_value[pos]);
00108 count --;
00109 pos ++;
00110 };
00111
00112 count = 4;
00113 pos ++;
00114 while (count > 0)
00115 {
00116 MYGUI_CHECK_CONVERT_HEX(_value[pos]);
00117 ret.original.data3 <<= 4;
00118 ret.original.data3 += MYGUI_CONVERT_HEX(_value[pos]);
00119 count --;
00120 pos ++;
00121 };
00122
00123 count = 2;
00124 pos ++;
00125 size_t num = 0;
00126 while (count > 0)
00127 {
00128 MYGUI_CHECK_CONVERT_HEX(_value[pos]);
00129 ret.original.data4[num] = MYGUI_CONVERT_HEX(_value[pos++]) << 4;
00130 MYGUI_CHECK_CONVERT_HEX(_value[pos]);
00131 ret.original.data4[num++] += MYGUI_CONVERT_HEX(_value[pos++]);
00132 count --;
00133 };
00134
00135 count = 6;
00136 pos ++;
00137 while (count > 0)
00138 {
00139 MYGUI_CHECK_CONVERT_HEX(_value[pos]);
00140 ret.original.data4[num] = MYGUI_CONVERT_HEX(_value[pos++]) << 4;
00141 MYGUI_CHECK_CONVERT_HEX(_value[pos]);
00142 ret.original.data4[num++] += MYGUI_CONVERT_HEX(_value[pos++]);
00143 count --;
00144 };
00145
00146 #undef MYGUI_CHECK_CONVERT_HEX
00147 #undef MYGUI_CONVERT_HEX
00148
00149 return ret;
00150 }
00151
00152 std::string Guid::print() const
00153 {
00154 const size_t SIZE = 39;
00155 char buff[SIZE];
00156
00157 sprintf(buff, "{%.8X-%.4X-%.4X-%.2X%.2X-%.2X%.2X%.2X%.2X%.2X%.2X}", (int)(original.data1), (int)(original.data2), (int)(original.data3),
00158 (int)(original.data4[0]), (int)(original.data4[1]),
00159 (int)(original.data4[2]), (int)(original.data4[3]), (int)(original.data4[4]), (int)(original.data4[5]), (int)(original.data4[6]), (int)(original.data4[7])
00160 );
00161
00162 return buff;
00163 }
00164
00165 Guid Guid::generate()
00166 {
00167 Guid ret;
00168 #if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
00169 HRESULT result = CoCreateGuid((GUID*)&ret.original.data1);
00170 MYGUI_ASSERT(S_OK == result, "Error generate GUID");
00171 #elif MYGUI_PLATFORM == MYGUI_PLATFORM_LINUX
00172 uuid_generate(ret.vec._data1);
00173 #else
00174
00175 uuid_generate(ret.vec._data1);
00176 #endif
00177 return ret;
00178 }
00179
00180 }