1 | /**************************************************************************** |
2 | ** |
3 | ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). |
4 | ** Contact: http://www.qt-project.org/legal |
5 | ** |
6 | ** This file is part of the QtCore module of the Qt Toolkit. |
7 | ** |
8 | ** $QT_BEGIN_LICENSE:LGPL$ |
9 | ** Commercial License Usage |
10 | ** Licensees holding valid commercial Qt licenses may use this file in |
11 | ** accordance with the commercial license agreement provided with the |
12 | ** Software or, alternatively, in accordance with the terms contained in |
13 | ** a written agreement between you and Digia. For licensing terms and |
14 | ** conditions see http://qt.digia.com/licensing. For further information |
15 | ** use the contact form at http://qt.digia.com/contact-us. |
16 | ** |
17 | ** GNU Lesser General Public License Usage |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser |
19 | ** General Public License version 2.1 as published by the Free Software |
20 | ** Foundation and appearing in the file LICENSE.LGPL included in the |
21 | ** packaging of this file. Please review the following information to |
22 | ** ensure the GNU Lesser General Public License version 2.1 requirements |
23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
24 | ** |
25 | ** In addition, as a special exception, Digia gives you certain additional |
26 | ** rights. These rights are described in the Digia Qt LGPL Exception |
27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
28 | ** |
29 | ** GNU General Public License Usage |
30 | ** Alternatively, this file may be used under the terms of the GNU |
31 | ** General Public License version 3.0 as published by the Free Software |
32 | ** Foundation and appearing in the file LICENSE.GPL included in the |
33 | ** packaging of this file. Please review the following information to |
34 | ** ensure the GNU General Public License version 3.0 requirements will be |
35 | ** met: http://www.gnu.org/copyleft/gpl.html. |
36 | ** |
37 | ** |
38 | ** $QT_END_LICENSE$ |
39 | ** |
40 | ****************************************************************************/ |
41 | |
42 | #ifndef QUUID_H |
43 | #define QUUID_H |
44 | |
45 | #include <QtCore/qstring.h> |
46 | |
47 | QT_BEGIN_HEADER |
48 | |
49 | #if defined(Q_OS_WIN) |
50 | #ifndef GUID_DEFINED |
51 | #define GUID_DEFINED |
52 | typedef struct _GUID |
53 | { |
54 | ulong Data1; |
55 | ushort Data2; |
56 | ushort Data3; |
57 | uchar Data4[8]; |
58 | } GUID, *REFGUID, *LPGUID; |
59 | #endif |
60 | #endif |
61 | |
62 | |
63 | QT_BEGIN_NAMESPACE |
64 | |
65 | QT_MODULE(Core) |
66 | |
67 | struct Q_CORE_EXPORT QUuid |
68 | { |
69 | enum Variant { |
70 | VarUnknown =-1, |
71 | NCS = 0, // 0 - - |
72 | DCE = 2, // 1 0 - |
73 | Microsoft = 6, // 1 1 0 |
74 | Reserved = 7 // 1 1 1 |
75 | }; |
76 | |
77 | enum Version { |
78 | VerUnknown =-1, |
79 | Time = 1, // 0 0 0 1 |
80 | EmbeddedPOSIX = 2, // 0 0 1 0 |
81 | Name = 3, // 0 0 1 1 |
82 | Random = 4 // 0 1 0 0 |
83 | }; |
84 | |
85 | QUuid() |
86 | { |
87 | data1 = 0; |
88 | data2 = 0; |
89 | data3 = 0; |
90 | for(int i = 0; i < 8; i++) |
91 | data4[i] = 0; |
92 | } |
93 | QUuid(uint l, ushort w1, ushort w2, uchar b1, uchar b2, uchar b3, uchar b4, uchar b5, uchar b6, uchar b7, uchar b8) |
94 | { |
95 | data1 = l; |
96 | data2 = w1; |
97 | data3 = w2; |
98 | data4[0] = b1; |
99 | data4[1] = b2; |
100 | data4[2] = b3; |
101 | data4[3] = b4; |
102 | data4[4] = b5; |
103 | data4[5] = b6; |
104 | data4[6] = b7; |
105 | data4[7] = b8; |
106 | } |
107 | #ifndef QT_NO_QUUID_STRING |
108 | QUuid(const QString &); |
109 | QUuid(const char *); |
110 | QString toString() const; |
111 | operator QString() const { return toString(); } // ### Qt5 remove |
112 | QUuid(const QByteArray &); |
113 | QByteArray toByteArray() const; |
114 | #endif |
115 | QByteArray toRfc4122() const; |
116 | static QUuid fromRfc4122(const QByteArray &); |
117 | bool isNull() const; |
118 | |
119 | bool operator==(const QUuid &orig) const |
120 | { |
121 | uint i; |
122 | if (data1 != orig.data1 || data2 != orig.data2 || |
123 | data3 != orig.data3) |
124 | return false; |
125 | |
126 | for(i = 0; i < 8; i++) |
127 | if (data4[i] != orig.data4[i]) |
128 | return false; |
129 | |
130 | return true; |
131 | } |
132 | |
133 | bool operator!=(const QUuid &orig) const |
134 | { |
135 | return !(*this == orig); |
136 | } |
137 | |
138 | bool operator<(const QUuid &other) const; |
139 | bool operator>(const QUuid &other) const; |
140 | |
141 | #if defined(Q_OS_WIN) |
142 | // On Windows we have a type GUID that is used by the platform API, so we |
143 | // provide convenience operators to cast from and to this type. |
144 | QUuid(const GUID &guid) |
145 | { |
146 | data1 = guid.Data1; |
147 | data2 = guid.Data2; |
148 | data3 = guid.Data3; |
149 | for(int i = 0; i < 8; i++) |
150 | data4[i] = guid.Data4[i]; |
151 | } |
152 | |
153 | QUuid &operator=(const GUID &guid) |
154 | { |
155 | *this = QUuid(guid); |
156 | return *this; |
157 | } |
158 | |
159 | operator GUID() const |
160 | { |
161 | GUID guid = { data1, data2, data3, { data4[0], data4[1], data4[2], data4[3], data4[4], data4[5], data4[6], data4[7] } }; |
162 | return guid; |
163 | } |
164 | |
165 | bool operator==(const GUID &guid) const |
166 | { |
167 | return *this == QUuid(guid); |
168 | } |
169 | |
170 | bool operator!=(const GUID &guid) const |
171 | { |
172 | return !(*this == guid); |
173 | } |
174 | #endif |
175 | static QUuid createUuid(); |
176 | QUuid::Variant variant() const; |
177 | QUuid::Version version() const; |
178 | |
179 | uint data1; |
180 | ushort data2; |
181 | ushort data3; |
182 | uchar data4[8]; |
183 | }; |
184 | |
185 | #ifndef QT_NO_DATASTREAM |
186 | Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QUuid &); |
187 | Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QUuid &); |
188 | #endif |
189 | |
190 | QT_END_NAMESPACE |
191 | |
192 | QT_END_HEADER |
193 | |
194 | #endif // QUUID_H |
195 | |