Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: src/shared/Registry.cpp

Issue 5171515343503360: Issue #41 - Bring method of determining IE version up to date (Closed)
Patch Set: simplify Registry_Key Created July 26, 2014, 5 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 #include "Registry.h"
2 #include <memory>
3
4 using namespace AdblockPlus;
5
6 Registry_Key::Registry_Key(HKEY parent, std::wstring key_name)
7 {
8 if (key_name.empty())
9 {
10 throw std::runtime_error("key_name may not be empty");
11 }
12 HRESULT hr = RegOpenKeyExW(parent, key_name.c_str(), 0, KEY_QUERY_VALUE, &key) ;
13 if (hr != ERROR_SUCCESS || !key)
14 {
15 throw std::runtime_error("Failure in RegOpenKeyExW");
16 }
17 }
18
19 Registry_Key::~Registry_Key()
20 {
21 RegCloseKey(key);
22 }
23
24 std::wstring Registry_Key::value_wstring(std::wstring name) const
25 {
26 /*
27 * Step one is to determine the presence of the value, along with its type and byte size.
28 */
29 DWORD type;
30 DWORD size = 0;
31 HRESULT hr = ::RegQueryValueExW(static_cast<HKEY>(key), name.c_str(), 0, &type , 0, &size);
32 if (hr != ERROR_SUCCESS)
33 {
34 throw std::runtime_error("Failure in RegQueryValueEx to query name");
sergei 2014/07/28 11:46:27 It's not descriptive. Is it possible to find a roo
Eric 2014/07/29 12:42:25 No, it's not, and it doesn't really matter at the
sergei 2014/07/29 14:45:56 It does always matter. - There is no real reason t
Eric 2014/07/29 15:17:22 Yes, and when we get unified and regular error han
sergei 2014/07/30 10:42:04 I'm pretty sure that std::system_error can be used
Eric 2014/07/30 13:02:04 It's not the exception that's the main problem, it
35 }
36 if (type != REG_SZ)
37 {
38 throw std::runtime_error("Value is not string type");
sergei 2014/07/28 11:46:27 The same as above, it's completely not descriptive
39 }
40
41 /*
42 * Step two is to allocate a buffer for the string and query for its value.
43 * Note that 'size' is the size in bytes, which we need for the system call,
44 * but that 'psize' is the size in words, which we need to manipulate the wc har_t array 'p'.
45 */
46 // Round the byte size up to the nearest multiple of two.
47 size = (size + 1) & ~ DWORD(1);
48 size_t psize = size >> 1;
49 // We need to allocate a temporary buffer to receive the value, because there' s no interface to write directly into the buffer of std::basic_string.
50 std::unique_ptr< wchar_t[] > p(new wchar_t[ psize ]);
sergei 2014/07/28 11:46:27 not sure about it, One one hand it's correct, but
Eric 2014/07/29 12:42:25 We need an allocated buffer, because writing into
sergei 2014/07/29 14:45:56 But we have already decided, that `&x[0]` is OK fo
Eric 2014/07/29 15:17:22 I am not convinced that we have already decided th
51 hr = RegQueryValueExW(key, name.c_str(), 0, 0, reinterpret_cast<BYTE*>(p.get() ), &size);
52 if (hr != ERROR_SUCCESS)
53 {
54 throw std::runtime_error("Failure in RegQueryValueExW to retrieve value");
55 }
56
57 /*
58 * Step three is to construct a return string.
59 *
60 * There's the possibility of an extra terminating null character in the retur n value of the query.
61 * If so, we have to decrement the length of the return value to eliminate it.
62 * If it persists, it will interfere with later string operations such as conc atenation.
63 */
64 if (p[ psize - 1 ] == L'\0')
Oleksandr 2014/07/27 22:13:30 Nit: No spaces before and after array index: if (
65 {
66 --psize;
67 }
68 return std::wstring(p.get(), psize);
69 }
70
OLDNEW

Powered by Google App Engine
This is Rietveld