source: trunk/src/ole32/clsid.cpp@ 856

Last change on this file since 856 was 856, checked in by phaller, 26 years ago

Fix: WINE_StringFromCLSID is needed in other modules, too

File size: 6.2 KB
Line 
1/*
2 *
3 * Project Odin Software License can be found in LICENSE.TXT
4 *
5 */
6/*
7 * ClassID Manipulation.
8 *
9 * 1/7/99
10 *
11 * Copyright 1999 David J. Raison
12 *
13 * Some portions from Wine Implementation
14 * Copyright 1995 Martin von Loewis
15 * Copyright 1998 Justin Bradford
16 * Copyright 1999 Francis Beaudet
17 * Copyright 1999 Sylvain St-Germain
18 */
19
20#include "ole32.h"
21
22#include "oString.h"
23
24// ----------------------------------------------------------------------
25// CLSIDFromProgID()
26// ----------------------------------------------------------------------
27HRESULT WIN32API CLSIDFromProgID(
28 LPCOLESTR lpszProgID, // [in] - UNICODE program id as found in registry
29 LPCLSID pclsid) // [out] - CLSID
30{
31 dprintf(("OLE32: CLSIDFromProgID"));
32
33 LONG lDataLen = 80;
34 oStringW szKey(lpszProgID);
35 oStringW szCLSID(lDataLen, 1);
36 HKEY hKey;
37 HRESULT rc;
38
39 // Create the registry lookup string...
40 szKey += L"\\CLSID";
41
42 // Try to open the key in the registry...
43 rc = RegOpenKeyW(HKEY_CLASSES_ROOT, szKey, &hKey);
44 if (rc != 0)
45 return OLE_ERROR_GENERIC;
46
47 // Now get the data from the _default_ entry on this key...
48 rc = RegQueryValueW(hKey, NULL, szCLSID, &lDataLen);
49 RegCloseKey(hKey);
50 if (rc != 0)
51 return OLE_ERROR_GENERIC;
52
53 // Now convert from a string to a UUID
54 return CLSIDFromString(szCLSID, pclsid);
55}
56
57// ----------------------------------------------------------------------
58// IIDFromString
59// ----------------------------------------------------------------------
60HRESULT WIN32API IIDFromString(LPSTR lpsz, LPIID lpiid)
61{
62 dprintf(("OLE32: IIDFromString"));
63 return CLSIDFromString((LPCOLESTR)lpsz, (LPCLSID)lpiid);
64}
65
66// ----------------------------------------------------------------------
67// CLSIDFromString()
68// ----------------------------------------------------------------------
69HRESULT WIN32API CLSIDFromString(
70 LPCOLESTR lpsz, // [in] - Unicode string CLSID
71 LPCLSID pclsid) // [out] - Binary CLSID
72{
73 dprintf(("OLE32: CLSIDFromString"));
74
75 oStringA tClsId(lpsz);
76
77 HRESULT ret = OLE_ERROR_GENERIC;
78
79 // Convert to binary CLSID
80 char *s = (char *) tClsId;
81 char *p;
82 int i;
83 char table[256];
84
85 /* quick lookup table */
86 memset(table, 0, 256);
87
88 for (i = 0; i < 10; i++)
89 {
90 table['0' + i] = i;
91 }
92 for (i = 0; i < 6; i++)
93 {
94 table['A' + i] = i+10;
95 table['a' + i] = i+10;
96 }
97
98 /* in form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */
99
100 if (lstrlenW(lpsz) != 38)
101 return OLE_ERROR_OBJECT;
102
103 p = (char *) pclsid;
104
105 s++; /* skip leading brace */
106 for (i = 0; i < 4; i++)
107 {
108 p[3 - i] = table[*s]<<4 | table[*(s+1)];
109 s += 2;
110 }
111 p += 4;
112 s++; /* skip - */
113
114 for (i = 0; i < 2; i++)
115 {
116 p[1-i] = table[*s]<<4 | table[*(s+1)];
117 s += 2;
118 }
119 p += 2;
120 s++; /* skip - */
121
122 for (i = 0; i < 2; i++)
123 {
124 p[1-i] = table[*s]<<4 | table[*(s+1)];
125 s += 2;
126 }
127 p += 2;
128 s++; /* skip - */
129
130 /* these are just sequential bytes */
131 for (i = 0; i < 2; i++)
132 {
133 *p++ = table[*s]<<4 | table[*(s+1)];
134 s += 2;
135 }
136 s++; /* skip - */
137
138 for (i = 0; i < 6; i++)
139 {
140 *p++ = table[*s]<<4 | table[*(s+1)];
141 s += 2;
142 }
143
144 return S_OK;
145}
146
147// ----------------------------------------------------------------------
148// CoCreateGuid()
149// ----------------------------------------------------------------------
150HRESULT WIN32API CoCreateGuid(GUID *pguid)
151{
152 dprintf(("OLE32: CoCreateGuid"));
153 memset(pguid, 0, sizeof(GUID)); //TODO: should be random GUID
154 return S_OK;
155}
156
157// ----------------------------------------------------------------------
158// WINE_StringFromCLSID
159// ----------------------------------------------------------------------
160HRESULT WIN32API WINE_StringFromCLSID(const CLSID *rclsid, LPSTR idstr)
161{
162 dprintf(("OLE32: WINE_StringFromCLSID"));
163
164 if (rclsid == NULL)
165 {
166 dprintf((" clsid: (NULL)"));
167 *idstr = 0;
168 return E_FAIL;
169 }
170
171 // Setup new string...
172 sprintf(idstr, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
173 rclsid->Data1,
174 rclsid->Data2,
175 rclsid->Data3,
176 rclsid->Data4[0],
177 rclsid->Data4[1],
178 rclsid->Data4[2],
179 rclsid->Data4[3],
180 rclsid->Data4[4],
181 rclsid->Data4[5],
182 rclsid->Data4[6],
183 rclsid->Data4[7]);
184
185 dprintf((" clsid: %s", idstr));
186
187 return OLE_OK;
188}
189
190// ----------------------------------------------------------------------
191// StringFromCLSID
192// Memory allocated here on behalf of application should be freed using CoTaskMemFree()
193// ----------------------------------------------------------------------
194HRESULT WIN32API StringFromCLSID(REFCLSID rclsid, LPOLESTR *ppsz)
195{
196 char tmp[50];
197 LPWSTR szclsid;
198 size_t strLen;
199
200 dprintf(("OLE32: StringFromCLSID"));
201
202 // Setup new string...
203 WINE_StringFromCLSID(rclsid, tmp);
204
205 strLen = strlen(tmp);
206
207 // Grab buffer for string...
208 szclsid = (LPWSTR)CoTaskMemAlloc((strLen + 1) * sizeof(WCHAR));
209
210 AsciiToUnicode(tmp, szclsid);
211
212 *ppsz = (LPOLESTR)szclsid;
213
214 return S_OK;
215}
216
217// ----------------------------------------------------------------------
218// StringFromIID
219// Memory allocated here on behalf of application should be freed using CoTaskMemFree()
220// ----------------------------------------------------------------------
221HRESULT WIN32API StringFromIID(REFIID riid, LPOLESTR *ppsz)
222{
223 char tmp[50];
224 LPWSTR sziid;
225 size_t strLen;
226
227 dprintf(("OLE32: StringFromIID"));
228
229 // Setup new string...
230 WINE_StringFromCLSID(riid, tmp);
231
232 strLen = strlen(tmp);
233
234 // Grab buffer for string...
235 sziid = (LPWSTR)CoTaskMemAlloc((strLen + 1) * sizeof(WCHAR));
236
237 AsciiToUnicode(tmp, sziid);
238
239 *ppsz = (LPOLESTR)sziid;
240
241 return S_OK;
242}
243
244// ----------------------------------------------------------------------
245// StringFromGUID2
246// ----------------------------------------------------------------------
247int WIN32API StringFromGUID2(REFGUID rguid, LPOLESTR lpsz, int cbMax)
248{
249 char tmp[50];
250 size_t strLen;
251
252 dprintf(("OLE32: StringFromGUID2"));
253
254 // Setup new string...
255 WINE_StringFromCLSID(rguid, tmp);
256
257 strLen = strlen(tmp);
258
259 if(cbMax < (strLen * 2 + 1))
260 return 0;
261
262 AsciiToUnicode(tmp, lpsz);
263
264 return(strLen * 2 + 1); // including 0 terminator
265}
266
Note: See TracBrowser for help on using the repository browser.