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

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

Issue 420503002: Componentize component_updater: Decouple in-process DeltaUpdateOp from out-of-process version. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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 | Annotate | Revision Log
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 #ifndef CHROME_BROWSER_COMPONENT_UPDATER_COMPONENT_PATCHER_OPERATION_H_ 5 #ifndef CHROME_BROWSER_COMPONENT_UPDATER_COMPONENT_PATCHER_OPERATION_H_
6 #define CHROME_BROWSER_COMPONENT_UPDATER_COMPONENT_PATCHER_OPERATION_H_ 6 #define CHROME_BROWSER_COMPONENT_UPDATER_COMPONENT_PATCHER_OPERATION_H_
7 7
8 #include <string> 8 #include <string>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
11 #include "base/callback.h" 11 #include "base/callback.h"
12 #include "base/compiler_specific.h" 12 #include "base/compiler_specific.h"
13 #include "base/files/file_path.h" 13 #include "base/files/file_path.h"
14 #include "base/memory/ref_counted.h" 14 #include "base/memory/ref_counted.h"
15 #include "chrome/browser/component_updater/component_patcher.h"
16 #include "chrome/browser/component_updater/component_unpacker.h" 15 #include "chrome/browser/component_updater/component_unpacker.h"
17 #include "content/public/browser/utility_process_host_client.h"
18 16
19 namespace base { 17 namespace base {
20 class DictionaryValue; 18 class DictionaryValue;
21 } // namespace base 19 } // namespace base
22 20
23 namespace component_updater { 21 namespace component_updater {
24 22
23 const char kOp[] = "op";
24 const char kBsdiff[] = "bsdiff";
25 const char kCourgette[] = "courgette";
26 const char kInput[] = "input";
27 const char kPatch[] = "patch";
28
25 class ComponentInstaller; 29 class ComponentInstaller;
26 30
27 class DeltaUpdateOp : public base::RefCountedThreadSafe<DeltaUpdateOp> { 31 class DeltaUpdateOp : public base::RefCountedThreadSafe<DeltaUpdateOp> {
28 public: 32 public:
29 DeltaUpdateOp(); 33 DeltaUpdateOp();
30 34
31 // Parses, runs, and verifies the operation. Calls |callback| with the 35 // Parses, runs, and verifies the operation. Calls |callback| with the
32 // result of the operation. The callback is called using |task_runner|. 36 // result of the operation. The callback is called using |task_runner|.
33 void Run(const base::DictionaryValue* command_args, 37 void Run(const base::DictionaryValue* command_args,
34 const base::FilePath& input_dir, 38 const base::FilePath& input_dir,
35 const base::FilePath& unpack_dir, 39 const base::FilePath& unpack_dir,
36 ComponentInstaller* installer, 40 ComponentInstaller* installer,
37 bool in_process,
38 const ComponentUnpacker::Callback& callback, 41 const ComponentUnpacker::Callback& callback,
39 scoped_refptr<base::SequencedTaskRunner> task_runner); 42 scoped_refptr<base::SequencedTaskRunner> task_runner);
40 43
41 protected: 44 protected:
42 virtual ~DeltaUpdateOp(); 45 virtual ~DeltaUpdateOp();
43 46
44 bool InProcess();
45
46 scoped_refptr<base::SequencedTaskRunner> GetTaskRunner(); 47 scoped_refptr<base::SequencedTaskRunner> GetTaskRunner();
47 48
48 std::string output_sha256_; 49 std::string output_sha256_;
49 base::FilePath output_abs_path_; 50 base::FilePath output_abs_path_;
50 51
51 private: 52 private:
52 friend class base::RefCountedThreadSafe<DeltaUpdateOp>; 53 friend class base::RefCountedThreadSafe<DeltaUpdateOp>;
53 54
54 ComponentUnpacker::Error CheckHash(); 55 ComponentUnpacker::Error CheckHash();
55 56
56 // Subclasses must override DoParseArguments to parse operation-specific 57 // Subclasses must override DoParseArguments to parse operation-specific
57 // arguments. DoParseArguments returns DELTA_OK on success; any other code 58 // arguments. DoParseArguments returns DELTA_OK on success; any other code
58 // represents failure. 59 // represents failure.
59 virtual ComponentUnpacker::Error DoParseArguments( 60 virtual ComponentUnpacker::Error DoParseArguments(
60 const base::DictionaryValue* command_args, 61 const base::DictionaryValue* command_args,
61 const base::FilePath& input_dir, 62 const base::FilePath& input_dir,
62 ComponentInstaller* installer) = 0; 63 ComponentInstaller* installer) = 0;
63 64
64 // Subclasses must override DoRun to actually perform the patching operation. 65 // Subclasses must override DoRun to actually perform the patching operation.
65 // They must call the provided callback when they have completed their 66 // They must call the provided callback when they have completed their
66 // operations. In practice, the provided callback is always for "DoneRunning". 67 // operations. In practice, the provided callback is always for "DoneRunning".
67 virtual void DoRun(const ComponentUnpacker::Callback& callback) = 0; 68 virtual void DoRun(const ComponentUnpacker::Callback& callback) = 0;
68 69
69 // Callback given to subclasses for when they complete their operation. 70 // Callback given to subclasses for when they complete their operation.
70 // Validates the output, and posts a task to the patching operation's 71 // Validates the output, and posts a task to the patching operation's
71 // callback. 72 // callback.
72 void DoneRunning(ComponentUnpacker::Error error, int extended_error); 73 void DoneRunning(ComponentUnpacker::Error error, int extended_error);
73 74
74 bool in_process_;
75 ComponentUnpacker::Callback callback_; 75 ComponentUnpacker::Callback callback_;
76 scoped_refptr<base::SequencedTaskRunner> task_runner_; 76 scoped_refptr<base::SequencedTaskRunner> task_runner_;
77 77
78 DISALLOW_COPY_AND_ASSIGN(DeltaUpdateOp); 78 DISALLOW_COPY_AND_ASSIGN(DeltaUpdateOp);
79 }; 79 };
80 80
81 // A 'copy' operation takes a file currently residing on the disk and moves it 81 // A 'copy' operation takes a file currently residing on the disk and moves it
82 // into the unpacking directory: this represents "no change" in the file being 82 // into the unpacking directory: this represents "no change" in the file being
83 // installed. 83 // installed.
84 class DeltaUpdateOpCopy : public DeltaUpdateOp { 84 class DeltaUpdateOpCopy : public DeltaUpdateOp {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 const base::FilePath& input_dir, 118 const base::FilePath& input_dir,
119 ComponentInstaller* installer) OVERRIDE; 119 ComponentInstaller* installer) OVERRIDE;
120 120
121 virtual void DoRun(const ComponentUnpacker::Callback& callback) OVERRIDE; 121 virtual void DoRun(const ComponentUnpacker::Callback& callback) OVERRIDE;
122 122
123 base::FilePath patch_abs_path_; 123 base::FilePath patch_abs_path_;
124 124
125 DISALLOW_COPY_AND_ASSIGN(DeltaUpdateOpCreate); 125 DISALLOW_COPY_AND_ASSIGN(DeltaUpdateOpCreate);
126 }; 126 };
127 127
128 class DeltaUpdateOpPatchStrategy { 128 // An interface an embedder may fulfill to enable out-of-process patching.
129 class OutOfProcessPatcher
130 : public base::RefCountedThreadSafe<OutOfProcessPatcher> {
129 public: 131 public:
130 virtual ~DeltaUpdateOpPatchStrategy(); 132 virtual void Patch(const std::string& operation,
133 scoped_refptr<base::SequencedTaskRunner> task_runner,
134 base::FilePath& input_abs_path,
135 base::FilePath& patch_abs_path,
136 base::FilePath& output_abs_path,
137 base::Callback<void(int result)> callback) = 0;
131 138
132 // Returns an integer to add to error codes to disambiguate their source. 139 protected:
133 virtual int GetErrorOffset() const = 0; 140 friend class base::RefCountedThreadSafe<OutOfProcessPatcher>;
134 141
135 // Returns the "error code" that is expected in the successful install case. 142 virtual ~OutOfProcessPatcher() {}
136 virtual int GetSuccessCode() const = 0;
137
138 // Returns an IPC message that will start patching if it is sent to a
139 // UtilityProcessClient.
140 virtual scoped_ptr<IPC::Message> GetPatchMessage(
141 base::FilePath input_abs_path,
142 base::FilePath patch_abs_path,
143 base::FilePath output_abs_path) = 0;
144
145 // Does the actual patching operation, and returns an error code.
146 virtual int Patch(base::FilePath input_abs_path,
147 base::FilePath patch_abs_path,
148 base::FilePath output_abs_path) = 0;
149 };
150
151 class DeltaUpdateOpPatch;
152
153 class DeltaUpdateOpPatchHost : public content::UtilityProcessHostClient {
154 public:
155 DeltaUpdateOpPatchHost(scoped_refptr<DeltaUpdateOpPatch> patcher,
156 scoped_refptr<base::SequencedTaskRunner> task_runner);
157
158 void StartProcess(scoped_ptr<IPC::Message> message);
159
160 private:
161 virtual ~DeltaUpdateOpPatchHost();
162
163 void OnPatchSucceeded();
164
165 void OnPatchFailed(int error_code);
166
167 // Overrides of content::UtilityProcessHostClient.
168 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
169
170 virtual void OnProcessCrashed(int exit_code) OVERRIDE;
171
172 scoped_refptr<DeltaUpdateOpPatch> patcher_;
173 scoped_refptr<base::SequencedTaskRunner> task_runner_;
174 }; 143 };
175 144
176 // Both 'bsdiff' and 'courgette' operations take an existing file on disk, 145 // Both 'bsdiff' and 'courgette' operations take an existing file on disk,
177 // and a bsdiff- or Courgette-format patch file provided in the delta update 146 // and a bsdiff- or Courgette-format patch file provided in the delta update
178 // package, and run bsdiff or Courgette to construct an output file in the 147 // package, and run bsdiff or Courgette to construct an output file in the
179 // unpacking directory. 148 // unpacking directory.
180 class DeltaUpdateOpPatch : public DeltaUpdateOp { 149 class DeltaUpdateOpPatch : public DeltaUpdateOp {
181 public: 150 public:
182 explicit DeltaUpdateOpPatch(scoped_ptr<DeltaUpdateOpPatchStrategy> strategy); 151 // |out_of_process_patcher| may be NULL.
183 152 explicit DeltaUpdateOpPatch(
Sorin Jianu 2014/07/31 23:29:15 In general, explicit is only meaningful for ctors
tommycli 2014/08/04 20:25:13 No, I just forgot to change this. Thanks for assum
184 void DonePatching(ComponentUnpacker::Error error, int error_code); 153 const std::string& operation,
154 scoped_refptr<OutOfProcessPatcher> out_of_process_patcher);
185 155
186 private: 156 private:
187 virtual ~DeltaUpdateOpPatch(); 157 virtual ~DeltaUpdateOpPatch();
188 158
189 // Overrides of DeltaUpdateOp. 159 // Overrides of DeltaUpdateOp.
190 virtual ComponentUnpacker::Error DoParseArguments( 160 virtual ComponentUnpacker::Error DoParseArguments(
191 const base::DictionaryValue* command_args, 161 const base::DictionaryValue* command_args,
192 const base::FilePath& input_dir, 162 const base::FilePath& input_dir,
193 ComponentInstaller* installer) OVERRIDE; 163 ComponentInstaller* installer) OVERRIDE;
194 164
195 virtual void DoRun(const ComponentUnpacker::Callback& callback) OVERRIDE; 165 virtual void DoRun(const ComponentUnpacker::Callback& callback) OVERRIDE;
196 166
197 ComponentUnpacker::Callback callback_; 167 // |success_code| is the code that indicates a successful patch.
168 // |result| is the code the patching operation returned.
169 void DonePatching(const ComponentUnpacker::Callback& callback, int result);
170
171 std::string operation_;
172 scoped_refptr<OutOfProcessPatcher> out_of_process_patcher_;
198 base::FilePath patch_abs_path_; 173 base::FilePath patch_abs_path_;
199 base::FilePath input_abs_path_; 174 base::FilePath input_abs_path_;
200 scoped_ptr<DeltaUpdateOpPatchStrategy> strategy_;
201 scoped_refptr<DeltaUpdateOpPatchHost> host_;
202 175
203 DISALLOW_COPY_AND_ASSIGN(DeltaUpdateOpPatch); 176 DISALLOW_COPY_AND_ASSIGN(DeltaUpdateOpPatch);
204 }; 177 };
205 178
206 // Factory functions to create DeltaUpdateOp instances. 179 DeltaUpdateOp* CreateDeltaUpdateOp(
207 DeltaUpdateOp* CreateDeltaUpdateOp(const base::DictionaryValue& command); 180 const std::string& operation,
208 181 scoped_refptr<OutOfProcessPatcher> out_of_process_patcher);
209 DeltaUpdateOp* CreateDeltaUpdateOp(const std::string& operation);
210 182
211 } // namespace component_updater 183 } // namespace component_updater
212 184
213 #endif // CHROME_BROWSER_COMPONENT_UPDATER_COMPONENT_PATCHER_OPERATION_H_ 185 #endif // CHROME_BROWSER_COMPONENT_UPDATER_COMPONENT_PATCHER_OPERATION_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698