MyGUI  3.0.1
MyGUI_Guid.cpp
Go to the documentation of this file.
1 
7 /*
8  This file is part of MyGUI.
9 
10  MyGUI is free software: you can redistribute it and/or modify
11  it under the terms of the GNU Lesser General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  MyGUI is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
22 */
23 #include "MyGUI_Precompiled.h"
24 #include "MyGUI_Guid.h"
25 #if MYGUI_PLATFORM == MYGUI_PLATFORM_LINUX || MYGUI_PLATFORM == MYGUI_PLATFORM_APPLE
26 #include <uuid/uuid.h>
27 #elif MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
28 #include <objbase.h>
29 #endif
30 
31 namespace MyGUI
32 {
33  const char Guid::convert_hex[64] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 64, 64, 64, 64, 64, 64,
34  64, 10, 11, 12, 13, 14, 15, 64, 64, 64, 64, 64, 64, 64, 64, 64,
35  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
36  64, 10, 11, 12, 13, 14, 15, 64, 64, 64, 64, 64, 64, 64, 64, 64
37  };
38 
39  Guid Guid::parse(const std::string& _value)
40  {
41  Guid ret;
42  size_t start=0;
43  // формат со скобками { ... }
44  if (_value.size() == 38)
45  {
46  start ++;
47 #if MYGUI_DEBUG_MODE == 1
48  if ((_value[0] != '{') || (_value[37] != '}'))
49  {
50  return ret;
51  }
52 #endif
53  }
54  // формат без скобок ...
55  else if (_value.size() != 36)
56  {
57  return ret;
58  }
59 
60 #if MYGUI_DEBUG_MODE == 1
61  if ((_value[start + 8] != '-') || (_value[start + 13] != '-') || (_value[start + 18] != '-') || (_value[start + 23] != '-'))
62  {
63  return ret;
64  }
65 #endif
66 
67 #define MYGUI_CONVERT_HEX(value) ((convert_hex[ ((value) - 48) & 0x3F]) & 0x3F)
68 
69 #if MYGUI_DEBUG_MODE == 1
70  #define MYGUI_CHECK_CONVERT_HEX(value) \
71  { \
72  char tmp = ((value) - 48); \
73  if ((tmp > 63) || (tmp < 0)) \
74  { \
75  /*MYGUI_LOG(Error, "error parse guid'" << _value << "'");*/ \
76  return Guid(); \
77  } \
78  tmp = convert_hex[(int)tmp]; \
79  if (tmp > 63) \
80  { \
81  /*MYGUI_LOG(Error, "error parse guid'" << _value << "'");*/ \
82  return Guid(); \
83  } \
84  }
85 #else
86  #define MYGUI_CHECK_CONVERT_HEX(value)
87 #endif
88 
89 
90  size_t count = 8;
91  size_t pos = start;
92  while (count > 0)
93  {
94  MYGUI_CHECK_CONVERT_HEX(_value[pos]);
95  ret.original.data1 <<= 4;
96  ret.original.data1 += MYGUI_CONVERT_HEX(_value[pos]);
97  count --;
98  pos ++;
99  }
100 
101  count = 4;
102  pos ++;
103  while (count > 0)
104  {
105  MYGUI_CHECK_CONVERT_HEX(_value[pos]);
106  ret.original.data2 <<= 4;
107  ret.original.data2 += MYGUI_CONVERT_HEX(_value[pos]);
108  count --;
109  pos ++;
110  }
111 
112  count = 4;
113  pos ++;
114  while (count > 0)
115  {
116  MYGUI_CHECK_CONVERT_HEX(_value[pos]);
117  ret.original.data3 <<= 4;
118  ret.original.data3 += MYGUI_CONVERT_HEX(_value[pos]);
119  count --;
120  pos ++;
121  }
122 
123  count = 2; // здесь по два байта парсится
124  pos ++;
125  size_t num = 0;
126  while (count > 0)
127  {
128  MYGUI_CHECK_CONVERT_HEX(_value[pos]);
129  ret.original.data4[num] = MYGUI_CONVERT_HEX(_value[pos++]) << 4;
130  MYGUI_CHECK_CONVERT_HEX(_value[pos]);
131  ret.original.data4[num++] += MYGUI_CONVERT_HEX(_value[pos++]);
132  count --;
133  }
134 
135  count = 6; // здесь по два байта парсится
136  pos ++;
137  while (count > 0)
138  {
139  MYGUI_CHECK_CONVERT_HEX(_value[pos]);
140  ret.original.data4[num] = MYGUI_CONVERT_HEX(_value[pos++]) << 4;
141  MYGUI_CHECK_CONVERT_HEX(_value[pos]);
142  ret.original.data4[num++] += MYGUI_CONVERT_HEX(_value[pos++]);
143  count --;
144  }
145 
146 #undef MYGUI_CHECK_CONVERT_HEX
147 #undef MYGUI_CONVERT_HEX
148 
149  return ret;
150  }
151 
152  std::string Guid::print() const
153  {
154  const size_t SIZE = 39;
155  char buff[SIZE];
156 
157  sprintf(buff, "{%.8X-%.4X-%.4X-%.2X%.2X-%.2X%.2X%.2X%.2X%.2X%.2X}", (int)(original.data1), (int)(original.data2), (int)(original.data3),
158  (int)(original.data4[0]), (int)(original.data4[1]),
159  (int)(original.data4[2]), (int)(original.data4[3]), (int)(original.data4[4]), (int)(original.data4[5]), (int)(original.data4[6]), (int)(original.data4[7])
160  );
161 
162  return buff;
163  }
164 
166  {
167  Guid ret;
168 #if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
169  HRESULT result = CoCreateGuid((GUID*)&ret.original.data1);
170  MYGUI_ASSERT(S_OK == result, "Error generate GUID");
171 #elif MYGUI_PLATFORM == MYGUI_PLATFORM_LINUX
172  uuid_generate(ret.vec._data1);
173 #else
174  //FIXME
175  uuid_generate(ret.vec._data1);// or what else?
176 #endif
177  return ret;
178  }
179 
180 } // namespace MyGUI