blob: 81ee89ddb68792e93d5c0c5868e26786843089ae [file] [log] [blame]
// Copyright 2015 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_UPDATE_CLIENT_ACTION_UPDATE_H_
#define COMPONENTS_UPDATE_CLIENT_ACTION_UPDATE_H_
#include <map>
#include <string>
#include <vector>
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/threading/thread_checker.h"
#include "base/version.h"
#include "components/update_client/action.h"
#include "components/update_client/component_unpacker.h"
#include "components/update_client/crx_downloader.h"
#include "components/update_client/update_client.h"
#include "components/update_client/update_engine.h"
#include "url/gurl.h"
namespace update_client {
class UpdateChecker;
// Defines a template method design pattern for ActionUpdate. This class
// implements the common code for updating a single CRX using either
// a differential or a full update algorithm.
// TODO(sorin): further refactor this class to enforce that there is a 1:1
// relationship between one instance of this class and one CRX id. In other
// words, make the CRX id and its associated CrxUpdateItem data structure
// a member of this class instead of passing them around as function parameters.
class ActionUpdate : public Action, protected ActionImpl {
public:
ActionUpdate();
~ActionUpdate() override;
// Action overrides.
void Run(UpdateContext* update_context, Callback callback) override;
private:
virtual bool IsBackgroundDownload(const CrxUpdateItem* item) = 0;
virtual std::vector<GURL> GetUrls(const CrxUpdateItem* item) = 0;
virtual void OnDownloadStart(CrxUpdateItem* item) = 0;
virtual void OnDownloadSuccess(
CrxUpdateItem* item,
const CrxDownloader::Result& download_result) = 0;
virtual void OnDownloadError(
CrxUpdateItem* item,
const CrxDownloader::Result& download_result) = 0;
virtual void OnInstallStart(CrxUpdateItem* item) = 0;
virtual void OnInstallSuccess(CrxUpdateItem* item) = 0;
virtual void OnInstallError(CrxUpdateItem* item,
ComponentUnpacker::Error error,
int extended_error) = 0;
// Called when progress is being made downloading a CRX. The progress may
// not monotonically increase due to how the CRX downloader switches between
// different downloaders and fallback urls.
void DownloadProgress(const std::string& id,
const CrxDownloader::Result& download_result);
// Called when the CRX package has been downloaded to a temporary location.
void DownloadComplete(const std::string& id,
const CrxDownloader::Result& download_result);
void Install(const std::string& id, const base::FilePath& crx_path);
// TODO(sorin): refactor the public interface of ComponentUnpacker so
// that these calls can run on the main thread.
void DoInstallOnBlockingTaskRunner(UpdateContext* update_context,
CrxUpdateItem* item,
const base::FilePath& crx_path);
void EndUnpackingOnBlockingTaskRunner(UpdateContext* update_context,
CrxUpdateItem* item,
const base::FilePath& crx_path,
ComponentUnpacker::Error error,
int extended_error);
void DoneInstalling(const std::string& id,
ComponentUnpacker::Error error,
int extended_error);
// Downloads updates for one CRX id only.
scoped_ptr<CrxDownloader> crx_downloader_;
// Unpacks one CRX.
scoped_refptr<ComponentUnpacker> unpacker_;
DISALLOW_COPY_AND_ASSIGN(ActionUpdate);
};
class ActionUpdateDiff : public ActionUpdate {
public:
static scoped_ptr<Action> Create();
private:
ActionUpdateDiff();
~ActionUpdateDiff() override;
void TryUpdateFull();
// ActionUpdate overrides.
bool IsBackgroundDownload(const CrxUpdateItem* item) override;
std::vector<GURL> GetUrls(const CrxUpdateItem* item) override;
void OnDownloadStart(CrxUpdateItem* item) override;
void OnDownloadSuccess(CrxUpdateItem* item,
const CrxDownloader::Result& download_result) override;
void OnDownloadError(CrxUpdateItem* item,
const CrxDownloader::Result& download_result) override;
void OnInstallStart(CrxUpdateItem* item) override;
void OnInstallSuccess(CrxUpdateItem* item) override;
void OnInstallError(CrxUpdateItem* item,
ComponentUnpacker::Error error,
int extended_error) override;
DISALLOW_COPY_AND_ASSIGN(ActionUpdateDiff);
};
class ActionUpdateFull : public ActionUpdate {
public:
static scoped_ptr<Action> Create();
private:
ActionUpdateFull();
~ActionUpdateFull() override;
// ActionUpdate overrides.
bool IsBackgroundDownload(const CrxUpdateItem* item) override;
std::vector<GURL> GetUrls(const CrxUpdateItem* item) override;
void OnDownloadStart(CrxUpdateItem* item) override;
void OnDownloadSuccess(CrxUpdateItem* item,
const CrxDownloader::Result& download_result) override;
void OnDownloadError(CrxUpdateItem* item,
const CrxDownloader::Result& download_result) override;
void OnInstallStart(CrxUpdateItem* item) override;
void OnInstallSuccess(CrxUpdateItem* item) override;
void OnInstallError(CrxUpdateItem* item,
ComponentUnpacker::Error error,
int extended_error) override;
DISALLOW_COPY_AND_ASSIGN(ActionUpdateFull);
};
} // namespace update_client
#endif // COMPONENTS_UPDATE_CLIENT_ACTION_UPDATE_H_