]> git.saurik.com Git - wxWidgets.git/blame - src/msw/ole/uuid.cpp
Applied patch [ 600051 ] DDE and TCP improvements and fixes
[wxWidgets.git] / src / msw / ole / uuid.cpp
CommitLineData
bbf1f0e5
KB
1///////////////////////////////////////////////////////////////////////////////
2// Name: 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 license
10///////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// Declarations
14// ============================================================================
15
16#ifdef __GNUG__
17#pragma implementation "uuid.h"
18#endif
19
20// For compilers that support precompilation, includes "wx.h".
bbf1f0e5
KB
21#include "wx/wxprec.h"
22
23#if defined(__BORLANDC__)
24#pragma hdrstop
25#endif
26
3096bd2f 27#include "wx/setup.h"
bbf1f0e5 28
21709999 29#if wxUSE_OLE && wxUSE_DRAG_AND_DROP
bbf1f0e5
KB
30
31// standard headers
7f017c64
VZ
32#if wxCHECK_W32API_VERSION( 1, 0 )
33 #include <windows.h>
34#endif
bbf1f0e5
KB
35#include <rpc.h> // UUID related functions
36
3096bd2f 37#include "wx/msw/ole/uuid.h"
bbf1f0e5
KB
38
39
40
41// ============================================================================
42// Implementation
43// ============================================================================
44
45// length of UUID in C format
46#define UUID_CSTRLEN 100 // real length is 66
47
48// copy ctor
49Uuid::Uuid(const Uuid& uuid)
50{
51 // bitwise copy Ok for UUIDs
52 m_uuid = uuid.m_uuid;
53
54 // force the string to be allocated by RPC
55 // (we free it later with RpcStringFree)
5f8e1c16
OK
56#ifdef _UNICODE
57 UuidToString(&m_uuid, (unsigned short **)&m_pszUuid);
58#else
bbf1f0e5 59 UuidToString(&m_uuid, &m_pszUuid);
5f8e1c16 60#endif
bbf1f0e5
KB
61
62 // allocate new buffer
5f8e1c16 63 m_pszCForm = new wxChar[UUID_CSTRLEN];
bbf1f0e5 64 // and fill it
5f8e1c16 65 memcpy(m_pszCForm, uuid.m_pszCForm, UUID_CSTRLEN*sizeof(wxChar));
bbf1f0e5
KB
66}
67
68// assignment operator
69Uuid& Uuid::operator=(const Uuid& uuid)
70{
71 m_uuid = uuid.m_uuid;
72
73 // force the string to be allocated by RPC
74 // (we free it later with RpcStringFree)
5f8e1c16
OK
75#ifdef _UNICODE
76 UuidToString(&m_uuid, (unsigned short **)&m_pszUuid);
77#else
bbf1f0e5 78 UuidToString(&m_uuid, &m_pszUuid);
5f8e1c16 79#endif
bbf1f0e5
KB
80
81 // allocate new buffer if not done yet
82 if ( !m_pszCForm )
5f8e1c16 83 m_pszCForm = new wxChar[UUID_CSTRLEN];
bbf1f0e5
KB
84
85 // and fill it
5f8e1c16 86 memcpy(m_pszCForm, uuid.m_pszCForm, UUID_CSTRLEN*sizeof(wxChar));
bbf1f0e5
KB
87
88 return *this;
89}
90
91// dtor
92Uuid::~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 )
5f8e1c16
OK
97#ifdef _UNICODE
98 RpcStringFree((unsigned short **)&m_pszUuid);
99#else
bbf1f0e5 100 RpcStringFree(&m_pszUuid);
5f8e1c16 101#endif
bbf1f0e5
KB
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
110void Uuid::Set(const UUID &uuid)
111{
112 m_uuid = uuid;
113
114 // get string representation
5f8e1c16
OK
115#ifdef _UNICODE
116 UuidToString(&m_uuid, (unsigned short **)&m_pszUuid);
117#else
bbf1f0e5 118 UuidToString(&m_uuid, &m_pszUuid);
5f8e1c16 119#endif
bbf1f0e5
KB
120
121 // cache UUID in C format
122 UuidToCForm();
123}
124
125// create a new UUID
126void Uuid::Create()
127{
128 UUID uuid;
129
130 // can't fail
131 UuidCreate(&uuid);
132
133 Set(uuid);
134}
135
136// set the value
5f8e1c16 137bool Uuid::Set(const wxChar *pc)
bbf1f0e5 138{
3bce6687
JS
139#ifdef __WXWINE__
140 wxFAIL_MSG(_T("UUid::Set not implemented"));
141 return FALSE;
142#else
bbf1f0e5 143 // get UUID from string
5f8e1c16
OK
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
bbf1f0e5
KB
149 // failed: probably invalid string
150 return FALSE;
151
152 // transform it back to string to normalize it
5f8e1c16
OK
153#ifdef _UNICODE
154 UuidToString(&m_uuid, (unsigned short **)&m_pszUuid);
155#else
bbf1f0e5 156 UuidToString(&m_uuid, &m_pszUuid);
5f8e1c16 157#endif
bbf1f0e5
KB
158
159 // update m_pszCForm
160 UuidToCForm();
161
162 return TRUE;
3bce6687 163#endif
bbf1f0e5
KB
164}
165
166// stores m_uuid in m_pszCForm in a format required by
167// DEFINE_GUID macro: i.e. something like
168// 0x7D8A2281L,0x4C61,0x11D0,0xBA,0xBD,0x00,0x00,0xC0,0x18,0xBA,0x27
169// m_pszUuid is of the form (no, it's not quite the same UUID :-)
170// 6aadc650-67b0-11d0-bac8-0000c018ba27
171void Uuid::UuidToCForm()
172{
173 if ( m_pszCForm == NULL )
5f8e1c16 174 m_pszCForm = new wxChar[UUID_CSTRLEN];
bbf1f0e5 175
f6bcfd97 176 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"),
bbf1f0e5 177 m_uuid.Data1, m_uuid.Data2, m_uuid.Data3,
aacc44c6
VZ
178 m_uuid.Data4[0], m_uuid.Data4[1], m_uuid.Data4[2], m_uuid.Data4[3],
179 m_uuid.Data4[4], m_uuid.Data4[5], m_uuid.Data4[6], m_uuid.Data4[7]);
bbf1f0e5
KB
180}
181
182#endif
47d67540 183 // wxUSE_DRAG_AND_DROP