xref: /AOO41X/main/shell/source/win32/shlxthandler/util/registry.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_shell.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #if defined _MSC_VER
32*cdf0e10cSrcweir #pragma warning(push, 1)
33*cdf0e10cSrcweir #endif
34*cdf0e10cSrcweir #include <windows.h>
35*cdf0e10cSrcweir #if defined _MSC_VER
36*cdf0e10cSrcweir #pragma warning(pop)
37*cdf0e10cSrcweir #endif
38*cdf0e10cSrcweir #include <malloc.h>
39*cdf0e10cSrcweir #include "internal/dbgmacros.hxx"
40*cdf0e10cSrcweir #include "internal/registry.hxx"
41*cdf0e10cSrcweir 
42*cdf0e10cSrcweir #if defined _MSC_VER
43*cdf0e10cSrcweir #pragma warning(push, 1)
44*cdf0e10cSrcweir #endif
45*cdf0e10cSrcweir #include <objbase.h>
46*cdf0e10cSrcweir #if defined _MSC_VER
47*cdf0e10cSrcweir #pragma warning(pop)
48*cdf0e10cSrcweir #endif
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir //---------------------------------------
51*cdf0e10cSrcweir //
52*cdf0e10cSrcweir //---------------------------------------
53*cdf0e10cSrcweir 
54*cdf0e10cSrcweir // Size of a CLSID as a string
55*cdf0e10cSrcweir const int CLSID_STRING_SIZE = 39;
56*cdf0e10cSrcweir 
57*cdf0e10cSrcweir //---------------------------------------
58*cdf0e10cSrcweir //
59*cdf0e10cSrcweir //---------------------------------------
60*cdf0e10cSrcweir 
61*cdf0e10cSrcweir bool SetRegistryKey(HKEY RootKey, const char* KeyName, const char* ValueName, const char* Value)
62*cdf0e10cSrcweir {
63*cdf0e10cSrcweir 	HKEY hSubKey;
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir 	// open or create the desired key
66*cdf0e10cSrcweir 	int rc = RegCreateKeyExA(
67*cdf0e10cSrcweir 		RootKey, KeyName, 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &hSubKey, 0);
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir 	if (ERROR_SUCCESS == rc)
70*cdf0e10cSrcweir 	{
71*cdf0e10cSrcweir 		rc = RegSetValueExA(
72*cdf0e10cSrcweir 			hSubKey, ValueName, 0, REG_SZ, reinterpret_cast<const BYTE*>(Value), strlen(Value) + 1);
73*cdf0e10cSrcweir 
74*cdf0e10cSrcweir 		RegCloseKey(hSubKey);
75*cdf0e10cSrcweir 	}
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir 	return (ERROR_SUCCESS == rc);
78*cdf0e10cSrcweir }
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir //---------------------------------------
81*cdf0e10cSrcweir //
82*cdf0e10cSrcweir //---------------------------------------
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir bool DeleteRegistryKey(HKEY RootKey, const char* KeyName)
85*cdf0e10cSrcweir {
86*cdf0e10cSrcweir 	HKEY hKey;
87*cdf0e10cSrcweir 
88*cdf0e10cSrcweir 	int rc = RegOpenKeyExA(
89*cdf0e10cSrcweir 		RootKey,
90*cdf0e10cSrcweir 		KeyName,
91*cdf0e10cSrcweir 		0,
92*cdf0e10cSrcweir 		KEY_READ | DELETE,
93*cdf0e10cSrcweir 		&hKey);
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir 	if ( rc == ERROR_FILE_NOT_FOUND )
96*cdf0e10cSrcweir 		return true;
97*cdf0e10cSrcweir 
98*cdf0e10cSrcweir 	if (ERROR_SUCCESS == rc)
99*cdf0e10cSrcweir 	{
100*cdf0e10cSrcweir 		char* SubKey;
101*cdf0e10cSrcweir 		DWORD nMaxSubKeyLen;
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir 		rc = RegQueryInfoKeyA(
104*cdf0e10cSrcweir 			hKey, 0, 0, 0, 0,
105*cdf0e10cSrcweir 			&nMaxSubKeyLen,
106*cdf0e10cSrcweir 			0, 0, 0, 0, 0, 0);
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir 		nMaxSubKeyLen++; // space for trailing '\0'
109*cdf0e10cSrcweir 
110*cdf0e10cSrcweir 		SubKey = reinterpret_cast<char*>(
111*cdf0e10cSrcweir 			_alloca(nMaxSubKeyLen*sizeof(char)));
112*cdf0e10cSrcweir 
113*cdf0e10cSrcweir 		while (ERROR_SUCCESS == rc)
114*cdf0e10cSrcweir         {
115*cdf0e10cSrcweir 			DWORD nLen = nMaxSubKeyLen;
116*cdf0e10cSrcweir 
117*cdf0e10cSrcweir 			rc = RegEnumKeyExA(
118*cdf0e10cSrcweir 				hKey,
119*cdf0e10cSrcweir                 0,       // always index zero
120*cdf0e10cSrcweir                 SubKey,
121*cdf0e10cSrcweir                 &nLen,
122*cdf0e10cSrcweir                 0, 0, 0, 0);
123*cdf0e10cSrcweir 
124*cdf0e10cSrcweir             if (ERROR_NO_MORE_ITEMS == rc)
125*cdf0e10cSrcweir             {
126*cdf0e10cSrcweir 				rc = RegDeleteKeyA(RootKey, KeyName);
127*cdf0e10cSrcweir                 break;
128*cdf0e10cSrcweir             }
129*cdf0e10cSrcweir             else if (rc == ERROR_SUCCESS)
130*cdf0e10cSrcweir 			{
131*cdf0e10cSrcweir 				DeleteRegistryKey(hKey, SubKey);
132*cdf0e10cSrcweir 			}
133*cdf0e10cSrcweir 
134*cdf0e10cSrcweir 		} // while
135*cdf0e10cSrcweir 
136*cdf0e10cSrcweir         RegCloseKey(hKey);
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir 	} // if
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir 	return (ERROR_SUCCESS == rc);
141*cdf0e10cSrcweir }
142*cdf0e10cSrcweir 
143*cdf0e10cSrcweir /** May be used to determine if the specified registry key has subkeys
144*cdf0e10cSrcweir 	The function returns true on success else if an error occures false
145*cdf0e10cSrcweir */
146*cdf0e10cSrcweir bool HasSubkeysRegistryKey(HKEY RootKey, const char* KeyName, /* out */ bool& bResult)
147*cdf0e10cSrcweir {
148*cdf0e10cSrcweir 	HKEY hKey;
149*cdf0e10cSrcweir 
150*cdf0e10cSrcweir 	LONG rc = RegOpenKeyExA(RootKey, KeyName, 0, KEY_READ, &hKey);
151*cdf0e10cSrcweir 
152*cdf0e10cSrcweir 	if (ERROR_SUCCESS == rc)
153*cdf0e10cSrcweir 	{
154*cdf0e10cSrcweir 		DWORD nSubKeys = 0;
155*cdf0e10cSrcweir 
156*cdf0e10cSrcweir 		rc = RegQueryInfoKeyA(hKey, 0, 0, 0, &nSubKeys, 0, 0, 0, 0, 0, 0, 0);
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir 		bResult = (nSubKeys > 0);
159*cdf0e10cSrcweir 	}
160*cdf0e10cSrcweir 
161*cdf0e10cSrcweir 	return (ERROR_SUCCESS == rc);
162*cdf0e10cSrcweir }
163*cdf0e10cSrcweir 
164*cdf0e10cSrcweir // Convert a CLSID to a char string.
165*cdf0e10cSrcweir std::string ClsidToString(const CLSID& clsid)
166*cdf0e10cSrcweir {
167*cdf0e10cSrcweir 	// Get CLSID
168*cdf0e10cSrcweir 	LPOLESTR wszCLSID = NULL;
169*cdf0e10cSrcweir 	StringFromCLSID(clsid, &wszCLSID);
170*cdf0e10cSrcweir 
171*cdf0e10cSrcweir 	char buff[39];
172*cdf0e10cSrcweir 	// Covert from wide characters to non-wide.
173*cdf0e10cSrcweir 	wcstombs(buff, wszCLSID, sizeof(buff));
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir 	// Free memory.
176*cdf0e10cSrcweir 	CoTaskMemFree(wszCLSID) ;
177*cdf0e10cSrcweir 
178*cdf0e10cSrcweir 	return std::string(buff);
179*cdf0e10cSrcweir }
180*cdf0e10cSrcweir 
181*cdf0e10cSrcweir //---------------------------------------
182*cdf0e10cSrcweir //
183*cdf0e10cSrcweir //---------------------------------------
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir bool QueryRegistryKey(HKEY RootKey, const char* KeyName, const char* ValueName, char *pszData, DWORD dwBufLen)
186*cdf0e10cSrcweir {
187*cdf0e10cSrcweir 	HKEY hKey;
188*cdf0e10cSrcweir 
189*cdf0e10cSrcweir 	int rc = RegOpenKeyExA(
190*cdf0e10cSrcweir 		RootKey,
191*cdf0e10cSrcweir 		KeyName,
192*cdf0e10cSrcweir 		0,
193*cdf0e10cSrcweir 		KEY_READ,
194*cdf0e10cSrcweir 		&hKey);
195*cdf0e10cSrcweir 
196*cdf0e10cSrcweir 	if (ERROR_SUCCESS == rc)
197*cdf0e10cSrcweir 	{
198*cdf0e10cSrcweir 		rc = RegQueryValueExA(
199*cdf0e10cSrcweir 			hKey, ValueName, NULL, NULL, (LPBYTE)pszData,&dwBufLen);
200*cdf0e10cSrcweir 
201*cdf0e10cSrcweir 		RegCloseKey(hKey);
202*cdf0e10cSrcweir 	}
203*cdf0e10cSrcweir 
204*cdf0e10cSrcweir 	return (ERROR_SUCCESS == rc);
205*cdf0e10cSrcweir }
206