Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(138)

Side by Side Diff: base/registry.h

Issue 3007037: Cleanup our Registry API. (Closed) Base URL: git://git.chromium.org/chromium.git
Patch Set: fix nit Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | base/registry.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // All Rights Reserved.
5 4
6 #ifndef BASE_REGISTRY_H_ 5 #ifndef BASE_REGISTRY_H_
7 #define BASE_REGISTRY_H_ 6 #define BASE_REGISTRY_H_
8 #pragma once 7 #pragma once
9 8
10 #include <windows.h> 9 #include <windows.h>
11 #include <tchar.h> 10
12 #include <shlwapi.h>
13 #include <string> 11 #include <string>
14 12
15 // The shared file uses a bunch of header files that define types that we don't. 13 #include "base/basictypes.h"
16 // To avoid changing much code from the standard version, and also to avoid
17 // polluting our namespace with extra types we don't want, we define these types
18 // here with the preprocessor and undefine them at the end of the file.
19 #define tchar TCHAR
20 #define CTP const tchar*
21 #define tstr std::basic_string<tchar>
22 14
23 // RegKey 15 // TODO(tfarina): Get rid of all the default arguments used in this file.
24 // Utility class to read from and manipulate the registry. 16 // They are not allowed by our style guide.
17
18 // Utility class to read, write and manipulate the Windows Registry.
25 // Registry vocabulary primer: a "key" is like a folder, in which there 19 // Registry vocabulary primer: a "key" is like a folder, in which there
26 // are "values", which are <name,data> pairs, with an associated data type. 20 // are "values", which are <name, data> pairs, with an associated data type.
27
28 class RegKey { 21 class RegKey {
29 public: 22 public:
30 RegKey(HKEY rootkey = NULL, CTP subkey = NULL, REGSAM access = KEY_READ); 23 RegKey(HKEY rootkey = NULL, const wchar_t* subkey = NULL,
31 24 REGSAM access = KEY_READ);
32 ~RegKey() { Close(); } 25 ~RegKey() { Close(); }
33 26
34 bool Create(HKEY rootkey, CTP subkey, REGSAM access = KEY_READ); 27 bool Create(HKEY rootkey, const wchar_t* subkey, REGSAM access = KEY_READ);
35 28
36 bool CreateWithDisposition(HKEY rootkey, CTP subkey, DWORD* disposition, 29 bool CreateWithDisposition(HKEY rootkey, const wchar_t* subkey,
37 REGSAM access = KEY_READ); 30 DWORD* disposition, REGSAM access = KEY_READ);
38 31
39 bool Open(HKEY rootkey, CTP subkey, REGSAM access = KEY_READ); 32 bool Open(HKEY rootkey, const wchar_t* subkey, REGSAM access = KEY_READ);
40 33
41 // Create a subkey (or open if exists). 34 // Creates a subkey or open it if it already exists.
42 bool CreateKey(CTP name, REGSAM access); 35 bool CreateKey(const wchar_t* name, REGSAM access);
43 36
44 // Open a subkey 37 // Opens a subkey
45 bool OpenKey(CTP name, REGSAM access); 38 bool OpenKey(const wchar_t* name, REGSAM access);
46 39
47 // all done, eh?
48 void Close(); 40 void Close();
49 41
50 // Count of the number of value extant.
51 DWORD ValueCount(); 42 DWORD ValueCount();
52 43
53 // Determine the Nth value's name. 44 // Determine the nth value's name.
54 bool ReadName(int index, tstr* name); 45 bool ReadName(int index, std::wstring* name);
55 46
56 // True while the key is valid. 47 // True while the key is valid.
57 bool Valid() const { return key_ != NULL; } 48 bool Valid() const { return key_ != NULL; }
58 49
59 // Kill key and everything that liveth below it; please be careful out there. 50 // Kill a key and everything that live below it; please be careful when using
60 bool DeleteKey(CTP name); 51 // it.
52 bool DeleteKey(const wchar_t* name);
61 53
62 // Delete a single value within the key. 54 // Deletes a single value within the key.
63 bool DeleteValue(CTP name); 55 bool DeleteValue(const wchar_t* name);
64 56
65 bool ValueExists(CTP name); 57 bool ValueExists(const wchar_t* name);
66 bool ReadValue(CTP name, void* data, DWORD* dsize, DWORD* dtype = NULL);
67 bool ReadValue(CTP name, tstr* value);
68 bool ReadValueDW(CTP name, DWORD* value); // Named to differ from tstr*
69 58
70 bool WriteValue(CTP name, const void* data, DWORD dsize, 59 bool ReadValue(const wchar_t* name, void* data, DWORD* dsize,
60 DWORD* dtype = NULL);
61 bool ReadValue(const wchar_t* name, std::wstring* value);
62 bool ReadValueDW(const wchar_t* name, DWORD* value);
63
64 bool WriteValue(const wchar_t* name, const void* data, DWORD dsize,
71 DWORD dtype = REG_BINARY); 65 DWORD dtype = REG_BINARY);
72 bool WriteValue(CTP name, CTP value); 66 bool WriteValue(const wchar_t* name, const wchar_t* value);
73 bool WriteValue(CTP name, DWORD value); 67 bool WriteValue(const wchar_t* name, DWORD value);
74 68
75 // Start watching the key to see if any of its values have changed. 69 // Starts watching the key to see if any of its values have changed.
76 // The key must have been opened with the KEY_NOTIFY access 70 // The key must have been opened with the KEY_NOTIFY access privelege.
77 // privelege.
78 bool StartWatching(); 71 bool StartWatching();
79 72
80 // If StartWatching hasn't been called, always returns false. 73 // If StartWatching hasn't been called, always returns false.
81 // Otherwise, returns true if anything under the key has changed. 74 // Otherwise, returns true if anything under the key has changed.
82 // This can't be const because the |watch_event_| may be refreshed. 75 // This can't be const because the |watch_event_| may be refreshed.
83 bool HasChanged(); 76 bool HasChanged();
84 77
85 // Will automatically be called by destructor if not manually called 78 // Will automatically be called by destructor if not manually called
86 // beforehand. Returns true if it was watching, false otherwise. 79 // beforehand. Returns true if it was watching, false otherwise.
87 bool StopWatching(); 80 bool StopWatching();
88 81
89 inline bool IsWatching() const { return watch_event_ != 0; } 82 inline bool IsWatching() const { return watch_event_ != 0; }
90 HANDLE watch_event() const { return watch_event_; } 83 HANDLE watch_event() const { return watch_event_; }
91 HKEY Handle() const { return key_; } 84 HKEY Handle() const { return key_; }
92 85
93 private: 86 private:
94 HKEY key_; // The registry key being iterated. 87 HKEY key_; // The registry key being iterated.
95 HANDLE watch_event_; 88 HANDLE watch_event_;
89
90 DISALLOW_COPY_AND_ASSIGN(RegKey);
96 }; 91 };
97 92
98 // Iterates the entries found in a particular folder on the registry. 93 // Iterates the entries found in a particular folder on the registry.
99 // For this application I happen to know I wont need data size larger 94 // For this application I happen to know I wont need data size larger
100 // than MAX_PATH, but in real life this wouldn't neccessarily be 95 // than MAX_PATH, but in real life this wouldn't neccessarily be
101 // adequate. 96 // adequate.
102 class RegistryValueIterator { 97 class RegistryValueIterator {
103 public: 98 public:
104 // Specify a key in construction. 99 RegistryValueIterator(HKEY root_key, const wchar_t* folder_key);
105 RegistryValueIterator(HKEY root_key, LPCTSTR folder_key);
106 100
107 ~RegistryValueIterator(); 101 ~RegistryValueIterator();
108 102
109 DWORD ValueCount() const; // Count of the number of subkeys extant. 103 DWORD ValueCount() const;
110 104
111 bool Valid() const; // True while the iterator is valid. 105 // True while the iterator is valid.
106 bool Valid() const;
112 107
113 void operator++(); // Advance to the next entry in the folder. 108 // Advances to the next registry entry.
109 void operator++();
114 110
115 // The pointers returned by these functions are statics owned by the 111 const wchar_t* Name() const { return name_; }
116 // Name and Value functions. 112 const wchar_t* Value() const { return value_; }
117 CTP Name() const { return name_; }
118 CTP Value() const { return value_; }
119 DWORD ValueSize() const { return value_size_; } 113 DWORD ValueSize() const { return value_size_; }
120 DWORD Type() const { return type_; } 114 DWORD Type() const { return type_; }
121 115
122 int Index() const { return index_; } 116 int Index() const { return index_; }
123 117
124 private: 118 private:
125 bool Read(); // Read in the current values. 119 // Read in the current values.
120 bool Read();
126 121
127 HKEY key_; // The registry key being iterated. 122 // The registry key being iterated.
128 int index_; // Current index of the iteration. 123 HKEY key_;
124
125 // Current index of the iteration.
126 int index_;
129 127
130 // Current values. 128 // Current values.
131 TCHAR name_[MAX_PATH]; 129 wchar_t name_[MAX_PATH];
132 TCHAR value_[MAX_PATH]; 130 wchar_t value_[MAX_PATH];
133 DWORD value_size_; 131 DWORD value_size_;
134 DWORD type_; 132 DWORD type_;
133
134 DISALLOW_COPY_AND_ASSIGN(RegistryValueIterator);
135 }; 135 };
136 136
137
138 class RegistryKeyIterator { 137 class RegistryKeyIterator {
139 public: 138 public:
140 // Specify a parent key in construction. 139 RegistryKeyIterator(HKEY root_key, const wchar_t* folder_key);
141 RegistryKeyIterator(HKEY root_key, LPCTSTR folder_key);
142 140
143 ~RegistryKeyIterator(); 141 ~RegistryKeyIterator();
144 142
145 DWORD SubkeyCount() const; // Count of the number of subkeys extant. 143 DWORD SubkeyCount() const;
146 144
147 bool Valid() const; // True while the iterator is valid. 145 // True while the iterator is valid.
146 bool Valid() const;
148 147
149 void operator++(); // Advance to the next entry in the folder. 148 // Advances to the next entry in the folder.
149 void operator++();
150 150
151 // The pointer returned by Name() is a static owned by the function. 151 const wchar_t* Name() const { return name_; }
152 CTP Name() const { return name_; }
153 152
154 int Index() const { return index_; } 153 int Index() const { return index_; }
155 154
156 private: 155 private:
157 bool Read(); // Read in the current values. 156 // Read in the current values.
157 bool Read();
158 158
159 HKEY key_; // The registry key being iterated. 159 // The registry key being iterated.
160 int index_; // Current index of the iteration. 160 HKEY key_;
161 161
162 // Current values. 162 // Current index of the iteration.
163 TCHAR name_[MAX_PATH]; 163 int index_;
164
165 wchar_t name_[MAX_PATH];
166
167 DISALLOW_COPY_AND_ASSIGN(RegistryKeyIterator);
164 }; 168 };
165 169
166
167 // Register a COM object with the most usual properties.
168 bool RegisterCOMServer(const tchar* guid, const tchar* name,
169 const tchar* modulepath);
170 bool RegisterCOMServer(const tchar* guid, const tchar* name, HINSTANCE module);
171 bool UnregisterCOMServer(const tchar* guid);
172
173 // undo the local types defined above
174 #undef tchar
175 #undef CTP
176 #undef tstr
177
178 #endif // BASE_REGISTRY_H_ 170 #endif // BASE_REGISTRY_H_
OLDNEW
« no previous file with comments | « no previous file | base/registry.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698