1 // Copyright (c) 2012 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 CHROMEOS_DBUS_UPDATE_ENGINE_CLIENT_H_ 6 #define CHROMEOS_DBUS_UPDATE_ENGINE_CLIENT_H_ 7 8 #include "base/callback.h" 9 #include "base/observer_list.h" 10 #include "chromeos/chromeos_export.h" 11 #include "chromeos/dbus/dbus_client.h" 12 #include "chromeos/dbus/dbus_client_implementation_type.h" 13 14 #include <string> 15 16 namespace chromeos { 17 18 // UpdateEngineClient is used to communicate with the update engine. 19 class CHROMEOS_EXPORT UpdateEngineClient : public DBusClient { 20 public: 21 // Edges for state machine 22 // IDLE->CHECKING_FOR_UPDATE 23 // CHECKING_FOR_UPDATE->IDLE 24 // CHECKING_FOR_UPDATE->UPDATE_AVAILABLE 25 // ... 26 // FINALIZING->UPDATE_NEED_REBOOT 27 // Any state can transition to REPORTING_ERROR_EVENT and then on to IDLE. 28 enum UpdateStatusOperation { 29 UPDATE_STATUS_ERROR = -1, 30 UPDATE_STATUS_IDLE = 0, 31 UPDATE_STATUS_CHECKING_FOR_UPDATE, 32 UPDATE_STATUS_UPDATE_AVAILABLE, 33 UPDATE_STATUS_DOWNLOADING, 34 UPDATE_STATUS_VERIFYING, 35 UPDATE_STATUS_FINALIZING, 36 UPDATE_STATUS_UPDATED_NEED_REBOOT, 37 UPDATE_STATUS_REPORTING_ERROR_EVENT, 38 UPDATE_STATUS_ATTEMPTING_ROLLBACK 39 }; 40 41 // The status of the ongoing update attempt. 42 struct Status { 43 Status() : status(UPDATE_STATUS_IDLE), 44 download_progress(0.0), 45 last_checked_time(0), 46 new_size(0) { 47 } 48 49 UpdateStatusOperation status; 50 double download_progress; // 0.0 - 1.0 51 int64_t last_checked_time; // As reported by std::time(). 52 std::string new_version; 53 int64_t new_size; // Valid during DOWNLOADING, in bytes. 54 }; 55 56 // The result code used for RequestUpdateCheck(). 57 enum UpdateCheckResult { 58 UPDATE_RESULT_SUCCESS, 59 UPDATE_RESULT_FAILED, 60 UPDATE_RESULT_NOTIMPLEMENTED, 61 }; 62 63 // Interface for observing changes from the update engine. 64 class Observer { 65 public: 66 // Called when the status is updated. 67 virtual void UpdateStatusChanged(const Status& status) {} 68 }; 69 70 virtual ~UpdateEngineClient(); 71 72 // Adds and removes the observer. 73 virtual void AddObserver(Observer* observer) = 0; 74 virtual void RemoveObserver(Observer* observer) = 0; 75 // Returns true if this object has the given observer. 76 virtual bool HasObserver(Observer* observer) = 0; 77 78 // Called once RequestUpdateCheck() is complete. Takes one parameter: 79 // - UpdateCheckResult: the result of the update check. 80 typedef base::Callback<void(UpdateCheckResult)> UpdateCheckCallback; 81 82 // Requests an update check and calls |callback| when completed. 83 virtual void RequestUpdateCheck(const UpdateCheckCallback& callback) = 0; 84 85 // Reboots if update has been performed. 86 virtual void RebootAfterUpdate() = 0; 87 88 // Starts Rollback. 89 virtual void Rollback() = 0; 90 91 // Called once CanRollbackCheck() is complete. Takes one parameter: 92 // - bool: the result of the rollback availability check. 93 typedef base::Callback<void(bool can_rollback)> RollbackCheckCallback; 94 95 // Checks if Rollback is available and calls |callback| when completed. 96 virtual void CanRollbackCheck( 97 const RollbackCheckCallback& callback) = 0; 98 99 // Called once GetChannel() is complete. Takes one parameter; 100 // - string: the channel name like "beta-channel". 101 typedef base::Callback<void(const std::string& channel_name)> 102 GetChannelCallback; 103 104 // Returns the last status the object received from the update engine. 105 // 106 // Ideally, the D-Bus client should be state-less, but there are clients 107 // that need this information. 108 virtual Status GetLastStatus() = 0; 109 110 // Changes the current channel of the device to the target 111 // channel. If the target channel is a less stable channel than the 112 // current channel, then the channel change happens immediately (at 113 // the next update check). If the target channel is a more stable 114 // channel, then if |is_powerwash_allowed| is set to true, then also 115 // the change happens immediately but with a powerwash if 116 // required. Otherwise, the change takes effect eventually (when the 117 // version on the target channel goes above the version number of 118 // what the device currently has). |target_channel| should look like 119 // "dev-channel", "beta-channel" or "stable-channel". 120 virtual void SetChannel(const std::string& target_channel, 121 bool is_powerwash_allowed) = 0; 122 123 // If |get_current_channel| is set to true, calls |callback| with 124 // the name of the channel that the device is currently 125 // on. Otherwise, it calls it with the name of the channel the 126 // device is supposed to be (in case of a pending channel 127 // change). On error, calls |callback| with an empty string. 128 virtual void GetChannel(bool get_current_channel, 129 const GetChannelCallback& callback) = 0; 130 131 // Returns an empty UpdateCheckCallback that does nothing. 132 static UpdateCheckCallback EmptyUpdateCheckCallback(); 133 134 // Creates the instance. 135 static UpdateEngineClient* Create(DBusClientImplementationType type); 136 137 protected: 138 // Create() should be used instead. 139 UpdateEngineClient(); 140 141 private: 142 DISALLOW_COPY_AND_ASSIGN(UpdateEngineClient); 143 }; 144 145 } // namespace chromeos 146 147 #endif // CHROMEOS_DBUS_UPDATE_ENGINE_CLIENT_H_ 148