1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_CHROMEOS_CROS_UPDATE_LIBRARY_H_
6#define CHROME_BROWSER_CHROMEOS_CROS_UPDATE_LIBRARY_H_
7#pragma once
8
9#include <string>
10
11#include "base/memory/singleton.h"
12#include "base/observer_list.h"
13#include "base/time.h"
14#include "third_party/cros/chromeos_update_engine.h"
15
16namespace chromeos {
17
18// This interface defines interaction with the ChromeOS update library APIs.
19// Classes can add themselves as observers. Users can get an instance of this
20// library class like this: chromeos::CrosLibrary::Get()->GetUpdateLibrary()
21
22class UpdateLibrary {
23 public:
24  // TODO(seanparent): Should make the UpdateProgress type copyable.
25  // We need to copy it to bind it for a deferred notification.
26  // Modifying the cros library just for that, for a single use case,
27  // isn't worth it. Instead we define this a local Status struct that
28  // is copyable.
29
30  struct Status {
31    Status()
32        : status(UPDATE_STATUS_IDLE),
33          download_progress(0.0),
34          last_checked_time(0),
35          new_size(0) {
36    }
37
38    explicit Status(const UpdateProgress& x) :
39        status(x.status_),
40        download_progress(x.download_progress_),
41        last_checked_time(x.last_checked_time_),
42        new_version(x.new_version_),
43        new_size(x.new_size_) {
44    }
45
46    UpdateStatusOperation status;
47    double download_progress;  // 0.0 - 1.0
48    int64_t last_checked_time;  // As reported by std::time().
49    std::string new_version;
50    int64_t new_size;  // Valid during DOWNLOADING, in bytes.
51  };
52
53  class Observer {
54   public:
55    virtual ~Observer() { }
56    virtual void UpdateStatusChanged(UpdateLibrary* library) = 0;
57  };
58
59//  static UpdateLibrary* GetStubImplementation();
60
61  virtual ~UpdateLibrary() {}
62  virtual void AddObserver(Observer* observer) = 0;
63  virtual void RemoveObserver(Observer* observer) = 0;
64  virtual bool HasObserver(Observer* observer) = 0;
65
66  // Requests an update check and calls |callback| when completed.
67  virtual void RequestUpdateCheck(chromeos::UpdateCallback callback,
68                                  void* user_data) = 0;
69
70  // Reboots if update has been performed.
71  virtual bool RebootAfterUpdate() = 0;
72
73  // Sets the release track (channel). |track| should look like
74  // "beta-channel" and "dev-channel". Returns true on success.
75  virtual void SetReleaseTrack(const std::string& track) = 0;
76
77  // Calls |callback| with the release track (channel). On error, calls
78  // |callback| with NULL.
79  virtual void GetReleaseTrack(chromeos::UpdateTrackCallback callback,
80                               void* user_data) = 0;
81
82  virtual const Status& status() const = 0;
83
84  // Factory function, creates a new instance and returns ownership.
85  // For normal usage, access the singleton via CrosLibrary::Get().
86  static UpdateLibrary* GetImpl(bool stub);
87};
88
89}  // namespace chromeos
90
91#endif  // CHROME_BROWSER_CHROMEOS_CROS_UPDATE_LIBRARY_H_
92