VirtualBox

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

Last change on this file since 30254 was 29873, checked in by vboxsync, 15 years ago

OVF: fix incorrect disk UUIDs in machine XML on export

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.6 KB
Line 
1/* $Id: Guid.h 29873 2010-05-28 17:14:53Z vboxsync $ */
2
3/** @file
4 * MS COM / XPCOM Abstraction Layer:
5 * Guid class declaration
6 */
7
8/*
9 * Copyright (C) 2006-2007 Oracle Corporation
10 *
11 * This file is part of VirtualBox Open Source Edition (OSE), as
12 * available from http://www.virtualbox.org. This file is free software;
13 * you can redistribute it and/or modify it under the terms of the GNU
14 * General Public License (GPL) as published by the Free Software
15 * Foundation, in version 2 as it comes in the "COPYING" file of the
16 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
17 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
18 *
19 * The contents of this file may alternatively be used under the terms
20 * of the Common Development and Distribution License Version 1.0
21 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
22 * VirtualBox OSE distribution, in which case the provisions of the
23 * CDDL are applicable instead of those of the GPL.
24 *
25 * You may elect to license modified versions of this file under the
26 * terms and conditions of either the GPL or the CDDL or both.
27 */
28
29#ifndef ___VBox_com_Guid_h
30#define ___VBox_com_Guid_h
31
32/* Make sure all the stdint.h macros are included - must come first! */
33#ifndef __STDC_LIMIT_MACROS
34# define __STDC_LIMIT_MACROS
35#endif
36#ifndef __STDC_CONSTANT_MACROS
37# define __STDC_CONSTANT_MACROS
38#endif
39
40#if defined (VBOX_WITH_XPCOM)
41#include <nsMemory.h>
42#endif
43
44#include "VBox/com/string.h"
45
46#include <iprt/cpp/utils.h>
47#include <iprt/uuid.h>
48
49namespace com
50{
51
52/**
53 * Helper class that represents the UUID type and hides platform-specific
54 * implementation details.
55 */
56class Guid
57{
58public:
59
60 Guid()
61 {
62 ::RTUuidClear(&uuid);
63 refresh();
64 }
65
66 Guid(const Guid &that)
67 {
68 uuid = that.uuid;
69 refresh();
70 }
71
72 Guid(const RTUUID &that)
73 {
74 uuid = that;
75 refresh();
76 }
77
78 Guid(const GUID &that)
79 {
80 AssertCompileSize(GUID, sizeof(RTUUID));
81 ::memcpy(&uuid, &that, sizeof(GUID));
82 refresh();
83 }
84
85 Guid(const char *that)
86 {
87 ::RTUuidClear(&uuid);
88 ::RTUuidFromStr(&uuid, that);
89 refresh();
90 }
91
92 Guid(const Bstr &that)
93 {
94 ::RTUuidClear(&uuid);
95 if (!that.isEmpty())
96 ::RTUuidFromUtf16(&uuid, that.raw());
97 refresh();
98 }
99
100 Guid& operator=(const Guid &that)
101 {
102 ::memcpy(&uuid, &that.uuid, sizeof (RTUUID));
103 refresh();
104 return *this;
105 }
106 Guid& operator=(const GUID &guid)
107 {
108 ::memcpy(&uuid, &guid, sizeof (GUID));
109 refresh();
110 return *this;
111 }
112 Guid& operator=(const RTUUID &guid)
113 {
114 ::memcpy(&uuid, &guid, sizeof (RTUUID));
115 refresh();
116 return *this;
117 }
118 Guid& operator=(const char *str)
119 {
120 ::RTUuidFromStr(&uuid, str);
121 refresh();
122 return *this;
123 }
124
125 void create()
126 {
127 ::RTUuidCreate(&uuid);
128 refresh();
129 }
130 void clear()
131 {
132 ::RTUuidClear(&uuid);
133 refresh();
134 }
135
136 Utf8Str toString() const
137 {
138 char buf[RTUUID_STR_LENGTH];
139 ::RTUuidToStr(&uuid, buf, RTUUID_STR_LENGTH);
140 return Utf8Str(buf);
141 }
142
143 /**
144 * Like toString, but encloses the returned string in curly brackets.
145 * @return
146 */
147 Utf8Str toStringCurly() const
148 {
149 char buf[RTUUID_STR_LENGTH + 2] = "{";
150 ::RTUuidToStr(&uuid, buf + 1, RTUUID_STR_LENGTH);
151 buf[sizeof(buf) - 2] = '}';
152 buf[sizeof(buf) - 1] = '\0';
153 return Utf8Str(buf);
154 }
155
156 Bstr toUtf16() const
157 {
158 if (isEmpty())
159 return Bstr();
160
161 RTUTF16 buf[RTUUID_STR_LENGTH];
162 ::RTUuidToUtf16(&uuid, buf, RTUUID_STR_LENGTH);
163 return Bstr(buf);
164 }
165
166 bool isEmpty() const
167 {
168 return ::RTUuidIsNull (&uuid);
169 }
170
171 operator bool() const
172 {
173 return !isEmpty();
174 }
175
176 bool operator==(const Guid &that) const { return ::RTUuidCompare (&uuid, &that.uuid) == 0; }
177 bool operator==(const GUID &guid) const { return ::RTUuidCompare (&uuid, (PRTUUID) &guid) == 0; }
178 bool operator!=(const Guid &that) const { return !operator==(that); }
179 bool operator!=(const GUID &guid) const { return !operator==(guid); }
180 bool operator<(const Guid &that) const { return ::RTUuidCompare (&uuid, &that.uuid) < 0; }
181 bool operator<(const GUID &guid) const { return ::RTUuidCompare (&uuid, (PRTUUID) &guid) < 0; }
182
183 /* to pass instances as IN_GUID parameters to interface methods */
184 operator const GUID&() const
185 {
186 return *(GUID *) &uuid;
187 }
188
189 /* to directly pass instances to RTPrintf("%RTuuid") */
190 PRTUUID ptr()
191 {
192 return &uuid;
193 }
194
195 /* to pass instances to printf-like functions */
196 PCRTUUID raw() const
197 {
198 return &uuid;
199 }
200
201 /* to pass instances to RTUuid*() as a constant argument */
202 operator const RTUUID*() const
203 {
204 return &uuid;
205 }
206
207#if !defined (VBOX_WITH_XPCOM)
208
209 /* to assign instances to OUT_GUID parameters from within the
210 * interface method */
211 const Guid &cloneTo (GUID *pguid) const
212 {
213 if (pguid)
214 ::memcpy(pguid, &uuid, sizeof(GUID));
215 return *this;
216 }
217
218 /* to pass instances as OUT_GUID parameters to interface methods */
219 GUID *asOutParam()
220 {
221 return (GUID*)&uuid;
222 }
223
224#else
225
226 /* to assign instances to OUT_GUID parameters from within the
227 * interface method */
228 const Guid &cloneTo (nsID **ppguid) const
229 {
230 if (ppguid) { *ppguid = (nsID *) nsMemory::Clone (&uuid, sizeof (nsID)); }
231 return *this;
232 }
233
234 // internal helper class for asOutParam(); this takes a GUID refrence
235 // in the constructor and copies the uuid from the method to that instance
236 // in its destructor
237 class GuidOutParam
238 {
239 GuidOutParam(Guid &guid)
240 : ptr(0),
241 outer(guid)
242 {
243 outer.clear();
244 }
245
246 nsID *ptr;
247 Guid &outer;
248 GuidOutParam(const GuidOutParam &that); // disabled
249 GuidOutParam &operator=(const GuidOutParam &that); // disabled
250 public:
251 operator nsID**() { return &ptr; }
252 ~GuidOutParam()
253 {
254 if (ptr && outer.isEmpty())
255 {
256 outer = *ptr;
257 outer.refresh();
258 nsMemory::Free(ptr);
259 }
260 }
261 friend class Guid;
262 };
263
264 /* to pass instances as OUT_GUID parameters to interface methods */
265 GuidOutParam asOutParam() { return GuidOutParam(*this); }
266
267#endif
268
269 /* to directly test IN_GUID interface method's parameters */
270 static bool isEmpty(const GUID &guid)
271 {
272 return ::RTUuidIsNull((PRTUUID)&guid);
273 }
274
275 /**
276 * Static immutable empty object. May be used for comparison purposes.
277 */
278 static const Guid Empty;
279
280private:
281 // in debug code, refresh the UUID string representatino for
282 // debugging; must be called every time the internal uuid
283 // changes; compiles to nothing in release code
284 inline void refresh()
285 {
286#ifdef DEBUG
287 ::RTUuidToStr(&uuid, szUUID, RTUUID_STR_LENGTH);
288 pcszUUID = szUUID;
289#endif
290 }
291
292 RTUUID uuid;
293
294#ifdef DEBUG
295 // in debug builds, have a Utf8Str representation of the UUID so we can look
296 // at it in the debugger more easily
297 char szUUID[RTUUID_STR_LENGTH];
298 const char *pcszUUID;
299#endif
300};
301
302inline Bstr asGuidStr(const Bstr& str)
303{
304 Guid guid(str);
305 return guid.isEmpty() ? Bstr() : guid.toUtf16();
306}
307
308inline bool isValidGuid(const Bstr& str)
309{
310 Guid guid(str);
311 return !guid.isEmpty();
312}
313
314
315/* work around error C2593 of the stupid MSVC 7.x ambiguity resolver */
316WORKAROUND_MSVC7_ERROR_C2593_FOR_BOOL_OP (Guid)
317
318} /* namespace com */
319
320#endif /* ___VBox_com_Guid_h */
321
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