| Index: base/win/registry.cc
|
| ===================================================================
|
| --- base/win/registry.cc (revision 71761)
|
| +++ base/win/registry.cc (working copy)
|
| @@ -39,48 +39,33 @@
|
| Close();
|
| }
|
|
|
| -bool RegKey::Create(HKEY rootkey, const wchar_t* subkey, REGSAM access) {
|
| +GONG RegKey::Create(HKEY rootkey, const wchar_t* subkey, REGSAM access) {
|
| DWORD disposition_value;
|
| return CreateWithDisposition(rootkey, subkey, &disposition_value, access);
|
| }
|
|
|
| -bool RegKey::CreateWithDisposition(HKEY rootkey, const wchar_t* subkey,
|
| +GONG RegKey::CreateWithDisposition(HKEY rootkey, const wchar_t* subkey,
|
| DWORD* disposition, REGSAM access) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DCHECK(rootkey && subkey && access && disposition);
|
| Close();
|
|
|
| - LONG result = RegCreateKeyEx(rootkey,
|
| - subkey,
|
| - 0,
|
| - NULL,
|
| - REG_OPTION_NON_VOLATILE,
|
| - access,
|
| - NULL,
|
| - &key_,
|
| + LONG result = RegCreateKeyEx(rootkey, subkey, 0, NULL,
|
| + REG_OPTION_NON_VOLATILE, access, NULL, &key_,
|
| disposition);
|
| - if (result != ERROR_SUCCESS) {
|
| - key_ = NULL;
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| + return result;
|
| }
|
|
|
| -bool RegKey::Open(HKEY rootkey, const wchar_t* subkey, REGSAM access) {
|
| +GONG RegKey::Open(HKEY rootkey, const wchar_t* subkey, REGSAM access) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DCHECK(rootkey && subkey && access);
|
| Close();
|
|
|
| LONG result = RegOpenKeyEx(rootkey, subkey, 0, access, &key_);
|
| - if (result != ERROR_SUCCESS) {
|
| - key_ = NULL;
|
| - return false;
|
| - }
|
| - return true;
|
| + return result;
|
| }
|
|
|
| -bool RegKey::CreateKey(const wchar_t* name, REGSAM access) {
|
| +GONG RegKey::CreateKey(const wchar_t* name, REGSAM access) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DCHECK(name && access);
|
|
|
| @@ -90,10 +75,10 @@
|
| Close();
|
|
|
| key_ = subkey;
|
| - return (result == ERROR_SUCCESS);
|
| + return result;
|
| }
|
|
|
| -bool RegKey::OpenKey(const wchar_t* name, REGSAM access) {
|
| +GONG RegKey::OpenKey(const wchar_t* name, REGSAM access) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DCHECK(name && access);
|
|
|
| @@ -103,7 +88,7 @@
|
| Close();
|
|
|
| key_ = subkey;
|
| - return (result == ERROR_SUCCESS);
|
| + return result;
|
| }
|
|
|
| void RegKey::Close() {
|
| @@ -118,67 +103,61 @@
|
| DWORD RegKey::ValueCount() const {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DWORD count = 0;
|
| - HRESULT result = RegQueryInfoKey(key_, NULL, 0, NULL, NULL, NULL,
|
| - NULL, &count, NULL, NULL, NULL, NULL);
|
| + LONG result = RegQueryInfoKey(key_, NULL, 0, NULL, NULL, NULL, NULL, &count,
|
| + NULL, NULL, NULL, NULL);
|
| return (result != ERROR_SUCCESS) ? 0 : count;
|
| }
|
|
|
| -bool RegKey::ReadName(int index, std::wstring* name) const {
|
| +GONG RegKey::ReadName(int index, std::wstring* name) const {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| wchar_t buf[256];
|
| DWORD bufsize = arraysize(buf);
|
| - LRESULT r = ::RegEnumValue(key_, index, buf, &bufsize, NULL, NULL,
|
| - NULL, NULL);
|
| - if (r != ERROR_SUCCESS)
|
| - return false;
|
| - if (name)
|
| + LONG r = ::RegEnumValue(key_, index, buf, &bufsize, NULL, NULL, NULL, NULL);
|
| + if (r == ERROR_SUCCESS)
|
| *name = buf;
|
| - return true;
|
| +
|
| + return r;
|
| }
|
|
|
| -bool RegKey::DeleteKey(const wchar_t* name) {
|
| +GONG RegKey::DeleteKey(const wchar_t* name) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| - if (!key_)
|
| - return false;
|
| - LSTATUS ret = SHDeleteKey(key_, name);
|
| - if (ERROR_SUCCESS != ret)
|
| - SetLastError(ret);
|
| - return ERROR_SUCCESS == ret;
|
| + DCHECK(key_);
|
| + DCHECK(name);
|
| + LONG result = SHDeleteKey(key_, name);
|
| + return result;
|
| }
|
|
|
| -bool RegKey::DeleteValue(const wchar_t* value_name) {
|
| +GONG RegKey::DeleteValue(const wchar_t* value_name) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| + DCHECK(key_);
|
| DCHECK(value_name);
|
| - HRESULT result = RegDeleteValue(key_, value_name);
|
| - return (result == ERROR_SUCCESS);
|
| + LONG result = RegDeleteValue(key_, value_name);
|
| + return result;
|
| }
|
|
|
| -bool RegKey::ValueExists(const wchar_t* name) {
|
| +bool RegKey::ValueExists(const wchar_t* name) const {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| - if (!key_)
|
| - return false;
|
| - HRESULT result = RegQueryValueEx(key_, name, 0, NULL, NULL, NULL);
|
| - return (result == ERROR_SUCCESS);
|
| + LONG result = RegQueryValueEx(key_, name, 0, NULL, NULL, NULL);
|
| + return result == ERROR_SUCCESS;
|
| }
|
|
|
| -bool RegKey::ReadValue(const wchar_t* name, void* data,
|
| - DWORD* dsize, DWORD* dtype) const {
|
| +GONG RegKey::ReadValue(const wchar_t* name, void* data, DWORD* dsize,
|
| + DWORD* dtype) const {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| - if (!key_)
|
| - return false;
|
| - HRESULT result = RegQueryValueEx(key_, name, 0, dtype,
|
| - reinterpret_cast<LPBYTE>(data), dsize);
|
| - return (result == ERROR_SUCCESS);
|
| + LONG result = RegQueryValueEx(key_, name, 0, dtype,
|
| + reinterpret_cast<LPBYTE>(data), dsize);
|
| + return result;
|
| }
|
|
|
| -bool RegKey::ReadValue(const wchar_t* name, std::wstring* value) const {
|
| +GONG RegKey::ReadValue(const wchar_t* name, std::wstring* value) const {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DCHECK(value);
|
| const size_t kMaxStringLength = 1024; // This is after expansion.
|
| // Use the one of the other forms of ReadValue if 1024 is too small for you.
|
| wchar_t raw_value[kMaxStringLength];
|
| DWORD type = REG_SZ, size = sizeof(raw_value);
|
| - if (ReadValue(name, raw_value, &size, &type)) {
|
| + LONG result = ReadValue(name, raw_value, &size, &type);
|
| + if (result == ERROR_SUCCESS) {
|
| if (type == REG_SZ) {
|
| *value = raw_value;
|
| } else if (type == REG_EXPAND_SZ) {
|
| @@ -187,63 +166,77 @@
|
| // Success: returns the number of wchar_t's copied
|
| // Fail: buffer too small, returns the size required
|
| // Fail: other, returns 0
|
| - if (size == 0 || size > kMaxStringLength)
|
| - return false;
|
| - *value = expanded;
|
| + if (size == 0 || size > kMaxStringLength) {
|
| + result = ERROR_MORE_DATA;
|
| + } else {
|
| + *value = expanded;
|
| + }
|
| } else {
|
| // Not a string. Oops.
|
| - return false;
|
| + result = ERROR_CANTREAD;
|
| }
|
| - return true;
|
| }
|
|
|
| - return false;
|
| + return result;
|
| }
|
|
|
| -bool RegKey::ReadValueDW(const wchar_t* name, DWORD* value) const {
|
| +GONG RegKey::ReadValueDW(const wchar_t* name, DWORD* value) const {
|
| DCHECK(value);
|
| DWORD type = REG_DWORD;
|
| DWORD size = sizeof(DWORD);
|
| - DWORD result = 0;
|
| - if (ReadValue(name, &result, &size, &type) &&
|
| - (type == REG_DWORD || type == REG_BINARY) &&
|
| - size == sizeof(DWORD)) {
|
| - *value = result;
|
| - return true;
|
| + DWORD local_value = 0;
|
| + LONG result = ReadValue(name, &local_value, &size, &type);
|
| + if (result == ERROR_SUCCESS) {
|
| + if ((type == REG_DWORD || type == REG_BINARY) && size == sizeof(DWORD)) {
|
| + *value = local_value;
|
| + } else {
|
| + result = ERROR_CANTREAD;
|
| + }
|
| }
|
|
|
| - return false;
|
| + return result;
|
| }
|
|
|
| -bool RegKey::WriteValue(const wchar_t* name, const void * data,
|
| +GONG RegKey::ReadInt64(const wchar_t* name, int64* value) const {
|
| + DCHECK(value);
|
| + DWORD type = REG_QWORD;
|
| + int64 local_value = 0;
|
| + DWORD size = sizeof(local_value);
|
| + LONG result = ReadValue(name, &local_value, &size, &type);
|
| + if (result == ERROR_SUCCESS) {
|
| + if ((type == REG_QWORD || type == REG_BINARY) &&
|
| + size == sizeof(local_value)) {
|
| + *value = local_value;
|
| + } else {
|
| + result = ERROR_CANTREAD;
|
| + }
|
| + }
|
| +
|
| + return result;
|
| +}
|
| +
|
| +GONG RegKey::WriteValue(const wchar_t* name, const void * data,
|
| DWORD dsize, DWORD dtype) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DCHECK(data);
|
| + DCHECK(key_);
|
|
|
| - if (!key_)
|
| - return false;
|
| -
|
| - HRESULT result = RegSetValueEx(
|
| - key_,
|
| - name,
|
| - 0,
|
| - dtype,
|
| - reinterpret_cast<LPBYTE>(const_cast<void*>(data)),
|
| - dsize);
|
| - return (result == ERROR_SUCCESS);
|
| + LONG result = RegSetValueEx(key_, name, 0, dtype,
|
| + reinterpret_cast<LPBYTE>(const_cast<void*>(data)), dsize);
|
| + return result;
|
| }
|
|
|
| -bool RegKey::WriteValue(const wchar_t * name, const wchar_t* value) {
|
| +GONG RegKey::WriteValue(const wchar_t * name, const wchar_t* value) {
|
| return WriteValue(name, value,
|
| static_cast<DWORD>(sizeof(*value) * (wcslen(value) + 1)), REG_SZ);
|
| }
|
|
|
| -bool RegKey::WriteValue(const wchar_t* name, DWORD value) {
|
| - return WriteValue(name, &value,
|
| - static_cast<DWORD>(sizeof(value)), REG_DWORD);
|
| +GONG RegKey::WriteValue(const wchar_t* name, DWORD value) {
|
| + return WriteValue(name, &value, static_cast<DWORD>(sizeof(value)), REG_DWORD);
|
| }
|
|
|
| -bool RegKey::StartWatching() {
|
| +GONG RegKey::StartWatching() {
|
| + DCHECK(key_);
|
| if (!watch_event_)
|
| watch_event_ = CreateEvent(NULL, TRUE, FALSE, NULL);
|
|
|
| @@ -253,15 +246,13 @@
|
| REG_NOTIFY_CHANGE_SECURITY;
|
|
|
| // Watch the registry key for a change of value.
|
| - HRESULT result = RegNotifyChangeKeyValue(key_, TRUE, filter,
|
| - watch_event_, TRUE);
|
| - if (SUCCEEDED(result)) {
|
| - return true;
|
| - } else {
|
| + LONG result = RegNotifyChangeKeyValue(key_, TRUE, filter, watch_event_, TRUE);
|
| + if (result != ERROR_SUCCESS) {
|
| CloseHandle(watch_event_);
|
| watch_event_ = 0;
|
| - return false;
|
| }
|
| +
|
| + return result;
|
| }
|
|
|
| bool RegKey::HasChanged() {
|
| @@ -274,13 +265,14 @@
|
| return false;
|
| }
|
|
|
| -bool RegKey::StopWatching() {
|
| +GONG RegKey::StopWatching() {
|
| + LONG result = ERROR_INVALID_HANDLE;
|
| if (watch_event_) {
|
| CloseHandle(watch_event_);
|
| watch_event_ = 0;
|
| - return true;
|
| + result = ERROR_SUCCESS;
|
| }
|
| - return false;
|
| + return result;
|
| }
|
|
|
| // RegistryValueIterator ------------------------------------------------------
|
| @@ -317,9 +309,8 @@
|
| DWORD RegistryValueIterator::ValueCount() const {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DWORD count = 0;
|
| - HRESULT result = ::RegQueryInfoKey(key_, NULL, 0, NULL, NULL, NULL, NULL,
|
| - &count, NULL, NULL, NULL, NULL);
|
| -
|
| + LONG result = ::RegQueryInfoKey(key_, NULL, 0, NULL, NULL, NULL, NULL,
|
| + &count, NULL, NULL, NULL, NULL);
|
| if (result != ERROR_SUCCESS)
|
| return 0;
|
|
|
| @@ -340,8 +331,8 @@
|
| if (Valid()) {
|
| DWORD ncount = arraysize(name_);
|
| value_size_ = sizeof(value_);
|
| - LRESULT r = ::RegEnumValue(key_, index_, name_, &ncount, NULL, &type_,
|
| - reinterpret_cast<BYTE*>(value_), &value_size_);
|
| + LONG r = ::RegEnumValue(key_, index_, name_, &ncount, NULL, &type_,
|
| + reinterpret_cast<BYTE*>(value_), &value_size_);
|
| if (ERROR_SUCCESS == r)
|
| return true;
|
| }
|
| @@ -362,8 +353,8 @@
|
| key_ = NULL;
|
| } else {
|
| DWORD count = 0;
|
| - HRESULT result = ::RegQueryInfoKey(key_, NULL, 0, NULL, &count, NULL, NULL,
|
| - NULL, NULL, NULL, NULL, NULL);
|
| + LONG result = ::RegQueryInfoKey(key_, NULL, 0, NULL, &count, NULL, NULL,
|
| + NULL, NULL, NULL, NULL, NULL);
|
|
|
| if (result != ERROR_SUCCESS) {
|
| ::RegCloseKey(key_);
|
| @@ -385,9 +376,8 @@
|
| DWORD RegistryKeyIterator::SubkeyCount() const {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DWORD count = 0;
|
| - HRESULT result = ::RegQueryInfoKey(key_, NULL, 0, NULL, &count, NULL, NULL,
|
| - NULL, NULL, NULL, NULL, NULL);
|
| -
|
| + LONG result = ::RegQueryInfoKey(key_, NULL, 0, NULL, &count, NULL, NULL,
|
| + NULL, NULL, NULL, NULL, NULL);
|
| if (result != ERROR_SUCCESS)
|
| return 0;
|
|
|
| @@ -408,8 +398,8 @@
|
| if (Valid()) {
|
| DWORD ncount = arraysize(name_);
|
| FILETIME written;
|
| - LRESULT r = ::RegEnumKeyEx(key_, index_, name_, &ncount, NULL, NULL,
|
| - NULL, &written);
|
| + LONG r = ::RegEnumKeyEx(key_, index_, name_, &ncount, NULL, NULL,
|
| + NULL, &written);
|
| if (ERROR_SUCCESS == r)
|
| return true;
|
| }
|
|
|