| Index: src/platform/update_engine/update_engine_client.cc
|
| diff --git a/src/platform/update_engine/update_engine_client.cc b/src/platform/update_engine/update_engine_client.cc
|
| index bed72056f073283c57caea08210f6cc7e5a75b2a..cfdbc8ab87df72dc6dbbfd073033f6378e8548e1 100644
|
| --- a/src/platform/update_engine/update_engine_client.cc
|
| +++ b/src/platform/update_engine/update_engine_client.cc
|
| @@ -5,6 +5,7 @@
|
| #include <gflags/gflags.h>
|
| #include <glib.h>
|
|
|
| +#include "update_engine/marshal.glibmarshal.h"
|
| #include "update_engine/dbus_constants.h"
|
| #include "update_engine/subprocess.h"
|
| #include "update_engine/utils.h"
|
| @@ -23,13 +24,15 @@ DEFINE_bool(force_update, false,
|
| "Force an update, even over an expensive network.");
|
| DEFINE_bool(check_for_update, false,
|
| "Initiate check for updates.");
|
| +DEFINE_bool(watch_for_updates, false,
|
| + "Listen for status updates and print them to the screen.");
|
|
|
| namespace {
|
|
|
| -bool GetStatus() {
|
| - DBusGConnection *bus;
|
| - DBusGProxy *proxy;
|
| - GError *error = NULL;
|
| +bool GetProxy(DBusGProxy** out_proxy) {
|
| + DBusGConnection* bus;
|
| + DBusGProxy* proxy;
|
| + GError* error = NULL;
|
|
|
| bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
|
| if (!bus) {
|
| @@ -43,6 +46,30 @@ bool GetStatus() {
|
| if (!proxy) {
|
| LOG(FATAL) << "Error getting proxy: " << GetGErrorMessage(error);
|
| }
|
| + *out_proxy = proxy;
|
| + return true;
|
| +}
|
| +
|
| +static void StatusUpdateSignalHandler(DBusGProxy* proxy,
|
| + int64_t last_checked_time,
|
| + double progress,
|
| + gchar* current_operation,
|
| + gchar* new_version,
|
| + int64_t new_size,
|
| + void* user_data) {
|
| + LOG(INFO) << "Got status update:";
|
| + LOG(INFO) << " last_checked_time: " << last_checked_time;
|
| + LOG(INFO) << " progress: " << progress;
|
| + LOG(INFO) << " current_operation: " << current_operation;
|
| + LOG(INFO) << " new_version: " << new_version;
|
| + LOG(INFO) << " new_size: " << new_size;
|
| +}
|
| +
|
| +bool GetStatus() {
|
| + DBusGProxy* proxy;
|
| + GError* error = NULL;
|
| +
|
| + CHECK(GetProxy(&proxy));
|
|
|
| gint64 last_checked_time = 0;
|
| gdouble progress = 0.0;
|
| @@ -71,7 +98,52 @@ bool GetStatus() {
|
| return true;
|
| }
|
|
|
| +// Should never return.
|
| +void WatchForUpdates() {
|
| + DBusGProxy* proxy;
|
| +
|
| + CHECK(GetProxy(&proxy));
|
| +
|
| + // Register marshaller
|
| + dbus_g_object_register_marshaller(
|
| + update_engine_VOID__INT64_DOUBLE_STRING_STRING_INT64,
|
| + G_TYPE_NONE,
|
| + G_TYPE_INT64,
|
| + G_TYPE_DOUBLE,
|
| + G_TYPE_STRING,
|
| + G_TYPE_STRING,
|
| + G_TYPE_INT64,
|
| + G_TYPE_INVALID);
|
| +
|
| + // TODO(adlr): make StatusUpdate a const string
|
| + dbus_g_proxy_add_signal(proxy,
|
| + "StatusUpdate",
|
| + G_TYPE_INT64,
|
| + G_TYPE_DOUBLE,
|
| + G_TYPE_STRING,
|
| + G_TYPE_STRING,
|
| + G_TYPE_INT64,
|
| + G_TYPE_INVALID);
|
| + GMainLoop* loop = g_main_loop_new (NULL, TRUE);
|
| + dbus_g_proxy_connect_signal(proxy,
|
| + "StatusUpdate",
|
| + G_CALLBACK(StatusUpdateSignalHandler),
|
| + NULL,
|
| + NULL);
|
| + g_main_loop_run(loop);
|
| + g_main_loop_unref(loop);
|
| +}
|
| +
|
| bool CheckForUpdates(bool force) {
|
| + DBusGProxy* proxy;
|
| + GError* error = NULL;
|
| +
|
| + CHECK(GetProxy(&proxy));
|
| +
|
| + gboolean rc =
|
| + org_chromium_UpdateEngineInterface_check_for_update(proxy, &error);
|
| + CHECK_EQ(rc, TRUE) << "Error checking for update: "
|
| + << GetGErrorMessage(error);
|
| return true;
|
| }
|
|
|
| @@ -101,6 +173,11 @@ int main(int argc, char** argv) {
|
| << "Update check/initiate update failed.";
|
| return 0;
|
| }
|
| + if (FLAGS_watch_for_updates) {
|
| + LOG(INFO) << "Watching for status updates.";
|
| + WatchForUpdates(); // Should never return.
|
| + return 1;
|
| + }
|
|
|
| LOG(INFO) << "No flags specified. Exiting.";
|
| return 0;
|
|
|