2 * ComCatMgr ICatRegister implementation for comcat.dll
4 * Copyright (C) 2002 John K. Hohm
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "comcat_private.h"
23 #include "wine/debug.h"
25 WINE_DEFAULT_DEBUG_CHANNEL(ole
);
27 /**********************************************************************
28 * File-scope string constants
30 static const WCHAR comcat_keyname
[21] = {
31 'C', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', ' ', 'C', 'a',
32 't', 'e', 'g', 'o', 'r', 'i', 'e', 's', 0 };
33 static const WCHAR impl_keyname
[23] = {
34 'I', 'm', 'p', 'l', 'e', 'm', 'e', 'n',
35 't', 'e', 'd', ' ', 'C', 'a', 't', 'e',
36 'g', 'o', 'r', 'i', 'e', 's', 0 };
37 static const WCHAR req_keyname
[20] = {
38 'R', 'e', 'q', 'u', 'i', 'r', 'e', 'd',
39 ' ', 'C', 'a', 't', 'e', 'g', 'o', 'r',
42 static HRESULT
COMCAT_RegisterClassCategories(
43 REFCLSID rclsid
, LPCWSTR type
,
44 ULONG cCategories
, const CATID
*rgcatid
);
45 static HRESULT
COMCAT_UnRegisterClassCategories(
46 REFCLSID rclsid
, LPCWSTR type
,
47 ULONG cCategories
, const CATID
*rgcatid
);
49 /**********************************************************************
50 * COMCAT_ICatRegister_QueryInterface
52 static HRESULT WINAPI
COMCAT_ICatRegister_QueryInterface(
57 ICOM_THIS_MULTI(ComCatMgrImpl
, regVtbl
, iface
);
58 TRACE("\n\tIID:\t%s\n",debugstr_guid(riid
));
60 if (This
== NULL
|| ppvObj
== NULL
) return E_POINTER
;
62 return IUnknown_QueryInterface((LPUNKNOWN
)&This
->unkVtbl
, riid
, ppvObj
);
65 /**********************************************************************
66 * COMCAT_ICatRegister_AddRef
68 static ULONG WINAPI
COMCAT_ICatRegister_AddRef(LPCATREGISTER iface
)
70 ICOM_THIS_MULTI(ComCatMgrImpl
, regVtbl
, iface
);
73 if (This
== NULL
) return E_POINTER
;
75 return IUnknown_AddRef((LPUNKNOWN
)&This
->unkVtbl
);
78 /**********************************************************************
79 * COMCAT_ICatRegister_Release
81 static ULONG WINAPI
COMCAT_ICatRegister_Release(LPCATREGISTER iface
)
83 ICOM_THIS_MULTI(ComCatMgrImpl
, regVtbl
, iface
);
86 if (This
== NULL
) return E_POINTER
;
88 return IUnknown_Release((LPUNKNOWN
)&This
->unkVtbl
);
91 /**********************************************************************
92 * COMCAT_ICatRegister_RegisterCategories
94 static HRESULT WINAPI
COMCAT_ICatRegister_RegisterCategories(
99 /* ICOM_THIS_MULTI(ComCatMgrImpl, regVtbl, iface); */
105 if (iface
== NULL
|| (cCategories
&& rgci
== NULL
))
108 /* Create (or open) the component categories key. */
109 res
= RegCreateKeyExW(HKEY_CLASSES_ROOT
, comcat_keyname
, 0, NULL
, 0,
110 KEY_READ
| KEY_WRITE
, NULL
, &comcat_key
, NULL
);
111 if (res
!= ERROR_SUCCESS
) return E_FAIL
;
113 for (; cCategories
; --cCategories
, ++rgci
) {
114 static const WCHAR fmt
[] = { '%', 'l', 'X', 0 };
119 /* Create (or open) the key for this category. */
120 if (!StringFromGUID2(&rgci
->catid
, keyname
, 39)) continue;
121 res
= RegCreateKeyExW(comcat_key
, keyname
, 0, NULL
, 0,
122 KEY_READ
| KEY_WRITE
, NULL
, &cat_key
, NULL
);
123 if (res
!= ERROR_SUCCESS
) continue;
125 /* Set the value for this locale's description. */
126 wsprintfW(valname
, fmt
, rgci
->lcid
);
127 RegSetValueExW(cat_key
, valname
, 0, REG_SZ
,
128 (CONST BYTE
*)(rgci
->szDescription
),
129 (lstrlenW(rgci
->szDescription
) + 1) * sizeof(WCHAR
));
131 RegCloseKey(cat_key
);
134 RegCloseKey(comcat_key
);
138 /**********************************************************************
139 * COMCAT_ICatRegister_UnRegisterCategories
141 static HRESULT WINAPI
COMCAT_ICatRegister_UnRegisterCategories(
146 /* ICOM_THIS_MULTI(ComCatMgrImpl, regVtbl, iface); */
152 if (iface
== NULL
|| (cCategories
&& rgcatid
== NULL
))
155 /* Open the component categories key. */
156 res
= RegOpenKeyExW(HKEY_CLASSES_ROOT
, comcat_keyname
, 0,
157 KEY_READ
| KEY_WRITE
, &comcat_key
);
158 if (res
!= ERROR_SUCCESS
) return E_FAIL
;
160 for (; cCategories
; --cCategories
, ++rgcatid
) {
163 /* Delete the key for this category. */
164 if (!StringFromGUID2(rgcatid
, keyname
, 39)) continue;
165 RegDeleteKeyW(comcat_key
, keyname
);
168 RegCloseKey(comcat_key
);
172 /**********************************************************************
173 * COMCAT_ICatRegister_RegisterClassImplCategories
175 static HRESULT WINAPI
COMCAT_ICatRegister_RegisterClassImplCategories(
181 /* ICOM_THIS_MULTI(ComCatMgrImpl, regVtbl, iface); */
184 return COMCAT_RegisterClassCategories(
185 rclsid
, impl_keyname
, cCategories
, rgcatid
);
188 /**********************************************************************
189 * COMCAT_ICatRegister_UnRegisterClassImplCategories
191 static HRESULT WINAPI
COMCAT_ICatRegister_UnRegisterClassImplCategories(
197 /* ICOM_THIS_MULTI(ComCatMgrImpl, regVtbl, iface); */
200 return COMCAT_UnRegisterClassCategories(
201 rclsid
, impl_keyname
, cCategories
, rgcatid
);
204 /**********************************************************************
205 * COMCAT_ICatRegister_RegisterClassReqCategories
207 static HRESULT WINAPI
COMCAT_ICatRegister_RegisterClassReqCategories(
213 /* ICOM_THIS_MULTI(ComCatMgrImpl, regVtbl, iface); */
216 return COMCAT_RegisterClassCategories(
217 rclsid
, req_keyname
, cCategories
, rgcatid
);
220 /**********************************************************************
221 * COMCAT_ICatRegister_UnRegisterClassReqCategories
223 static HRESULT WINAPI
COMCAT_ICatRegister_UnRegisterClassReqCategories(
229 /* ICOM_THIS_MULTI(ComCatMgrImpl, regVtbl, iface); */
232 return COMCAT_UnRegisterClassCategories(
233 rclsid
, req_keyname
, cCategories
, rgcatid
);
236 /**********************************************************************
237 * COMCAT_ICatRegister_Vtbl
239 const ICatRegisterVtbl COMCAT_ICatRegister_Vtbl
=
241 COMCAT_ICatRegister_QueryInterface
,
242 COMCAT_ICatRegister_AddRef
,
243 COMCAT_ICatRegister_Release
,
244 COMCAT_ICatRegister_RegisterCategories
,
245 COMCAT_ICatRegister_UnRegisterCategories
,
246 COMCAT_ICatRegister_RegisterClassImplCategories
,
247 COMCAT_ICatRegister_UnRegisterClassImplCategories
,
248 COMCAT_ICatRegister_RegisterClassReqCategories
,
249 COMCAT_ICatRegister_UnRegisterClassReqCategories
252 /**********************************************************************
253 * COMCAT_RegisterClassCategories
255 static HRESULT
COMCAT_RegisterClassCategories(
259 const CATID
*rgcatid
)
263 HKEY clsid_key
, class_key
, type_key
;
265 if (cCategories
&& rgcatid
== NULL
) return E_POINTER
;
267 /* Format the class key name. */
268 res
= StringFromGUID2(rclsid
, keyname
, 39);
269 if (FAILED(res
)) return res
;
271 /* Create (or open) the CLSID key. */
272 res
= RegCreateKeyExW(HKEY_CLASSES_ROOT
, clsid_keyname
, 0, NULL
, 0,
273 KEY_READ
| KEY_WRITE
, NULL
, &clsid_key
, NULL
);
274 if (res
!= ERROR_SUCCESS
) return E_FAIL
;
276 /* Create (or open) the class key. */
277 res
= RegCreateKeyExW(clsid_key
, keyname
, 0, NULL
, 0,
278 KEY_READ
| KEY_WRITE
, NULL
, &class_key
, NULL
);
279 if (res
== ERROR_SUCCESS
) {
280 /* Create (or open) the category type key. */
281 res
= RegCreateKeyExW(class_key
, type
, 0, NULL
, 0,
282 KEY_READ
| KEY_WRITE
, NULL
, &type_key
, NULL
);
283 if (res
== ERROR_SUCCESS
) {
284 for (; cCategories
; --cCategories
, ++rgcatid
) {
287 /* Format the category key name. */
288 res
= StringFromGUID2(rgcatid
, keyname
, 39);
289 if (FAILED(res
)) continue;
291 /* Do the register. */
292 res
= RegCreateKeyExW(type_key
, keyname
, 0, NULL
, 0,
293 KEY_READ
| KEY_WRITE
, NULL
, &key
, NULL
);
294 if (res
== ERROR_SUCCESS
) RegCloseKey(key
);
298 RegCloseKey(class_key
);
300 RegCloseKey(clsid_key
);
305 /**********************************************************************
306 * COMCAT_UnRegisterClassCategories
308 static HRESULT
COMCAT_UnRegisterClassCategories(
312 const CATID
*rgcatid
)
314 WCHAR keyname
[68] = { 'C', 'L', 'S', 'I', 'D', '\\' };
318 if (cCategories
&& rgcatid
== NULL
) return E_POINTER
;
320 /* Format the class category type key name. */
321 res
= StringFromGUID2(rclsid
, keyname
+ 6, 39);
322 if (FAILED(res
)) return res
;
324 lstrcpyW(keyname
+ 45, type
);
326 /* Open the class category type key. */
327 res
= RegOpenKeyExW(HKEY_CLASSES_ROOT
, keyname
, 0,
328 KEY_READ
| KEY_WRITE
, &type_key
);
329 if (res
!= ERROR_SUCCESS
) return E_FAIL
;
331 for (; cCategories
; --cCategories
, ++rgcatid
) {
332 /* Format the category key name. */
333 res
= StringFromGUID2(rgcatid
, keyname
, 39);
334 if (FAILED(res
)) continue;
336 /* Do the unregister. */
337 RegDeleteKeyW(type_key
, keyname
);
339 RegCloseKey(type_key
);