1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
|
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_COMPONENT_UPDATER_COMPONENT_PATCHER_OPERATION_H_
#define COMPONENTS_COMPONENT_UPDATER_COMPONENT_PATCHER_OPERATION_H_
#include <string>
#include "base/callback.h"
#include "base/compiler_specific.h"
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "components/component_updater/component_unpacker.h"
namespace base {
class DictionaryValue;
} // namespace base
namespace component_updater {
extern const char kOp[];
extern const char kBsdiff[];
extern const char kCourgette[];
extern const char kInput[];
extern const char kPatch[];
class ComponentInstaller;
class DeltaUpdateOp : public base::RefCountedThreadSafe<DeltaUpdateOp> {
public:
DeltaUpdateOp();
// Parses, runs, and verifies the operation. Calls |callback| with the
// result of the operation. The callback is called using |task_runner|.
void Run(const base::DictionaryValue* command_args,
const base::FilePath& input_dir,
const base::FilePath& unpack_dir,
ComponentInstaller* installer,
const ComponentUnpacker::Callback& callback,
scoped_refptr<base::SequencedTaskRunner> task_runner);
protected:
virtual ~DeltaUpdateOp();
scoped_refptr<base::SequencedTaskRunner> GetTaskRunner();
std::string output_sha256_;
base::FilePath output_abs_path_;
private:
friend class base::RefCountedThreadSafe<DeltaUpdateOp>;
ComponentUnpacker::Error CheckHash();
// Subclasses must override DoParseArguments to parse operation-specific
// arguments. DoParseArguments returns DELTA_OK on success; any other code
// represents failure.
virtual ComponentUnpacker::Error DoParseArguments(
const base::DictionaryValue* command_args,
const base::FilePath& input_dir,
ComponentInstaller* installer) = 0;
// Subclasses must override DoRun to actually perform the patching operation.
// They must call the provided callback when they have completed their
// operations. In practice, the provided callback is always for "DoneRunning".
virtual void DoRun(const ComponentUnpacker::Callback& callback) = 0;
// Callback given to subclasses for when they complete their operation.
// Validates the output, and posts a task to the patching operation's
// callback.
void DoneRunning(ComponentUnpacker::Error error, int extended_error);
ComponentUnpacker::Callback callback_;
scoped_refptr<base::SequencedTaskRunner> task_runner_;
DISALLOW_COPY_AND_ASSIGN(DeltaUpdateOp);
};
// A 'copy' operation takes a file currently residing on the disk and moves it
// into the unpacking directory: this represents "no change" in the file being
// installed.
class DeltaUpdateOpCopy : public DeltaUpdateOp {
public:
DeltaUpdateOpCopy();
private:
virtual ~DeltaUpdateOpCopy();
// Overrides of DeltaUpdateOp.
virtual ComponentUnpacker::Error DoParseArguments(
const base::DictionaryValue* command_args,
const base::FilePath& input_dir,
ComponentInstaller* installer) OVERRIDE;
virtual void DoRun(const ComponentUnpacker::Callback& callback) OVERRIDE;
base::FilePath input_abs_path_;
DISALLOW_COPY_AND_ASSIGN(DeltaUpdateOpCopy);
};
// A 'create' operation takes a full file that was sent in the delta update
// archive and moves it into the unpacking directory: this represents the
// addition of a new file, or a file so different that no bandwidth could be
// saved by transmitting a differential update.
class DeltaUpdateOpCreate : public DeltaUpdateOp {
public:
DeltaUpdateOpCreate();
private:
virtual ~DeltaUpdateOpCreate();
// Overrides of DeltaUpdateOp.
virtual ComponentUnpacker::Error DoParseArguments(
const base::DictionaryValue* command_args,
const base::FilePath& input_dir,
ComponentInstaller* installer) OVERRIDE;
virtual void DoRun(const ComponentUnpacker::Callback& callback) OVERRIDE;
base::FilePath patch_abs_path_;
DISALLOW_COPY_AND_ASSIGN(DeltaUpdateOpCreate);
};
// An interface an embedder may fulfill to enable out-of-process patching.
class OutOfProcessPatcher
: public base::RefCountedThreadSafe<OutOfProcessPatcher> {
public:
virtual void Patch(const std::string& operation,
scoped_refptr<base::SequencedTaskRunner> task_runner,
const base::FilePath& input_abs_path,
const base::FilePath& patch_abs_path,
const base::FilePath& output_abs_path,
base::Callback<void(int result)> callback) = 0;
protected:
friend class base::RefCountedThreadSafe<OutOfProcessPatcher>;
virtual ~OutOfProcessPatcher() {}
};
// Both 'bsdiff' and 'courgette' operations take an existing file on disk,
// and a bsdiff- or Courgette-format patch file provided in the delta update
// package, and run bsdiff or Courgette to construct an output file in the
// unpacking directory.
class DeltaUpdateOpPatch : public DeltaUpdateOp {
public:
// |out_of_process_patcher| may be NULL.
DeltaUpdateOpPatch(const std::string& operation,
scoped_refptr<OutOfProcessPatcher> out_of_process_patcher);
private:
virtual ~DeltaUpdateOpPatch();
// Overrides of DeltaUpdateOp.
virtual ComponentUnpacker::Error DoParseArguments(
const base::DictionaryValue* command_args,
const base::FilePath& input_dir,
ComponentInstaller* installer) OVERRIDE;
virtual void DoRun(const ComponentUnpacker::Callback& callback) OVERRIDE;
// |success_code| is the code that indicates a successful patch.
// |result| is the code the patching operation returned.
void DonePatching(const ComponentUnpacker::Callback& callback, int result);
std::string operation_;
scoped_refptr<OutOfProcessPatcher> out_of_process_patcher_;
base::FilePath patch_abs_path_;
base::FilePath input_abs_path_;
DISALLOW_COPY_AND_ASSIGN(DeltaUpdateOpPatch);
};
DeltaUpdateOp* CreateDeltaUpdateOp(
const std::string& operation,
scoped_refptr<OutOfProcessPatcher> out_of_process_patcher);
} // namespace component_updater
#endif // COMPONENTS_COMPONENT_UPDATER_COMPONENT_PATCHER_OPERATION_H_
|