Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 | 4 |
| 5 #include "chrome/installer/util/set_reg_value_work_item.h" | 5 #include "chrome/installer/util/set_reg_value_work_item.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/win/registry.h" | 8 #include "base/win/registry.h" |
| 9 #include "chrome/installer/util/logging_installer.h" | 9 #include "chrome/installer/util/logging_installer.h" |
| 10 | 10 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 43 } | 43 } |
| 44 | 44 |
| 45 bool SetRegValueWorkItem::Do() { | 45 bool SetRegValueWorkItem::Do() { |
| 46 if (status_ != SET_VALUE) { | 46 if (status_ != SET_VALUE) { |
| 47 // we already did something. | 47 // we already did something. |
| 48 LOG(ERROR) << "multiple calls to Do()"; | 48 LOG(ERROR) << "multiple calls to Do()"; |
| 49 return false; | 49 return false; |
| 50 } | 50 } |
| 51 | 51 |
| 52 base::win::RegKey key; | 52 base::win::RegKey key; |
| 53 if (!key.Open(predefined_root_, key_path_.c_str(), | 53 LONG result = key.Open(predefined_root_, key_path_.c_str(), |
| 54 KEY_READ | KEY_SET_VALUE)) { | 54 KEY_READ | KEY_SET_VALUE); |
| 55 LOG(ERROR) << "can not open " << key_path_; | 55 if (result != ERROR_SUCCESS) { |
| 56 LOG(ERROR) << "can not open " << key_path_ << " error: " << result; | |
|
grt (UTC plus 2)
2011/01/11 03:51:30
com::LogWe here and everywhere
| |
| 56 status_ = VALUE_UNCHANGED; | 57 status_ = VALUE_UNCHANGED; |
| 57 return false; | 58 return false; |
| 58 } | 59 } |
| 59 | 60 |
| 60 bool result = false; | |
| 61 if (key.ValueExists(value_name_.c_str())) { | 61 if (key.ValueExists(value_name_.c_str())) { |
| 62 if (overwrite_) { | 62 if (overwrite_) { |
| 63 bool success = true; | |
| 64 // Read previous value for rollback and write new value | 63 // Read previous value for rollback and write new value |
| 65 if (is_str_type_) { | 64 if (is_str_type_) { |
| 66 std::wstring data; | 65 key.ReadValue(value_name_.c_str(), &previous_value_str_); |
| 67 if (key.ReadValue(value_name_.c_str(), &data)) { | 66 result = key.WriteValue(value_name_.c_str(), value_data_str_.c_str()); |
| 68 previous_value_str_.assign(data); | |
| 69 } | |
| 70 success = key.WriteValue(value_name_.c_str(), value_data_str_.c_str()); | |
| 71 } else { | 67 } else { |
| 72 DWORD data; | 68 key.ReadValueDW(value_name_.c_str(), &previous_value_dword_); |
| 73 if (key.ReadValueDW(value_name_.c_str(), &data)) { | 69 result = key.WriteValue(value_name_.c_str(), value_data_dword_); |
| 74 previous_value_dword_ = data; | |
| 75 } | |
| 76 success = key.WriteValue(value_name_.c_str(), value_data_dword_); | |
| 77 } | 70 } |
| 78 if (success) { | 71 if (result == ERROR_SUCCESS) { |
| 79 VLOG(1) << "overwritten value for " << value_name_; | 72 VLOG(1) << "overwritten value for " << value_name_; |
| 80 status_ = VALUE_OVERWRITTEN; | 73 status_ = VALUE_OVERWRITTEN; |
| 81 result = true; | |
| 82 } else { | 74 } else { |
| 83 LOG(ERROR) << "failed to overwrite value for " << value_name_; | 75 LOG(ERROR) << "failed to overwrite value for " << value_name_ |
| 76 << " error: " << result; | |
| 84 status_ = VALUE_UNCHANGED; | 77 status_ = VALUE_UNCHANGED; |
| 85 result = false; | |
| 86 } | 78 } |
| 87 } else { | 79 } else { |
| 88 VLOG(1) << value_name_ << " exists. not changed "; | 80 VLOG(1) << value_name_ << " exists. not changed "; |
| 89 status_ = VALUE_UNCHANGED; | 81 status_ = VALUE_UNCHANGED; |
| 90 result = true; | |
| 91 } | 82 } |
| 92 } else { | 83 } else { |
| 93 bool success = true; | |
| 94 if (is_str_type_) { | 84 if (is_str_type_) { |
| 95 success = key.WriteValue(value_name_.c_str(), value_data_str_.c_str()); | 85 result = key.WriteValue(value_name_.c_str(), value_data_str_.c_str()); |
| 96 } else { | 86 } else { |
| 97 success = key.WriteValue(value_name_.c_str(), value_data_dword_); | 87 result = key.WriteValue(value_name_.c_str(), value_data_dword_); |
| 98 } | 88 } |
| 99 if (success) { | 89 if (result == ERROR_SUCCESS) { |
| 100 VLOG(1) << "created value for " << value_name_; | 90 VLOG(1) << "created value for " << value_name_; |
| 101 status_ = NEW_VALUE_CREATED; | 91 status_ = NEW_VALUE_CREATED; |
| 102 result = true; | |
| 103 } else { | 92 } else { |
| 104 LOG(ERROR) << "failed to create value for " << value_name_; | 93 LOG(ERROR) << "failed to create value for " << value_name_ |
| 94 << " error: " << result; | |
| 105 status_ = VALUE_UNCHANGED; | 95 status_ = VALUE_UNCHANGED; |
| 106 result = false; | |
| 107 } | 96 } |
| 108 } | 97 } |
| 109 | 98 |
| 110 key.Close(); | 99 key.Close(); |
| 111 return result; | 100 return result == ERROR_SUCCESS; |
| 112 } | 101 } |
| 113 | 102 |
| 114 void SetRegValueWorkItem::Rollback() { | 103 void SetRegValueWorkItem::Rollback() { |
| 115 if (status_ == SET_VALUE || status_ == VALUE_ROLL_BACK) | 104 if (status_ == SET_VALUE || status_ == VALUE_ROLL_BACK) |
| 116 return; | 105 return; |
| 117 | 106 |
| 118 if (status_ == VALUE_UNCHANGED) { | 107 if (status_ == VALUE_UNCHANGED) { |
| 119 status_ = VALUE_ROLL_BACK; | 108 status_ = VALUE_ROLL_BACK; |
| 120 VLOG(1) << "rollback: setting unchanged, nothing to do"; | 109 VLOG(1) << "rollback: setting unchanged, nothing to do"; |
| 121 return; | 110 return; |
| 122 } | 111 } |
| 123 | 112 |
| 124 base::win::RegKey key; | 113 base::win::RegKey key; |
| 125 if (!key.Open(predefined_root_, key_path_.c_str(), | 114 LONG result = key.Open(predefined_root_, key_path_.c_str(), |
| 126 KEY_READ | KEY_SET_VALUE)) { | 115 KEY_READ | KEY_SET_VALUE); |
| 116 if (result != ERROR_SUCCESS) { | |
| 127 status_ = VALUE_ROLL_BACK; | 117 status_ = VALUE_ROLL_BACK; |
| 128 VLOG(1) << "rollback: can not open " << key_path_; | 118 VLOG(1) << "rollback: can not open " << key_path_ << " error: " << result; |
| 129 return; | 119 return; |
| 130 } | 120 } |
| 131 | 121 |
| 132 std::wstring result_str(L" failed"); | |
| 133 if (status_ == NEW_VALUE_CREATED) { | 122 if (status_ == NEW_VALUE_CREATED) { |
| 134 if (key.DeleteValue(value_name_.c_str())) | 123 result = key.DeleteValue(value_name_.c_str()); |
| 135 result_str.assign(L" succeeded"); | 124 VLOG(1) << "rollback: deleting " << value_name_ << " error: " << result; |
| 136 VLOG(1) << "rollback: deleting " << value_name_ << result_str; | |
| 137 } else if (status_ == VALUE_OVERWRITTEN) { | 125 } else if (status_ == VALUE_OVERWRITTEN) { |
| 138 // try restore the previous value | 126 // try restore the previous value |
| 139 bool success = true; | |
| 140 if (is_str_type_) { | 127 if (is_str_type_) { |
| 141 success = key.WriteValue(value_name_.c_str(), | 128 result = key.WriteValue(value_name_.c_str(), previous_value_str_.c_str()); |
| 142 previous_value_str_.c_str()); | |
| 143 } else { | 129 } else { |
| 144 success = key.WriteValue(value_name_.c_str(), previous_value_dword_); | 130 result = key.WriteValue(value_name_.c_str(), previous_value_dword_); |
| 145 } | 131 } |
| 146 if (success) | 132 VLOG(1) << "rollback: restoring " << value_name_ << " error: " << result; |
| 147 result_str.assign(L" succeeded"); | |
| 148 VLOG(1) << "rollback: restoring " << value_name_ << result_str; | |
| 149 } else { | 133 } else { |
| 150 // Not reached. | 134 // Not reached. |
| 135 NOTREACHED(); | |
| 151 } | 136 } |
| 152 | 137 |
| 153 status_ = VALUE_ROLL_BACK; | 138 status_ = VALUE_ROLL_BACK; |
| 154 key.Close(); | 139 key.Close(); |
| 155 return; | 140 return; |
| 156 } | 141 } |
| OLD | NEW |