add comparison operators for UUID class (#9871)
[wxWidgets.git] / src / msw / ole / uuid.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/msw/ole/uuid.cpp
3 // Purpose: implements Uuid class, see uuid.h for details
4 // Author: Vadim Zeitlin
5 // Modified by:
6 // Created: 12.09.96
7 // RCS-ID: $Id$
8 // Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // Declarations
14 // ============================================================================
15
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
18
19 #if defined(__BORLANDC__)
20 #pragma hdrstop
21 #endif
22
23 #if wxUSE_OLE && ( wxUSE_DRAG_AND_DROP || (defined(__WXDEBUG__) && wxUSE_DATAOBJ) )
24
25 #ifndef WX_PRECOMP
26 #include "wx/msw/wrapwin.h"
27 #endif
28
29 #include <rpc.h> // UUID related functions
30
31 #include "wx/msw/ole/uuid.h"
32
33
34
35 // ============================================================================
36 // Implementation
37 // ============================================================================
38
39 // length of UUID in C format
40 #define UUID_CSTRLEN 100 // real length is 66
41
42 // copy ctor
43 Uuid::Uuid(const Uuid& uuid)
44 {
45 // bitwise copy Ok for UUIDs
46 m_uuid = uuid.m_uuid;
47
48 // force the string to be allocated by RPC
49 // (we free it later with RpcStringFree)
50 #ifdef _UNICODE
51 UuidToString(&m_uuid, (unsigned short **)&m_pszUuid);
52 #else
53 UuidToString(&m_uuid, &m_pszUuid);
54 #endif
55
56 // allocate new buffer
57 m_pszCForm = new wxChar[UUID_CSTRLEN];
58 // and fill it
59 memcpy(m_pszCForm, uuid.m_pszCForm, UUID_CSTRLEN*sizeof(wxChar));
60 }
61
62 // assignment operator
63 Uuid& Uuid::operator=(const Uuid& uuid)
64 {
65 m_uuid = uuid.m_uuid;
66
67 // force the string to be allocated by RPC
68 // (we free it later with RpcStringFree)
69 #ifdef _UNICODE
70 UuidToString(&m_uuid, (unsigned short **)&m_pszUuid);
71 #else
72 UuidToString(&m_uuid, &m_pszUuid);
73 #endif
74
75 // allocate new buffer if not done yet
76 if ( !m_pszCForm )
77 m_pszCForm = new wxChar[UUID_CSTRLEN];
78
79 // and fill it
80 memcpy(m_pszCForm, uuid.m_pszCForm, UUID_CSTRLEN*sizeof(wxChar));
81
82 return *this;
83 }
84
85 bool Uuid::operator==(const Uuid& uuid) const
86 {
87 return m_uuid == uuid.m_uuid;
88 }
89
90 bool Uuid::operator!=(const Uuid& uuid) const
91 {
92 return m_uuid != uuid.m_uuid;
93 }
94
95 // dtor
96 Uuid::~Uuid()
97 {
98 // this string must be allocated by RPC!
99 // (otherwise you get a debug breakpoint deep inside RPC DLL)
100 if ( m_pszUuid )
101 #ifdef _UNICODE
102 RpcStringFree((unsigned short **)&m_pszUuid);
103 #else
104 RpcStringFree(&m_pszUuid);
105 #endif
106
107 // perhaps we should just use a static buffer and not bother
108 // with new and delete?
109 if ( m_pszCForm )
110 delete [] m_pszCForm;
111 }
112
113 // update string representation of new UUID
114 void Uuid::Set(const UUID &uuid)
115 {
116 m_uuid = uuid;
117
118 // get string representation
119 #ifdef _UNICODE
120 UuidToString(&m_uuid, (unsigned short **)&m_pszUuid);
121 #else
122 UuidToString(&m_uuid, &m_pszUuid);
123 #endif
124
125 // cache UUID in C format
126 UuidToCForm();
127 }
128
129 // create a new UUID
130 void Uuid::Create()
131 {
132 UUID uuid;
133
134 // can't fail
135 UuidCreate(&uuid);
136
137 Set(uuid);
138 }
139
140 // set the value
141 bool Uuid::Set(const wxChar *pc)
142 {
143 // get UUID from string
144 #ifdef _UNICODE
145 if ( UuidFromString((unsigned short *)pc, &m_uuid) != RPC_S_OK)
146 #else
147 if ( UuidFromString((wxUChar *)pc, &m_uuid) != RPC_S_OK)
148 #endif
149 // failed: probably invalid string
150 return false;
151
152 // transform it back to string to normalize it
153 #ifdef _UNICODE
154 UuidToString(&m_uuid, (unsigned short **)&m_pszUuid);
155 #else
156 UuidToString(&m_uuid, &m_pszUuid);
157 #endif
158
159 // update m_pszCForm
160 UuidToCForm();
161
162 return true;
163 }
164
165 // stores m_uuid in m_pszCForm in a format required by
166 // DEFINE_GUID macro: i.e. something like
167 // 0x7D8A2281L,0x4C61,0x11D0,0xBA,0xBD,0x00,0x00,0xC0,0x18,0xBA,0x27
168 // m_pszUuid is of the form (no, it's not quite the same UUID :-)
169 // 6aadc650-67b0-11d0-bac8-0000c018ba27
170 void Uuid::UuidToCForm()
171 {
172 if ( m_pszCForm == NULL )
173 m_pszCForm = new wxChar[UUID_CSTRLEN];
174
175 wsprintf(m_pszCForm, wxT("0x%8.8X,0x%4.4X,0x%4.4X,0x%2.2X,0x2.2%X,0x2.2%X,0x2.2%X,0x2.2%X,0x2.2%X,0x2.2%X,0x2.2%X"),
176 m_uuid.Data1, m_uuid.Data2, m_uuid.Data3,
177 m_uuid.Data4[0], m_uuid.Data4[1], m_uuid.Data4[2], m_uuid.Data4[3],
178 m_uuid.Data4[4], m_uuid.Data4[5], m_uuid.Data4[6], m_uuid.Data4[7]);
179 }
180
181 #endif
182 // wxUSE_DRAG_AND_DROP