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