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

Side by Side Diff: chrome/browser/component_updater/component_patcher_operation.cc

Issue 25883006: Support asynchronous patching operations in the component updater. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@tests
Patch Set: New LKGR, Windows fixes. Created 7 years, 1 month 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/browser/component_updater/component_patcher_operation.h" 5 #include "chrome/browser/component_updater/component_patcher_operation.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 return new DeltaUpdateOpPatchBsdiff(); 46 return new DeltaUpdateOpPatchBsdiff();
47 else if (operation == "courgette") 47 else if (operation == "courgette")
48 return new DeltaUpdateOpPatchCourgette(); 48 return new DeltaUpdateOpPatchCourgette();
49 return NULL; 49 return NULL;
50 } 50 }
51 51
52 DeltaUpdateOp::DeltaUpdateOp() {} 52 DeltaUpdateOp::DeltaUpdateOp() {}
53 53
54 DeltaUpdateOp::~DeltaUpdateOp() {} 54 DeltaUpdateOp::~DeltaUpdateOp() {}
55 55
56 ComponentUnpacker::Error DeltaUpdateOp::Run(base::DictionaryValue* command_args, 56 component_updater::Error DeltaUpdateOp::Run(base::DictionaryValue* command_args,
57 const base::FilePath& input_dir, 57 const base::FilePath& input_dir,
58 const base::FilePath& unpack_dir, 58 const base::FilePath& unpack_dir,
59 ComponentPatcher* patcher, 59 ComponentPatcher* patcher,
60 ComponentInstaller* installer, 60 ComponentInstaller* installer,
61 int* error) { 61 int* error) {
62 std::string output_rel_path; 62 std::string output_rel_path;
63 if (!command_args->GetString(kOutput, &output_rel_path) || 63 if (!command_args->GetString(kOutput, &output_rel_path) ||
64 !command_args->GetString(kSha256, &output_sha256_)) 64 !command_args->GetString(kSha256, &output_sha256_))
65 return ComponentUnpacker::kDeltaBadCommands; 65 return component_updater::kDeltaBadCommands;
66 66
67 output_abs_path_ = unpack_dir.Append( 67 output_abs_path_ = unpack_dir.Append(
68 base::FilePath::FromUTF8Unsafe(output_rel_path)); 68 base::FilePath::FromUTF8Unsafe(output_rel_path));
69 ComponentUnpacker::Error parse_result = DoParseArguments( 69 component_updater::Error parse_result = DoParseArguments(
70 command_args, input_dir, installer); 70 command_args, input_dir, installer);
71 if (parse_result != ComponentUnpacker::kNone) 71 if (parse_result != component_updater::kNone)
72 return parse_result; 72 return parse_result;
73 73
74 const base::FilePath parent = output_abs_path_.DirName(); 74 const base::FilePath parent = output_abs_path_.DirName();
75 if (!base::DirectoryExists(parent)) { 75 if (!base::DirectoryExists(parent)) {
76 if (!file_util::CreateDirectory(parent)) 76 if (!file_util::CreateDirectory(parent))
77 return ComponentUnpacker::kIoError; 77 return component_updater::kIoError;
78 } 78 }
79 79
80 ComponentUnpacker::Error run_result = DoRun(patcher, error); 80 component_updater::Error run_result = DoRun(patcher, error);
81 if (run_result != ComponentUnpacker::kNone) 81 if (run_result != component_updater::kNone)
82 return run_result; 82 return run_result;
83 83
84 return CheckHash(); 84 return CheckHash();
85 } 85 }
86 86
87 // Uses the hash as a checksum to confirm that the file now residing in the 87 // Uses the hash as a checksum to confirm that the file now residing in the
88 // output directory probably has the contents it should. 88 // output directory probably has the contents it should.
89 ComponentUnpacker::Error DeltaUpdateOp::CheckHash() { 89 component_updater::Error DeltaUpdateOp::CheckHash() {
90 std::vector<uint8> expected_hash; 90 std::vector<uint8> expected_hash;
91 if (!base::HexStringToBytes(output_sha256_, &expected_hash) || 91 if (!base::HexStringToBytes(output_sha256_, &expected_hash) ||
92 expected_hash.size() != crypto::kSHA256Length) 92 expected_hash.size() != crypto::kSHA256Length)
93 return ComponentUnpacker::kDeltaVerificationFailure; 93 return component_updater::kDeltaVerificationFailure;
94 94
95 base::MemoryMappedFile output_file_mmapped; 95 base::MemoryMappedFile output_file_mmapped;
96 if (!output_file_mmapped.Initialize(output_abs_path_)) 96 if (!output_file_mmapped.Initialize(output_abs_path_))
97 return ComponentUnpacker::kDeltaVerificationFailure; 97 return component_updater::kDeltaVerificationFailure;
98 98
99 uint8 actual_hash[crypto::kSHA256Length] = {0}; 99 uint8 actual_hash[crypto::kSHA256Length] = {0};
100 const scoped_ptr<SecureHash> hasher(SecureHash::Create(SecureHash::SHA256)); 100 const scoped_ptr<SecureHash> hasher(SecureHash::Create(SecureHash::SHA256));
101 hasher->Update(output_file_mmapped.data(), output_file_mmapped.length()); 101 hasher->Update(output_file_mmapped.data(), output_file_mmapped.length());
102 hasher->Finish(actual_hash, sizeof(actual_hash)); 102 hasher->Finish(actual_hash, sizeof(actual_hash));
103 if (memcmp(actual_hash, &expected_hash[0], sizeof(actual_hash))) 103 if (memcmp(actual_hash, &expected_hash[0], sizeof(actual_hash)))
104 return ComponentUnpacker::kDeltaVerificationFailure; 104 return component_updater::kDeltaVerificationFailure;
105 105
106 return ComponentUnpacker::kNone; 106 return component_updater::kNone;
107 } 107 }
108 108
109 DeltaUpdateOpCopy::DeltaUpdateOpCopy() {} 109 DeltaUpdateOpCopy::DeltaUpdateOpCopy() {}
110 110
111 ComponentUnpacker::Error DeltaUpdateOpCopy::DoParseArguments( 111 component_updater::Error DeltaUpdateOpCopy::DoParseArguments(
112 base::DictionaryValue* command_args, 112 base::DictionaryValue* command_args,
113 const base::FilePath& input_dir, 113 const base::FilePath& input_dir,
114 ComponentInstaller* installer) { 114 ComponentInstaller* installer) {
115 std::string input_rel_path; 115 std::string input_rel_path;
116 if (!command_args->GetString(kInput, &input_rel_path)) 116 if (!command_args->GetString(kInput, &input_rel_path))
117 return ComponentUnpacker::kDeltaBadCommands; 117 return component_updater::kDeltaBadCommands;
118 118
119 if (!installer->GetInstalledFile(input_rel_path, &input_abs_path_)) 119 if (!installer->GetInstalledFile(input_rel_path, &input_abs_path_))
120 return ComponentUnpacker::kDeltaMissingExistingFile; 120 return component_updater::kDeltaMissingExistingFile;
121 121
122 return ComponentUnpacker::kNone; 122 return component_updater::kNone;
123 } 123 }
124 124
125 ComponentUnpacker::Error DeltaUpdateOpCopy::DoRun(ComponentPatcher*, 125 component_updater::Error DeltaUpdateOpCopy::DoRun(ComponentPatcher*,
126 int* error) { 126 int* error) {
127 *error = 0; 127 *error = 0;
128 if (!base::CopyFile(input_abs_path_, output_abs_path_)) 128 if (!base::CopyFile(input_abs_path_, output_abs_path_))
129 return ComponentUnpacker::kDeltaOperationFailure; 129 return component_updater::kDeltaOperationFailure;
130 130
131 return ComponentUnpacker::kNone; 131 return component_updater::kNone;
132 } 132 }
133 133
134 DeltaUpdateOpCreate::DeltaUpdateOpCreate() {} 134 DeltaUpdateOpCreate::DeltaUpdateOpCreate() {}
135 135
136 ComponentUnpacker::Error DeltaUpdateOpCreate::DoParseArguments( 136 component_updater::Error DeltaUpdateOpCreate::DoParseArguments(
137 base::DictionaryValue* command_args, 137 base::DictionaryValue* command_args,
138 const base::FilePath& input_dir, 138 const base::FilePath& input_dir,
139 ComponentInstaller* installer) { 139 ComponentInstaller* installer) {
140 std::string patch_rel_path; 140 std::string patch_rel_path;
141 if (!command_args->GetString(kPatch, &patch_rel_path)) 141 if (!command_args->GetString(kPatch, &patch_rel_path))
142 return ComponentUnpacker::kDeltaBadCommands; 142 return component_updater::kDeltaBadCommands;
143 143
144 patch_abs_path_ = input_dir.Append( 144 patch_abs_path_ = input_dir.Append(
145 base::FilePath::FromUTF8Unsafe(patch_rel_path)); 145 base::FilePath::FromUTF8Unsafe(patch_rel_path));
146 146
147 return ComponentUnpacker::kNone; 147 return component_updater::kNone;
148 } 148 }
149 149
150 ComponentUnpacker::Error DeltaUpdateOpCreate::DoRun(ComponentPatcher*, 150 component_updater::Error DeltaUpdateOpCreate::DoRun(ComponentPatcher*,
151 int* error) { 151 int* error) {
152 *error = 0; 152 *error = 0;
153 if (!base::Move(patch_abs_path_, output_abs_path_)) 153 if (!base::Move(patch_abs_path_, output_abs_path_))
154 return ComponentUnpacker::kDeltaOperationFailure; 154 return component_updater::kDeltaOperationFailure;
155 155
156 return ComponentUnpacker::kNone; 156 return component_updater::kNone;
157 } 157 }
158 158
159 DeltaUpdateOpPatchBsdiff::DeltaUpdateOpPatchBsdiff() {} 159 DeltaUpdateOpPatchBsdiff::DeltaUpdateOpPatchBsdiff() {}
160 160
161 ComponentUnpacker::Error DeltaUpdateOpPatchBsdiff::DoParseArguments( 161 component_updater::Error DeltaUpdateOpPatchBsdiff::DoParseArguments(
162 base::DictionaryValue* command_args, 162 base::DictionaryValue* command_args,
163 const base::FilePath& input_dir, 163 const base::FilePath& input_dir,
164 ComponentInstaller* installer) { 164 ComponentInstaller* installer) {
165 std::string patch_rel_path; 165 std::string patch_rel_path;
166 std::string input_rel_path; 166 std::string input_rel_path;
167 if (!command_args->GetString(kPatch, &patch_rel_path) || 167 if (!command_args->GetString(kPatch, &patch_rel_path) ||
168 !command_args->GetString(kInput, &input_rel_path)) 168 !command_args->GetString(kInput, &input_rel_path))
169 return ComponentUnpacker::kDeltaBadCommands; 169 return component_updater::kDeltaBadCommands;
170 170
171 if (!installer->GetInstalledFile(input_rel_path, &input_abs_path_)) 171 if (!installer->GetInstalledFile(input_rel_path, &input_abs_path_))
172 return ComponentUnpacker::kDeltaMissingExistingFile; 172 return component_updater::kDeltaMissingExistingFile;
173 173
174 patch_abs_path_ = input_dir.Append( 174 patch_abs_path_ = input_dir.Append(
175 base::FilePath::FromUTF8Unsafe(patch_rel_path)); 175 base::FilePath::FromUTF8Unsafe(patch_rel_path));
176 176
177 return ComponentUnpacker::kNone; 177 return component_updater::kNone;
178 } 178 }
179 179
180 ComponentUnpacker::Error DeltaUpdateOpPatchBsdiff::DoRun( 180 component_updater::Error DeltaUpdateOpPatchBsdiff::DoRun(
181 ComponentPatcher* patcher, 181 ComponentPatcher* patcher,
182 int* error) { 182 int* error) {
183 *error = 0; 183 *error = 0;
184 return patcher->Patch(ComponentPatcher::kPatchTypeBsdiff, 184 return patcher->Patch(ComponentPatcher::kPatchTypeBsdiff,
185 input_abs_path_, 185 input_abs_path_,
186 patch_abs_path_, 186 patch_abs_path_,
187 output_abs_path_, 187 output_abs_path_,
188 error); 188 error);
189 } 189 }
190 190
191 DeltaUpdateOpPatchCourgette::DeltaUpdateOpPatchCourgette() {} 191 DeltaUpdateOpPatchCourgette::DeltaUpdateOpPatchCourgette() {}
192 192
193 ComponentUnpacker::Error DeltaUpdateOpPatchCourgette::DoParseArguments( 193 component_updater::Error DeltaUpdateOpPatchCourgette::DoParseArguments(
194 base::DictionaryValue* command_args, 194 base::DictionaryValue* command_args,
195 const base::FilePath& input_dir, 195 const base::FilePath& input_dir,
196 ComponentInstaller* installer) { 196 ComponentInstaller* installer) {
197 std::string patch_rel_path; 197 std::string patch_rel_path;
198 std::string input_rel_path; 198 std::string input_rel_path;
199 if (!command_args->GetString(kPatch, &patch_rel_path) || 199 if (!command_args->GetString(kPatch, &patch_rel_path) ||
200 !command_args->GetString(kInput, &input_rel_path)) 200 !command_args->GetString(kInput, &input_rel_path))
201 return ComponentUnpacker::kDeltaBadCommands; 201 return component_updater::kDeltaBadCommands;
202 202
203 if (!installer->GetInstalledFile(input_rel_path, &input_abs_path_)) 203 if (!installer->GetInstalledFile(input_rel_path, &input_abs_path_))
204 return ComponentUnpacker::kDeltaMissingExistingFile; 204 return component_updater::kDeltaMissingExistingFile;
205 205
206 patch_abs_path_ = input_dir.Append( 206 patch_abs_path_ = input_dir.Append(
207 base::FilePath::FromUTF8Unsafe(patch_rel_path)); 207 base::FilePath::FromUTF8Unsafe(patch_rel_path));
208 208
209 return ComponentUnpacker::kNone; 209 return component_updater::kNone;
210 } 210 }
211 211
212 ComponentUnpacker::Error DeltaUpdateOpPatchCourgette::DoRun( 212 component_updater::Error DeltaUpdateOpPatchCourgette::DoRun(
213 ComponentPatcher* patcher, 213 ComponentPatcher* patcher,
214 int* error) { 214 int* error) {
215 *error = 0; 215 *error = 0;
216 return patcher->Patch(ComponentPatcher::kPatchTypeCourgette, 216 return patcher->Patch(ComponentPatcher::kPatchTypeCourgette,
217 input_abs_path_, 217 input_abs_path_,
218 patch_abs_path_, 218 patch_abs_path_,
219 output_abs_path_, 219 output_abs_path_,
220 error); 220 error);
221 } 221 }
222 222
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698