1159b3361Sopenharmony_ci/*
2159b3361Sopenharmony_ci *  LAME MP3 encoder for DirectShow
3159b3361Sopenharmony_ci *  Registry calls handling class
4159b3361Sopenharmony_ci *
5159b3361Sopenharmony_ci *  Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd.
6159b3361Sopenharmony_ci *
7159b3361Sopenharmony_ci * This library is free software; you can redistribute it and/or
8159b3361Sopenharmony_ci * modify it under the terms of the GNU Library General Public
9159b3361Sopenharmony_ci * License as published by the Free Software Foundation; either
10159b3361Sopenharmony_ci * version 2 of the License, or (at your option) any later version.
11159b3361Sopenharmony_ci *
12159b3361Sopenharmony_ci * This library is distributed in the hope that it will be useful,
13159b3361Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14159b3361Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15159b3361Sopenharmony_ci * Library General Public License for more details.
16159b3361Sopenharmony_ci *
17159b3361Sopenharmony_ci * You should have received a copy of the GNU Library General Public
18159b3361Sopenharmony_ci * License along with this library; if not, write to the
19159b3361Sopenharmony_ci * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20159b3361Sopenharmony_ci * Boston, MA 02111-1307, USA.
21159b3361Sopenharmony_ci */
22159b3361Sopenharmony_ci
23159b3361Sopenharmony_ci#include <Windows.h>
24159b3361Sopenharmony_ci
25159b3361Sopenharmony_ci#include "reg.h"
26159b3361Sopenharmony_ci
27159b3361Sopenharmony_cinamespace Lame
28159b3361Sopenharmony_ci{
29159b3361Sopenharmony_ci
30159b3361Sopenharmony_ciCRegKey::CRegKey(void)
31159b3361Sopenharmony_ci{
32159b3361Sopenharmony_ci    m_hRootKey = NULL;
33159b3361Sopenharmony_ci    m_name[0] = 0;
34159b3361Sopenharmony_ci    m_hKey = NULL;
35159b3361Sopenharmony_ci}
36159b3361Sopenharmony_ci
37159b3361Sopenharmony_ci
38159b3361Sopenharmony_ciCRegKey::CRegKey(HKEY rt, PTSTR pName)
39159b3361Sopenharmony_ci{
40159b3361Sopenharmony_ci    m_hRootKey = rt;
41159b3361Sopenharmony_ci    m_hKey = NULL;
42159b3361Sopenharmony_ci    if(pName)
43159b3361Sopenharmony_ci    {
44159b3361Sopenharmony_ci        lstrcpy(m_name, pName);
45159b3361Sopenharmony_ci        Open(m_hRootKey, m_name);
46159b3361Sopenharmony_ci    }
47159b3361Sopenharmony_ci    else
48159b3361Sopenharmony_ci        m_name[0] = 0;
49159b3361Sopenharmony_ci}
50159b3361Sopenharmony_ci
51159b3361Sopenharmony_ci
52159b3361Sopenharmony_ciCRegKey::~CRegKey(void)
53159b3361Sopenharmony_ci{
54159b3361Sopenharmony_ci    Close();
55159b3361Sopenharmony_ci}
56159b3361Sopenharmony_ci
57159b3361Sopenharmony_ci
58159b3361Sopenharmony_ci
59159b3361Sopenharmony_ciBOOL    CRegKey::Open(HKEY rootKey, PTSTR pName)
60159b3361Sopenharmony_ci{
61159b3361Sopenharmony_ci    if(m_hKey)
62159b3361Sopenharmony_ci        Close();
63159b3361Sopenharmony_ci
64159b3361Sopenharmony_ci    m_hRootKey = rootKey;
65159b3361Sopenharmony_ci    if(pName)
66159b3361Sopenharmony_ci    {
67159b3361Sopenharmony_ci        lstrcpy(m_name, pName);
68159b3361Sopenharmony_ci        if(RegOpenKeyEx(m_hRootKey, m_name, 0, KEY_ALL_ACCESS, &m_hKey) != ERROR_SUCCESS)
69159b3361Sopenharmony_ci        {
70159b3361Sopenharmony_ci            m_hKey = NULL;
71159b3361Sopenharmony_ci            return FALSE;
72159b3361Sopenharmony_ci        }
73159b3361Sopenharmony_ci    }
74159b3361Sopenharmony_ci    else
75159b3361Sopenharmony_ci    {
76159b3361Sopenharmony_ci        m_name[0] = 0;
77159b3361Sopenharmony_ci        m_hKey = m_hRootKey;
78159b3361Sopenharmony_ci    }
79159b3361Sopenharmony_ci
80159b3361Sopenharmony_ci    return TRUE;
81159b3361Sopenharmony_ci}
82159b3361Sopenharmony_ci
83159b3361Sopenharmony_ci
84159b3361Sopenharmony_ciBOOL    CRegKey::Create(HKEY rootKey, PTSTR pName)
85159b3361Sopenharmony_ci{
86159b3361Sopenharmony_ci    if(m_hKey)
87159b3361Sopenharmony_ci        Close();
88159b3361Sopenharmony_ci
89159b3361Sopenharmony_ci    m_hRootKey = rootKey;
90159b3361Sopenharmony_ci    if(pName)
91159b3361Sopenharmony_ci    {
92159b3361Sopenharmony_ci        lstrcpy(m_name, pName);
93159b3361Sopenharmony_ci        if(RegCreateKeyEx(m_hRootKey, pName, NULL,
94159b3361Sopenharmony_ci                TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
95159b3361Sopenharmony_ci                &m_hKey, NULL) != ERROR_SUCCESS)
96159b3361Sopenharmony_ci        {
97159b3361Sopenharmony_ci
98159b3361Sopenharmony_ci            m_hKey = NULL;
99159b3361Sopenharmony_ci            return FALSE;
100159b3361Sopenharmony_ci        }
101159b3361Sopenharmony_ci    }
102159b3361Sopenharmony_ci    else
103159b3361Sopenharmony_ci    {
104159b3361Sopenharmony_ci        m_name[0] = 0;
105159b3361Sopenharmony_ci    }
106159b3361Sopenharmony_ci    m_hRootKey = m_hKey;
107159b3361Sopenharmony_ci
108159b3361Sopenharmony_ci    return TRUE;
109159b3361Sopenharmony_ci}
110159b3361Sopenharmony_ci
111159b3361Sopenharmony_ci
112159b3361Sopenharmony_ciBOOL    CRegKey::Open(PTSTR an)
113159b3361Sopenharmony_ci{
114159b3361Sopenharmony_ci    TCHAR achName[MAX_PATH];
115159b3361Sopenharmony_ci
116159b3361Sopenharmony_ci    if(m_hKey)
117159b3361Sopenharmony_ci        Close();
118159b3361Sopenharmony_ci
119159b3361Sopenharmony_ci    lstrcpy(achName, m_name);
120159b3361Sopenharmony_ci    if(an)
121159b3361Sopenharmony_ci        lstrcat(achName, an);
122159b3361Sopenharmony_ci
123159b3361Sopenharmony_ci    if(RegOpenKeyEx(m_hRootKey, achName, 0, KEY_ALL_ACCESS, &m_hKey) != ERROR_SUCCESS)
124159b3361Sopenharmony_ci    {
125159b3361Sopenharmony_ci        m_hKey = NULL;
126159b3361Sopenharmony_ci        return FALSE;
127159b3361Sopenharmony_ci    }
128159b3361Sopenharmony_ci
129159b3361Sopenharmony_ci    return TRUE;
130159b3361Sopenharmony_ci}
131159b3361Sopenharmony_ci
132159b3361Sopenharmony_ci
133159b3361Sopenharmony_ciBOOL    CRegKey::Create(PTSTR an)
134159b3361Sopenharmony_ci{
135159b3361Sopenharmony_ci    TCHAR achName[MAX_PATH];
136159b3361Sopenharmony_ci
137159b3361Sopenharmony_ci    if(m_hKey)
138159b3361Sopenharmony_ci        Close();
139159b3361Sopenharmony_ci
140159b3361Sopenharmony_ci    lstrcpy(achName, m_name);
141159b3361Sopenharmony_ci    if(an)
142159b3361Sopenharmony_ci        lstrcat(achName, an);
143159b3361Sopenharmony_ci
144159b3361Sopenharmony_ci    if(RegCreateKeyEx(m_hRootKey, achName, NULL,
145159b3361Sopenharmony_ci            TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
146159b3361Sopenharmony_ci            &m_hKey, NULL) != ERROR_SUCCESS)
147159b3361Sopenharmony_ci    {
148159b3361Sopenharmony_ci
149159b3361Sopenharmony_ci        m_hKey = NULL;
150159b3361Sopenharmony_ci        return FALSE;
151159b3361Sopenharmony_ci    }
152159b3361Sopenharmony_ci
153159b3361Sopenharmony_ci    return TRUE;
154159b3361Sopenharmony_ci}
155159b3361Sopenharmony_ci
156159b3361Sopenharmony_ci
157159b3361Sopenharmony_ciBOOL    CRegKey::Close(void)
158159b3361Sopenharmony_ci{
159159b3361Sopenharmony_ci    if(m_hKey && m_hKey != m_hRootKey)
160159b3361Sopenharmony_ci        RegCloseKey(m_hKey);
161159b3361Sopenharmony_ci
162159b3361Sopenharmony_ci    m_hKey = 0;
163159b3361Sopenharmony_ci    return TRUE;
164159b3361Sopenharmony_ci}
165159b3361Sopenharmony_ci
166159b3361Sopenharmony_ciBOOL    CRegKey::getFlag(PTSTR valuename, BOOL bDefault)
167159b3361Sopenharmony_ci{
168159b3361Sopenharmony_ci    if(!m_hKey)
169159b3361Sopenharmony_ci        return bDefault;
170159b3361Sopenharmony_ci
171159b3361Sopenharmony_ci    DWORD cbData;
172159b3361Sopenharmony_ci    DWORD   dwData;
173159b3361Sopenharmony_ci    DWORD   dwType;
174159b3361Sopenharmony_ci
175159b3361Sopenharmony_ci    cbData = sizeof(dwData);
176159b3361Sopenharmony_ci    if(RegQueryValueEx(m_hKey, valuename, NULL, &dwType, (PBYTE)&dwData, &cbData) == ERROR_SUCCESS)
177159b3361Sopenharmony_ci    {
178159b3361Sopenharmony_ci        if(dwType == REG_DWORD)
179159b3361Sopenharmony_ci            return (dwData) ? TRUE : FALSE;
180159b3361Sopenharmony_ci    }
181159b3361Sopenharmony_ci    return bDefault;
182159b3361Sopenharmony_ci}
183159b3361Sopenharmony_ci
184159b3361Sopenharmony_ci
185159b3361Sopenharmony_civoid    CRegKey::setFlag(PTSTR valuename, BOOL bValue, BOOL bDefault)
186159b3361Sopenharmony_ci{
187159b3361Sopenharmony_ci    if(getFlag(valuename, bDefault) == bValue )
188159b3361Sopenharmony_ci        return;
189159b3361Sopenharmony_ci
190159b3361Sopenharmony_ci    RegSetValueEx(m_hKey, valuename, 0, REG_DWORD, (PBYTE)&bValue, sizeof(bValue));
191159b3361Sopenharmony_ci}
192159b3361Sopenharmony_ci
193159b3361Sopenharmony_ci
194159b3361Sopenharmony_civoid    CRegKey::setFlag(PTSTR valuename, BOOL bValue)
195159b3361Sopenharmony_ci{
196159b3361Sopenharmony_ci    RegSetValueEx(m_hKey, valuename, 0, REG_DWORD, (PBYTE)&bValue, sizeof(bValue));
197159b3361Sopenharmony_ci}
198159b3361Sopenharmony_ci
199159b3361Sopenharmony_ci
200159b3361Sopenharmony_ciDWORD   CRegKey::getDWORD(PTSTR valuename, DWORD bDefault)
201159b3361Sopenharmony_ci{
202159b3361Sopenharmony_ci    DWORD dwData;
203159b3361Sopenharmony_ci    DWORD cbData;
204159b3361Sopenharmony_ci    DWORD   dwType;
205159b3361Sopenharmony_ci
206159b3361Sopenharmony_ci    if(!m_hKey)
207159b3361Sopenharmony_ci        return bDefault;
208159b3361Sopenharmony_ci
209159b3361Sopenharmony_ci    cbData = sizeof(dwData);
210159b3361Sopenharmony_ci    if(RegQueryValueEx(m_hKey, valuename, NULL, &dwType, (PBYTE)&dwData, &cbData) == ERROR_SUCCESS) {
211159b3361Sopenharmony_ci        if(dwType == REG_DWORD)
212159b3361Sopenharmony_ci        {
213159b3361Sopenharmony_ci            return (UINT)dwData;
214159b3361Sopenharmony_ci        }
215159b3361Sopenharmony_ci    }
216159b3361Sopenharmony_ci
217159b3361Sopenharmony_ci    return bDefault;
218159b3361Sopenharmony_ci}
219159b3361Sopenharmony_ci
220159b3361Sopenharmony_ci
221159b3361Sopenharmony_civoid    CRegKey::setDWORD(PTSTR valuename, DWORD dwValue, DWORD dwDefault)
222159b3361Sopenharmony_ci{
223159b3361Sopenharmony_ci    DWORD dwData = dwValue;
224159b3361Sopenharmony_ci
225159b3361Sopenharmony_ci    if(getDWORD(valuename, dwDefault) == dwValue)
226159b3361Sopenharmony_ci        return;
227159b3361Sopenharmony_ci
228159b3361Sopenharmony_ci    RegSetValueEx(m_hKey, valuename, 0, REG_DWORD, (PBYTE)&dwData, sizeof(dwData));
229159b3361Sopenharmony_ci}
230159b3361Sopenharmony_ci
231159b3361Sopenharmony_ci
232159b3361Sopenharmony_civoid    CRegKey::setDWORD(PTSTR valuename, DWORD dwValue)
233159b3361Sopenharmony_ci{
234159b3361Sopenharmony_ci    DWORD dwData = dwValue;
235159b3361Sopenharmony_ci    RegSetValueEx(m_hKey, valuename, 0, REG_DWORD, (PBYTE)&dwData, sizeof(dwData));
236159b3361Sopenharmony_ci}
237159b3361Sopenharmony_ci
238159b3361Sopenharmony_ci
239159b3361Sopenharmony_ciDWORD CRegKey::getString(PTSTR valuename, PTSTR pDefault, PTSTR pResult, int cbSize)
240159b3361Sopenharmony_ci{
241159b3361Sopenharmony_ci    DWORD dwType;
242159b3361Sopenharmony_ci
243159b3361Sopenharmony_ci    cbSize *= sizeof(TCHAR);    // for unicode strings
244159b3361Sopenharmony_ci
245159b3361Sopenharmony_ci    if(m_hKey)
246159b3361Sopenharmony_ci    {
247159b3361Sopenharmony_ci        if(RegQueryValueEx(m_hKey, valuename, NULL, &dwType, (LPBYTE)pResult, (LPDWORD)&cbSize) == ERROR_SUCCESS)
248159b3361Sopenharmony_ci        {
249159b3361Sopenharmony_ci            if(dwType == REG_SZ)
250159b3361Sopenharmony_ci            {
251159b3361Sopenharmony_ci                return(cbSize - 1);
252159b3361Sopenharmony_ci            }
253159b3361Sopenharmony_ci        }
254159b3361Sopenharmony_ci    }
255159b3361Sopenharmony_ci    lstrcpy(pResult, pDefault);
256159b3361Sopenharmony_ci    return lstrlen(pDefault);
257159b3361Sopenharmony_ci}
258159b3361Sopenharmony_ci
259159b3361Sopenharmony_ci
260159b3361Sopenharmony_civoid    CRegKey::setString(PTSTR valuename, PTSTR pData)
261159b3361Sopenharmony_ci{
262159b3361Sopenharmony_ci    RegSetValueEx(m_hKey, valuename, 0, REG_SZ, (LPBYTE)pData, (lstrlen(pData) + 1)*sizeof(TCHAR));
263159b3361Sopenharmony_ci}
264159b3361Sopenharmony_ci
265159b3361Sopenharmony_ci
266159b3361Sopenharmony_ciDWORD CRegKey::getBinary(PTSTR valuename, PVOID pDefault, PVOID pResult, int cbSize)
267159b3361Sopenharmony_ci{
268159b3361Sopenharmony_ci    DWORD dwType;
269159b3361Sopenharmony_ci
270159b3361Sopenharmony_ci    if(RegQueryValueEx(m_hKey, valuename, NULL, &dwType, (LPBYTE)pResult, (LPDWORD)&cbSize) == ERROR_SUCCESS)
271159b3361Sopenharmony_ci    {
272159b3361Sopenharmony_ci        if(dwType == REG_BINARY)
273159b3361Sopenharmony_ci        {
274159b3361Sopenharmony_ci            return cbSize;
275159b3361Sopenharmony_ci        }
276159b3361Sopenharmony_ci    }
277159b3361Sopenharmony_ci
278159b3361Sopenharmony_ci    memmove(pResult, pDefault, cbSize);
279159b3361Sopenharmony_ci    return cbSize;
280159b3361Sopenharmony_ci}
281159b3361Sopenharmony_ci
282159b3361Sopenharmony_ci
283159b3361Sopenharmony_ciDWORD CRegKey::setBinary(PTSTR valuename, PVOID pData, int cbSize)
284159b3361Sopenharmony_ci{
285159b3361Sopenharmony_ci    RegSetValueEx(m_hKey, valuename, 0, REG_BINARY, (LPBYTE)pData, cbSize);
286159b3361Sopenharmony_ci    return cbSize;
287159b3361Sopenharmony_ci}
288159b3361Sopenharmony_ci
289159b3361Sopenharmony_ci} // namespace Lame
290