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