1 // TortoiseSVN - a Windows shell extension for easy version control
\r
3 // Copyright (C) 2003-2006,2008 - TortoiseSVN
\r
5 // This program is free software; you can redistribute it and/or
\r
6 // modify it under the terms of the GNU General Public License
\r
7 // as published by the Free Software Foundation; either version 2
\r
8 // of the License, or (at your option) any later version.
\r
10 // This program is distributed in the hope that it will be useful,
\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 // GNU General Public License for more details.
\r
15 // You should have received a copy of the GNU General Public License
\r
16 // along with this program; if not, write to the Free Software Foundation,
\r
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\r
20 #include "registry.h"
\r
22 //////////////////////////////////////////////////////////////////////////////////////////////
\r
24 #ifdef __CSTRINGT_H__
\r
25 CRegBase::CRegBase()
\r
29 CRegBase::CRegBase (const CString& key, bool force, HKEY base)
\r
30 : CRegBaseCommon<CString> (key, force, base)
\r
32 m_key.TrimLeft(_T("\\"));
\r
33 int backslashpos = m_key.ReverseFind('\\');
\r
34 m_path = m_key.Left(backslashpos);
\r
35 m_path.TrimRight(_T("\\"));
\r
36 m_key = m_key.Mid(backslashpos);
\r
37 m_key.Trim(_T("\\"));
\r
41 //////////////////////////////////////////////////////////////////////////////////////////////
\r
43 CRegStdBase::CRegStdBase()
\r
47 CRegStdBase::CRegStdBase (const stdstring& key, bool force, HKEY base)
\r
48 : CRegBaseCommon<stdstring> (key, force, base)
\r
50 stdstring::size_type pos = key.find_last_of(_T('\\'));
\r
51 m_path = key.substr(0, pos);
\r
52 m_key = key.substr(pos + 1);
\r
55 //////////////////////////////////////////////////////////////////////////////////////////////
\r
57 #ifdef __ATLTYPES_H__ // defines CRect
\r
58 CRegRect::CRegRect(void)
\r
59 : CRegTypedBase<CRect, CRegBase>(CRect(0,0,0,0))
\r
63 CRegRect::CRegRect(const CString& key, const CRect& def, bool force, HKEY base)
\r
64 : CRegTypedBase<CRect, CRegBase> (key, def, force, base)
\r
69 void CRegRect::InternalRead (HKEY hKey, CRect& value)
\r
73 RegQueryValueEx(hKey, m_key, NULL, &type, NULL, (LPDWORD) &size);
\r
75 std::auto_ptr<char> buffer (new char[size]);
\r
76 if ((LastError = RegQueryValueEx(hKey, m_key, NULL, &type, (BYTE*) buffer.get(), &size))==ERROR_SUCCESS)
\r
78 ASSERT(type==REG_BINARY);
\r
79 value = CRect((LPRECT)buffer.get());
\r
83 void CRegRect::InternalWrite (HKEY hKey, const CRect& value)
\r
85 LastError = RegSetValueEx(hKey, m_key, 0, REG_BINARY, (BYTE *)(LPCRECT)value, sizeof(value));
\r
90 //////////////////////////////////////////////////////////////////////////////////////////////
\r
92 #ifdef __ATLTYPES_H__ // defines CPoint
\r
93 CRegPoint::CRegPoint(void)
\r
94 : CRegTypedBase<CPoint, CRegBase>(CPoint(0,0))
\r
98 CRegPoint::CRegPoint(const CString& key, const CPoint& def, bool force, HKEY base)
\r
99 : CRegTypedBase<CPoint, CRegBase> (key, def, force, base)
\r
104 void CRegPoint::InternalRead (HKEY hKey, CPoint& value)
\r
108 RegQueryValueEx(hKey, m_key, NULL, &type, NULL, (LPDWORD) &size);
\r
110 std::auto_ptr<char> buffer(new char[size]);
\r
111 if ((LastError = RegQueryValueEx(hKey, m_key, NULL, &type, (BYTE*) buffer.get(), &size))==ERROR_SUCCESS)
\r
113 ASSERT(type==REG_BINARY);
\r
114 value = CPoint(*(POINT*)buffer.get());
\r
118 void CRegPoint::InternalWrite (HKEY hKey, const CPoint& value)
\r
120 LastError = RegSetValueEx(hKey, m_key, 0, REG_BINARY, (BYTE *)&value, sizeof(value));
\r
124 /////////////////////////////////////////////////////////////////////
\r
126 #ifdef __AFXCOLL_H__ // defines CStringList
\r
127 CRegistryKey::CRegistryKey(const CString& key, HKEY base)
\r
132 m_path.TrimLeft(_T("\\"));
\r
135 CRegistryKey::~CRegistryKey()
\r
138 RegCloseKey(m_hKey);
\r
141 DWORD CRegistryKey::createKey()
\r
144 DWORD rc = RegCreateKeyEx(m_base, m_path, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &m_hKey, &disp);
\r
145 if (rc != ERROR_SUCCESS)
\r
149 return RegCloseKey(m_hKey);
\r
152 DWORD CRegistryKey::removeKey()
\r
154 RegOpenKeyEx(m_base, m_path, 0, KEY_WRITE, &m_hKey);
\r
155 return SHDeleteKey(m_base, (LPCTSTR)m_path);
\r
158 bool CRegistryKey::getValues(CStringList& values)
\r
160 values.RemoveAll();
\r
162 if (RegOpenKeyEx(m_base, m_path, 0, KEY_EXECUTE, &m_hKey)==ERROR_SUCCESS)
\r
164 for (int i = 0, rc = ERROR_SUCCESS; rc == ERROR_SUCCESS; i++)
\r
167 DWORD size = sizeof value / sizeof TCHAR;
\r
168 rc = RegEnumValue(m_hKey, i, value, &size, NULL, NULL, NULL, NULL);
\r
169 if (rc == ERROR_SUCCESS)
\r
171 values.AddTail(value);
\r
176 return values.GetCount() > 0;
\r
179 bool CRegistryKey::getSubKeys(CStringList& subkeys)
\r
181 subkeys.RemoveAll();
\r
183 if (RegOpenKeyEx(m_base, m_path, 0, KEY_EXECUTE, &m_hKey)==ERROR_SUCCESS)
\r
185 for (int i = 0, rc = ERROR_SUCCESS; rc == ERROR_SUCCESS; i++)
\r
188 DWORD size = sizeof value / sizeof TCHAR;
\r
189 FILETIME last_write_time;
\r
190 rc = RegEnumKeyEx(m_hKey, i, value, &size, NULL, NULL, NULL, &last_write_time);
\r
191 if (rc == ERROR_SUCCESS)
\r
193 subkeys.AddTail(value);
\r
198 return subkeys.GetCount() > 0;
\r