VirtualBox

source: vbox/trunk/include/VBox/com/Guid.h@ 44091

Last change on this file since 44091 was 44091, checked in by vboxsync, 12 years ago

Main: make the code more readable. Places where the comparisons were of the form 'isValid() == true\false' or 'isZero() == true\false' were carved \ simplified.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.9 KB
Line 
1/* $Id: Guid.h 44091 2012-12-11 13:34:23Z vboxsync $ */
2/** @file
3 * MS COM / XPCOM Abstraction Layer - Guid class declaration.
4 */
5
6/*
7 * Copyright (C) 2006-2010 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27#ifndef ___VBox_com_Guid_h
28#define ___VBox_com_Guid_h
29
30/* Make sure all the stdint.h macros are included - must come first! */
31#ifndef __STDC_LIMIT_MACROS
32# define __STDC_LIMIT_MACROS
33#endif
34#ifndef __STDC_CONSTANT_MACROS
35# define __STDC_CONSTANT_MACROS
36#endif
37
38#if defined(VBOX_WITH_XPCOM)
39# include <nsMemory.h>
40#endif
41
42#include "VBox/com/string.h"
43
44#include <iprt/uuid.h>
45#include <iprt/err.h>
46
47namespace com
48{
49
50typedef enum
51 {
52 ZERO_GUID,
53 NORMAL_GUID,
54 INVALID_GUID
55 }GuidState_t;
56
57/**
58 * Helper class that represents the UUID type and hides platform-specific
59 * implementation details.
60 */
61class Guid
62{
63public:
64
65 Guid()
66 {
67 ::RTUuidClear(&mUuid);
68 refresh();
69 mGuidState = ZERO_GUID;
70 }
71
72 Guid(const Guid &that)
73 {
74 mUuid = that.mUuid;
75 refresh();
76 if (isEmpty())
77 mGuidState = ZERO_GUID;
78 else
79 mGuidState = NORMAL_GUID;
80 }
81
82 Guid(const RTUUID &that)
83 {
84 mUuid = that;
85 refresh();
86 if (isEmpty())
87 mGuidState = ZERO_GUID;
88 else
89 mGuidState = NORMAL_GUID;
90 }
91
92 Guid(const GUID &that)
93 {
94 AssertCompileSize(GUID, sizeof(RTUUID));
95 ::memcpy(&mUuid, &that, sizeof(GUID));
96 refresh();
97 if (isEmpty())
98 mGuidState = ZERO_GUID;
99 else
100 mGuidState = NORMAL_GUID;
101 }
102
103 /**
104 * Construct a GUID from a string.
105 *
106 * Should the string be invalid, the object will be set to the null GUID
107 * (isEmpty() == true).
108 *
109 * @param that The UUID string. We feed this to RTUuidFromStr(),
110 * so check it out for the exact format.
111 */
112 Guid(const char *that)
113 {
114 mGuidState = NORMAL_GUID;
115
116 int rc = ::RTUuidFromStr(&mUuid, that);
117
118 if (RT_FAILURE(rc))
119 {
120 ::RTUuidClear(&mUuid);
121 mGuidState = INVALID_GUID;
122 }
123 else if(isEmpty())
124 mGuidState = ZERO_GUID;
125 refresh();
126 }
127
128 /**
129 * Construct a GUID from a BSTR.
130 *
131 * Should the string be empty or invalid, the object will be set to the
132 * null GUID (isEmpty() == true).
133 *
134 * @param that The UUID BSTR. We feed this to RTUuidFromUtf16(),
135 * so check it out for the exact format.
136 */
137 Guid(const Bstr &that)
138 {
139 mGuidState = NORMAL_GUID;
140
141 if (that.isEmpty())
142 {
143 ::RTUuidClear(&mUuid);
144 mGuidState = ZERO_GUID;
145 }
146 else
147 {
148 int rc = ::RTUuidFromUtf16(&mUuid, that.raw());
149 if (RT_FAILURE(rc))
150 {
151 ::RTUuidClear(&mUuid);
152 mGuidState = INVALID_GUID;
153 }
154 }
155
156 refresh();
157 }
158
159 Guid& operator=(const Guid &that)
160 {
161 mGuidState = NORMAL_GUID;
162 ::memcpy(&mUuid, &that.mUuid, sizeof (RTUUID));
163 if (isEmpty())
164 mGuidState = ZERO_GUID;
165 refresh();
166 return *this;
167 }
168 Guid& operator=(const GUID &guid)
169 {
170 mGuidState = NORMAL_GUID;
171 ::memcpy(&mUuid, &guid, sizeof (GUID));
172 if (isEmpty())
173 mGuidState = ZERO_GUID;
174 refresh();
175 return *this;
176 }
177 Guid& operator=(const RTUUID &guid)
178 {
179 mGuidState = NORMAL_GUID;
180 ::memcpy(&mUuid, &guid, sizeof (RTUUID));
181 if (isEmpty())
182 mGuidState = ZERO_GUID;
183 refresh();
184 return *this;
185 }
186 Guid& operator=(const char *str)
187 {
188 mGuidState = NORMAL_GUID;
189 int rc = ::RTUuidFromStr(&mUuid, str);
190
191 if (RT_FAILURE(rc))
192 {
193 ::RTUuidClear(&mUuid);
194 mGuidState = INVALID_GUID;
195 }
196 else
197 {
198 if (isEmpty())
199 mGuidState = ZERO_GUID;
200 }
201
202 refresh();
203
204 return *this;
205 }
206
207 void create()
208 {
209 ::RTUuidCreate(&mUuid);
210 mGuidState = NORMAL_GUID;
211 refresh();
212 }
213 void clear()
214 {
215 ::RTUuidClear(&mUuid);
216 mGuidState = ZERO_GUID;
217 refresh();
218 }
219
220 /**
221 * Convert the GUID to a string.
222 *
223 * @returns String object containing the formatted GUID.
224 * @throws std::bad_alloc
225 */
226 Utf8Str toString() const
227 {
228 char buf[RTUUID_STR_LENGTH];
229
230 ::memset(buf,0,RTUUID_STR_LENGTH);
231
232 if (mGuidState == INVALID_GUID)
233 {
234 /* What to return in case of wrong Guid */
235 return Utf8Str("00000000-0000-0000-0000-00000000000");
236 }
237
238 ::RTUuidToStr(&mUuid, buf, RTUUID_STR_LENGTH);
239
240
241 return Utf8Str(buf);
242 }
243
244 /**
245 * Like toString, but encloses the returned string in curly brackets.
246 *
247 * @returns String object containing the formatted GUID in curly brackets.
248 * @throws std::bad_alloc
249 */
250 Utf8Str toStringCurly() const
251 {
252
253 if (mGuidState == INVALID_GUID)
254 {
255 /* What to return in case of wrong Guid */
256 return Utf8Str("{00000000-0000-0000-0000-00000000000}");
257 }
258
259 char buf[RTUUID_STR_LENGTH + 2] = "{";
260
261 ::RTUuidToStr(&mUuid, buf + 1, RTUUID_STR_LENGTH);
262 buf[sizeof(buf) - 2] = '}';
263 buf[sizeof(buf) - 1] = '\0';
264
265 return Utf8Str(buf);
266 }
267
268 /**
269 * Convert the GUID to a string.
270 *
271 * @returns Bstr object containing the formatted GUID.
272 * @throws std::bad_alloc
273 */
274 Bstr toUtf16() const
275 {
276 if (mGuidState == INVALID_GUID)
277 return Bstr("00000000-0000-0000-0000-00000000000");
278
279 RTUTF16 buf[RTUUID_STR_LENGTH];
280 ::RTUuidToUtf16(&mUuid, buf, RTUUID_STR_LENGTH);
281 return Bstr(buf);
282 }
283
284 bool isValid() const
285 {
286 bool res = true;
287 if (mGuidState == INVALID_GUID)
288 res = false;
289
290 return res;
291 }
292
293 bool isZero() const
294 {
295 return (::RTUuidIsNull(&mUuid) && mGuidState == ZERO_GUID);
296 }
297
298 bool operator==(const Guid &that) const { return ::RTUuidCompare(&mUuid, &that.mUuid) == 0; }
299 bool operator==(const GUID &guid) const { return ::RTUuidCompare(&mUuid, (PRTUUID)&guid) == 0; }
300 bool operator!=(const Guid &that) const { return !operator==(that); }
301 bool operator!=(const GUID &guid) const { return !operator==(guid); }
302 bool operator<( const Guid &that) const { return ::RTUuidCompare(&mUuid, &that.mUuid) < 0; }
303 bool operator<( const GUID &guid) const { return ::RTUuidCompare(&mUuid, (PRTUUID)&guid) < 0; }
304
305 /**
306 * To directly copy the contents to a GUID, or for passing it as an input
307 * parameter of type (const GUID *), the compiler converts. */
308 const GUID &ref() const
309 {
310 return *(const GUID *)&mUuid;
311 }
312
313 /**
314 * To pass instances to printf-like functions.
315 */
316 PCRTUUID raw() const
317 {
318 return (PCRTUUID)&mUuid;
319 }
320
321#if !defined(VBOX_WITH_XPCOM)
322
323 /** To assign instances to OUT_GUID parameters from within the interface
324 * method. */
325 const Guid &cloneTo(GUID *pguid) const
326 {
327 if (pguid)
328 ::memcpy(pguid, &mUuid, sizeof(GUID));
329 return *this;
330 }
331
332 /** To pass instances as OUT_GUID parameters to interface methods. */
333 GUID *asOutParam()
334 {
335 return (GUID *)&mUuid;
336 }
337
338#else
339
340 /** To assign instances to OUT_GUID parameters from within the
341 * interface method */
342 const Guid &cloneTo(nsID **ppGuid) const
343 {
344 if (ppGuid)
345 *ppGuid = (nsID *)nsMemory::Clone(&mUuid, sizeof(nsID));
346
347 return *this;
348 }
349
350 /**
351 * Internal helper class for asOutParam().
352 *
353 * This takes a GUID refrence in the constructor and copies the mUuid from
354 * the method to that instance in its destructor.
355 */
356 class GuidOutParam
357 {
358 GuidOutParam(Guid &guid)
359 : ptr(0),
360 outer(guid)
361 {
362 outer.clear();
363 }
364
365 nsID *ptr;
366 Guid &outer;
367 GuidOutParam(const GuidOutParam &that); // disabled
368 GuidOutParam &operator=(const GuidOutParam &that); // disabled
369 public:
370 operator nsID**() { return &ptr; }
371 ~GuidOutParam()
372 {
373 if (ptr && outer.isEmpty())
374 {
375 outer = *ptr;
376 outer.refresh();
377 nsMemory::Free(ptr);
378 }
379 }
380 friend class Guid;
381 };
382
383 /** to pass instances as OUT_GUID parameters to interface methods */
384 GuidOutParam asOutParam() { return GuidOutParam(*this); }
385
386#endif
387
388 /* to directly test IN_GUID interface method's parameters */
389 static bool isEmpty(const GUID &guid)
390 {
391 return ::RTUuidIsNull((PRTUUID)&guid);
392 }
393
394 /**
395 * Static immutable empty object. May be used for comparison purposes.
396 */
397 static const Guid Empty;
398
399protected:
400
401 bool isEmpty() const
402 {
403 return ::RTUuidIsNull(&mUuid);
404 }
405
406 bool isNotEmpty() const
407 {
408 return !::RTUuidIsNull(&mUuid);
409 }
410
411private:
412 /**
413 * Refresh the debug-only UUID string.
414 *
415 * In debug code, refresh the UUID string representatino for debugging;
416 * must be called every time the internal uuid changes; compiles to nothing
417 * in release code.
418 */
419 inline void refresh()
420 {
421#ifdef DEBUG
422// ::RTUuidToStr(&mUuid, mszUuid, RTUUID_STR_LENGTH);
423// m_pcszUUID = mszUuid;
424#endif
425 }
426
427 /** The UUID. */
428 RTUUID mUuid;
429
430 GuidState_t mGuidState;
431
432#ifdef DEBUG
433 /** String representation of mUuid for printing in the debugger. */
434 char mszUuid[RTUUID_STR_LENGTH];
435 /** Another string variant for the debugger, points to szUUID. */
436 const char *m_pcszUUID;
437#endif
438};
439/*
440inline Bstr asGuidStr(const Bstr& str)
441{
442 Guid guid(str);
443 return guid.isEmpty() ? Bstr() : guid.toUtf16();
444}
445*/
446//inline bool isValidGuid(const Bstr& str)
447//{
448// Guid guid(str);
449// return guid.isValid();
450//// return !guid.isEmpty();
451//}
452
453} /* namespace com */
454
455#endif /* !___VBox_com_Guid_h */
456
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette