OSDN Git Service

Add libintl
[tortoisegit/TortoiseGitJp.git] / src / Utils / Registry.cpp
1 // TortoiseSVN - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2003-2006,2008 - TortoiseSVN\r
4 \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
9 \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
14 \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
18 //\r
19 #include "stdafx.h"\r
20 #include "registry.h"\r
21 \r
22 //////////////////////////////////////////////////////////////////////////////////////////////\r
23 \r
24 #ifdef __CSTRINGT_H__\r
25 CRegBase::CRegBase()\r
26 {\r
27 }\r
28 \r
29 CRegBase::CRegBase (const CString& key, bool force, HKEY base)\r
30     : CRegBaseCommon<CString> (key, force, base)\r
31 {\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
38 }\r
39 #endif\r
40 \r
41 //////////////////////////////////////////////////////////////////////////////////////////////\r
42 \r
43 CRegStdBase::CRegStdBase()\r
44 {\r
45 }\r
46 \r
47 CRegStdBase::CRegStdBase (const stdstring& key, bool force, HKEY base)\r
48     : CRegBaseCommon<stdstring> (key, force, base)\r
49 {\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
53 }\r
54 \r
55 //////////////////////////////////////////////////////////////////////////////////////////////\r
56 \r
57 #ifdef __ATLTYPES_H__   // defines CRect \r
58 CRegRect::CRegRect(void)\r
59     : CRegTypedBase<CRect, CRegBase>(CRect(0,0,0,0))\r
60 {\r
61 }\r
62 \r
63 CRegRect::CRegRect(const CString& key, const CRect& def, bool force, HKEY base)\r
64     : CRegTypedBase<CRect, CRegBase> (key, def, force, base)\r
65 {\r
66         read();\r
67 }\r
68 \r
69 void CRegRect::InternalRead (HKEY hKey, CRect& value)\r
70 {\r
71         DWORD size = 0;\r
72         DWORD type = 0;\r
73         RegQueryValueEx(hKey, m_key, NULL, &type, NULL, (LPDWORD) &size);\r
74 \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
77     {\r
78         ASSERT(type==REG_BINARY);\r
79                 value = CRect((LPRECT)buffer.get());\r
80     }\r
81 }\r
82 \r
83 void CRegRect::InternalWrite (HKEY hKey, const CRect& value)\r
84 {\r
85         LastError = RegSetValueEx(hKey, m_key, 0, REG_BINARY, (BYTE *)(LPCRECT)value, sizeof(value));\r
86 }\r
87 \r
88 #endif\r
89 \r
90 //////////////////////////////////////////////////////////////////////////////////////////////\r
91 \r
92 #ifdef __ATLTYPES_H__   // defines CPoint \r
93 CRegPoint::CRegPoint(void)\r
94     : CRegTypedBase<CPoint, CRegBase>(CPoint(0,0))\r
95 {\r
96 }\r
97 \r
98 CRegPoint::CRegPoint(const CString& key, const CPoint& def, bool force, HKEY base)\r
99     : CRegTypedBase<CPoint, CRegBase> (key, def, force, base)\r
100 {\r
101         read();\r
102 }\r
103 \r
104 void CRegPoint::InternalRead (HKEY hKey, CPoint& value)\r
105 {\r
106         DWORD size = 0;\r
107         DWORD type = 0;\r
108         RegQueryValueEx(hKey, m_key, NULL, &type, NULL, (LPDWORD) &size);\r
109 \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
112     {\r
113         ASSERT(type==REG_BINARY);\r
114                 value = CPoint(*(POINT*)buffer.get());\r
115     }\r
116 }\r
117 \r
118 void CRegPoint::InternalWrite (HKEY hKey, const CPoint& value)\r
119 {\r
120         LastError = RegSetValueEx(hKey, m_key, 0, REG_BINARY, (BYTE *)&value, sizeof(value));\r
121 }\r
122 #endif\r
123 \r
124 /////////////////////////////////////////////////////////////////////\r
125 \r
126 #ifdef __AFXCOLL_H__   // defines CStringList \r
127 CRegistryKey::CRegistryKey(const CString& key, HKEY base)\r
128 {\r
129         m_base = base;\r
130         m_hKey = NULL;\r
131         m_path = key;\r
132         m_path.TrimLeft(_T("\\"));\r
133 }\r
134 \r
135 CRegistryKey::~CRegistryKey()\r
136 {\r
137         if (m_hKey)\r
138                 RegCloseKey(m_hKey);\r
139 }\r
140 \r
141 DWORD CRegistryKey::createKey()\r
142 {\r
143         DWORD disp;\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
146         {\r
147                 return rc;\r
148         }\r
149         return RegCloseKey(m_hKey);\r
150 }\r
151 \r
152 DWORD CRegistryKey::removeKey()\r
153 {\r
154         RegOpenKeyEx(m_base, m_path, 0, KEY_WRITE, &m_hKey);\r
155         return SHDeleteKey(m_base, (LPCTSTR)m_path);\r
156 }\r
157 \r
158 bool CRegistryKey::getValues(CStringList& values)\r
159 {\r
160         values.RemoveAll();\r
161 \r
162         if (RegOpenKeyEx(m_base, m_path, 0, KEY_EXECUTE, &m_hKey)==ERROR_SUCCESS)\r
163         {\r
164                 for (int i = 0, rc = ERROR_SUCCESS; rc == ERROR_SUCCESS; i++)\r
165                 { \r
166                         TCHAR value[255];\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
170                         {\r
171                                 values.AddTail(value);\r
172                         }\r
173                 }\r
174         }\r
175 \r
176         return values.GetCount() > 0;\r
177 }\r
178 \r
179 bool CRegistryKey::getSubKeys(CStringList& subkeys)\r
180 {\r
181         subkeys.RemoveAll();\r
182 \r
183         if (RegOpenKeyEx(m_base, m_path, 0, KEY_EXECUTE, &m_hKey)==ERROR_SUCCESS)\r
184         {\r
185                 for (int i = 0, rc = ERROR_SUCCESS; rc == ERROR_SUCCESS; i++)\r
186                 { \r
187                         TCHAR value[1024];\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
192                         {\r
193                                 subkeys.AddTail(value);\r
194                         }\r
195                 }\r
196         }\r
197 \r
198         return subkeys.GetCount() > 0;\r
199 }\r
200 #endif\r
201 \r