update_engine: Add newer DBus method and signal for GetStatus
The current GetStatus function is pretty non-extendable and there has
been use cases where we wanted to add arguments to it but it was quite
hard to do specially changes in Chrome.
This CL adds a new DBus Method GetStatusAdvanced and Signal
UpdateStatusAdvanced which use a protobuf for communicating dbus
messages. This allows us to extend the protobuf without much effort in
the future.
BUG=chromium:977320
TEST=unittests, precq
Cq-Depend: chromium:1672684, chrome-internal:1424559
Change-Id: Ia93ed189e7561ca18c63b5ded81826bc9b1cff12
Reviewed-on: https://chromium-review.googlesource.com/1669974
Tested-by: Amin Hassani <ahassani@chromium.org>
Commit-Ready: Amin Hassani <ahassani@chromium.org>
Legacy-Commit-Queue: Commit Bot <commit-bot@chromium.org>
Reviewed-by: Amin Hassani <ahassani@chromium.org>
diff --git a/client_library/client_dbus.cc b/client_library/client_dbus.cc
index 809ad13..48a563b 100644
--- a/client_library/client_dbus.cc
+++ b/client_library/client_dbus.cc
@@ -45,6 +45,19 @@
namespace internal {
+namespace {
+// This converts the status from Protobuf |StatusResult| to The internal
+// |UpdateEngineStatus| struct.
+bool ConvertToUpdateEngineStatus(const StatusResult& status,
+ UpdateEngineStatus* out_status) {
+ out_status->last_checked_time = status.last_checked_time();
+ out_status->progress = status.progress();
+ out_status->new_version = status.new_version();
+ out_status->new_size_bytes = status.new_size();
+ return StringToUpdateStatus(status.current_operation(), &out_status->status);
+}
+} // namespace
+
bool DBusUpdateEngineClient::Init() {
Bus::Options options;
options.bus_type = Bus::SYSTEM;
@@ -93,18 +106,25 @@
UpdateStatus* out_update_status,
string* out_new_version,
int64_t* out_new_size) const {
- string status_as_string;
- const bool success = proxy_->GetStatus(out_last_checked_time,
- out_progress,
- &status_as_string,
- out_new_version,
- out_new_size,
- nullptr);
- if (!success) {
+ StatusResult status;
+ if (!proxy_->GetStatusAdvanced(&status, nullptr)) {
return false;
}
- return StringToUpdateStatus(status_as_string, out_update_status);
+ *out_last_checked_time = status.last_checked_time();
+ *out_progress = status.progress();
+ *out_new_version = status.new_version();
+ *out_new_size = status.new_size();
+ return StringToUpdateStatus(status.current_operation(), out_update_status);
+}
+
+bool DBusUpdateEngineClient::GetStatus(UpdateEngineStatus* out_status) const {
+ StatusResult status;
+ if (!proxy_->GetStatusAdvanced(&status, nullptr)) {
+ return false;
+ }
+
+ return ConvertToUpdateEngineStatus(status, out_status);
}
bool DBusUpdateEngineClient::SetCohortHint(const string& cohort_hint) {
@@ -173,40 +193,25 @@
void DBusUpdateEngineClient::StatusUpdateHandlersRegistered(
StatusUpdateHandler* handler) const {
- int64_t last_checked_time;
- double progress;
- UpdateStatus update_status;
- string new_version;
- int64_t new_size;
-
- if (!GetStatus(&last_checked_time,
- &progress,
- &update_status,
- &new_version,
- &new_size)) {
+ UpdateEngineStatus status;
+ if (!GetStatus(&status)) {
handler->IPCError("Could not query current status");
return;
}
std::vector<update_engine::StatusUpdateHandler*> just_handler = {handler};
for (auto h : handler ? just_handler : handlers_) {
- h->HandleStatusUpdate(
- last_checked_time, progress, update_status, new_version, new_size);
+ h->HandleStatusUpdate(status);
}
}
void DBusUpdateEngineClient::RunStatusUpdateHandlers(
- int64_t last_checked_time,
- double progress,
- const string& current_operation,
- const string& new_version,
- int64_t new_size) {
- UpdateStatus status;
- StringToUpdateStatus(current_operation, &status);
+ const StatusResult& status) {
+ UpdateEngineStatus ue_status;
+ ConvertToUpdateEngineStatus(status, &ue_status);
for (auto handler : handlers_) {
- handler->HandleStatusUpdate(
- last_checked_time, progress, status, new_version, new_size);
+ handler->HandleStatusUpdate(ue_status);
}
}
@@ -235,7 +240,7 @@
return true;
}
- proxy_->RegisterStatusUpdateSignalHandler(
+ proxy_->RegisterStatusUpdateAdvancedSignalHandler(
base::Bind(&DBusUpdateEngineClient::RunStatusUpdateHandlers,
base::Unretained(this)),
base::Bind(&DBusUpdateEngineClient::DBusStatusHandlersRegistered,
diff --git a/client_library/client_dbus.h b/client_library/client_dbus.h
index a186d45..1b127e3 100644
--- a/client_library/client_dbus.h
+++ b/client_library/client_dbus.h
@@ -23,6 +23,7 @@
#include <vector>
#include <base/macros.h>
+#include <update_engine/proto_bindings/update_engine.pb.h>
#include "update_engine/client_library/include/update_engine/client.h"
#include "update_engine/dbus-proxies.h"
@@ -50,6 +51,8 @@
std::string* out_new_version,
int64_t* out_new_size) const override;
+ bool GetStatus(UpdateEngineStatus* out_status) const override;
+
bool SetCohortHint(const std::string& cohort_hint) override;
bool GetCohortHint(std::string* cohort_hint) const override;
@@ -93,11 +96,7 @@
// registered handlers receive the event.
void StatusUpdateHandlersRegistered(StatusUpdateHandler* handler) const;
- void RunStatusUpdateHandlers(int64_t last_checked_time,
- double progress,
- const std::string& current_operation,
- const std::string& new_version,
- int64_t new_size);
+ void RunStatusUpdateHandlers(const StatusResult& status);
std::unique_ptr<org::chromium::UpdateEngineInterfaceProxy> proxy_;
std::vector<update_engine::StatusUpdateHandler*> handlers_;
diff --git a/client_library/include/update_engine/client.h b/client_library/include/update_engine/client.h
index 1bc6111..89f36af 100644
--- a/client_library/include/update_engine/client.h
+++ b/client_library/include/update_engine/client.h
@@ -80,6 +80,9 @@
std::string* out_new_version,
int64_t* out_new_size) const = 0;
+ // Same as above but return the entire struct instead.
+ virtual bool GetStatus(UpdateEngineStatus* out_status) const = 0;
+
// Getter and setter for the cohort hint.
virtual bool SetCohortHint(const std::string& cohort_hint) = 0;
virtual bool GetCohortHint(std::string* cohort_hint) const = 0;
diff --git a/client_library/include/update_engine/status_update_handler.h b/client_library/include/update_engine/status_update_handler.h
index d2fad34..238f6bd 100644
--- a/client_library/include/update_engine/status_update_handler.h
+++ b/client_library/include/update_engine/status_update_handler.h
@@ -14,7 +14,9 @@
// limitations under the License.
//
+// NOLINTNEXTLINE(whitespace/line_length)
#ifndef UPDATE_ENGINE_CLIENT_LIBRARY_INCLUDE_UPDATE_ENGINE_STATUS_UPDATE_HANDLER_H_
+// NOLINTNEXTLINE(whitespace/line_length)
#define UPDATE_ENGINE_CLIENT_LIBRARY_INCLUDE_UPDATE_ENGINE_STATUS_UPDATE_HANDLER_H_
#include <string>
@@ -35,13 +37,10 @@
virtual void IPCError(const std::string& error) = 0;
// Runs every time update_engine reports a status change.
- virtual void HandleStatusUpdate(int64_t last_checked_time,
- double progress,
- UpdateStatus current_operation,
- const std::string& new_version,
- int64_t new_size) = 0;
+ virtual void HandleStatusUpdate(const UpdateEngineStatus& status) = 0;
};
} // namespace update_engine
+// NOLINTNEXTLINE(whitespace/line_length)
#endif // UPDATE_ENGINE_CLIENT_LIBRARY_INCLUDE_UPDATE_ENGINE_STATUS_UPDATE_HANDLER_H_