blob: c83971cc0cbb598ea0f83570948e27e96581e80b [file] [log] [blame]
Torne (Richard Coles)03b57e02014-08-28 12:05:23 +01001// Copyright 2014 The Chromium Authors. All rights reserved.
Ben Murdocheb525c52013-07-10 11:40:50 +01002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Component updates can be either differential updates or full updates.
6// Full updates come in CRX format; differential updates come in CRX-style
7// archives, but have a different magic number. They contain "commands.json", a
8// list of commands for the patcher to follow. The patcher uses these commands,
9// the other files in the archive, and the files from the existing installation
10// of the component to create the contents of a full update, which is then
11// installed normally.
12// Component updates are specified by the 'codebasediff' attribute of an
13// updatecheck response:
14// <updatecheck codebase="http://example.com/extension_1.2.3.4.crx"
15// hash="12345" size="9854" status="ok" version="1.2.3.4"
16// prodversionmin="2.0.143.0"
17// codebasediff="http://example.com/diff_1.2.3.4.crx"
18// hashdiff="123" sizediff="101"
19// fp="1.123" />
20// The component updater will attempt a differential update if it is available
21// and allowed to, and fall back to a full update if it fails.
22//
23// After installation (diff or full), the component updater records "fp", the
24// fingerprint of the installed files, to later identify the existing files to
25// the server so that a proper differential update can be provided next cycle.
26
Torne (Richard Coles)03b57e02014-08-28 12:05:23 +010027#ifndef COMPONENTS_COMPONENT_UPDATER_COMPONENT_PATCHER_H_
28#define COMPONENTS_COMPONENT_UPDATER_COMPONENT_PATCHER_H_
Ben Murdocheb525c52013-07-10 11:40:50 +010029
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000030#include "base/callback_forward.h"
Primiano Tucci1320f922014-09-30 14:45:55 +010031#include "base/macros.h"
Ben Murdocheffb81e2014-03-31 11:51:25 +010032#include "base/memory/ref_counted.h"
Torne (Richard Coles)5f1c9432014-08-12 13:47:38 +010033#include "base/memory/scoped_ptr.h"
Ben Murdocheffb81e2014-03-31 11:51:25 +010034#include "base/values.h"
Torne (Richard Coles)03b57e02014-08-28 12:05:23 +010035#include "components/component_updater/component_unpacker.h"
Ben Murdocheb525c52013-07-10 11:40:50 +010036
37namespace base {
38class FilePath;
39}
40
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000041namespace component_updater {
42
Ben Murdocheb525c52013-07-10 11:40:50 +010043class ComponentInstaller;
Ben Murdocheffb81e2014-03-31 11:51:25 +010044class DeltaUpdateOp;
Torne (Richard Coles)5f1c9432014-08-12 13:47:38 +010045class OutOfProcessPatcher;
Ben Murdocheb525c52013-07-10 11:40:50 +010046
Ben Murdocheffb81e2014-03-31 11:51:25 +010047// The type of a patch file.
48enum PatchType {
49 kPatchTypeUnknown,
50 kPatchTypeCourgette,
51 kPatchTypeBsdiff,
Ben Murdocheb525c52013-07-10 11:40:50 +010052};
53
Ben Murdocheffb81e2014-03-31 11:51:25 +010054// Encapsulates a task for applying a differential update to a component.
55class ComponentPatcher : public base::RefCountedThreadSafe<ComponentPatcher> {
Ben Murdocheb525c52013-07-10 11:40:50 +010056 public:
Ben Murdocheffb81e2014-03-31 11:51:25 +010057 // Takes an unpacked differential CRX (|input_dir|) and a component installer,
58 // and sets up the class to create a new (non-differential) unpacked CRX.
59 // If |in_process| is true, patching will be done completely within the
60 // existing process. Otherwise, some steps of patching may be done
61 // out-of-process.
62 ComponentPatcher(const base::FilePath& input_dir,
63 const base::FilePath& unpack_dir,
64 ComponentInstaller* installer,
Torne (Richard Coles)5f1c9432014-08-12 13:47:38 +010065 scoped_refptr<OutOfProcessPatcher> out_of_process_patcher,
Ben Murdocheffb81e2014-03-31 11:51:25 +010066 scoped_refptr<base::SequencedTaskRunner> task_runner);
67
68 // Starts patching files. This member function returns immediately, after
69 // posting a task to do the patching. When patching has been completed,
70 // |callback| will be called with the error codes if any error codes were
71 // encountered.
72 void Start(const ComponentUnpacker::Callback& callback);
73
Ben Murdocheb525c52013-07-10 11:40:50 +010074 private:
Ben Murdocheffb81e2014-03-31 11:51:25 +010075 friend class base::RefCountedThreadSafe<ComponentPatcher>;
Ben Murdocheb525c52013-07-10 11:40:50 +010076
Ben Murdocheffb81e2014-03-31 11:51:25 +010077 virtual ~ComponentPatcher();
78
79 void StartPatching();
80
81 void PatchNextFile();
82
83 void DonePatchingFile(ComponentUnpacker::Error error, int extended_error);
84
85 void DonePatching(ComponentUnpacker::Error error, int extended_error);
86
87 const base::FilePath input_dir_;
88 const base::FilePath unpack_dir_;
89 ComponentInstaller* const installer_;
Torne (Richard Coles)5f1c9432014-08-12 13:47:38 +010090 scoped_refptr<OutOfProcessPatcher> out_of_process_patcher_;
Ben Murdocheffb81e2014-03-31 11:51:25 +010091 ComponentUnpacker::Callback callback_;
92 scoped_ptr<base::ListValue> commands_;
93 base::ValueVector::const_iterator next_command_;
94 scoped_refptr<DeltaUpdateOp> current_operation_;
95 scoped_refptr<base::SequencedTaskRunner> task_runner_;
96
97 DISALLOW_COPY_AND_ASSIGN(ComponentPatcher);
98};
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000099
100} // namespace component_updater
Ben Murdocheb525c52013-07-10 11:40:50 +0100101
Torne (Richard Coles)03b57e02014-08-28 12:05:23 +0100102#endif // COMPONENTS_COMPONENT_UPDATER_COMPONENT_PATCHER_H_