| // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <dlfcn.h> |
| #include <glib-object.h> |
| |
| #include <iostream> // NOLINT |
| |
| #include <base/logging.h> |
| |
| #include "chromeos_cros_api.h" // NOLINT |
| #include "chromeos_update_engine.h" |
| #include "monitor_utils.h" //NOLINT |
| |
| using std::cout; |
| using std::endl; |
| |
| namespace { |
| |
| void PrintUpdateProgress(const chromeos::UpdateProgress& progress) { |
| const char* op = ""; |
| switch (progress.status_) { |
| case chromeos::UPDATE_STATUS_IDLE: |
| op = "IDLE"; |
| break; |
| case chromeos::UPDATE_STATUS_CHECKING_FOR_UPDATE: |
| op = "CHECKING_FOR_UPDATE"; |
| break; |
| case chromeos::UPDATE_STATUS_UPDATE_AVAILABLE: |
| op = "UPDATE_AVAILABLE"; |
| break; |
| case chromeos::UPDATE_STATUS_DOWNLOADING: |
| op = "DOWNLOADING"; |
| break; |
| case chromeos::UPDATE_STATUS_VERIFYING: |
| op = "VERIFYING"; |
| break; |
| case chromeos::UPDATE_STATUS_FINALIZING: |
| op = "FINALIZING"; |
| break; |
| case chromeos::UPDATE_STATUS_UPDATED_NEED_REBOOT: |
| op = "UPDATED_NEED_REBOOT"; |
| break; |
| default: |
| NOTREACHED() << "Unhandled status " << progress.status_; |
| } |
| |
| cout << "status_: " << op << endl; |
| cout << "download_progress_: " << progress.download_progress_ << endl; |
| cout << "last_checked_time_: " << progress.last_checked_time_ << endl; |
| cout << "new_version_: " << progress.new_version_ << endl; |
| cout << "new_size_: " << progress.new_size_ << endl; |
| cout << endl; |
| } |
| |
| void TestUpdateMonitor(void* unused, const chromeos::UpdateProgress& progress) { |
| cout << "Monitor got status:" << endl; |
| PrintUpdateProgress(progress); |
| } |
| |
| gboolean ExitTimerCallback(void* arg) { |
| cout << "Exiting..." << endl; |
| g_main_loop_quit(reinterpret_cast<GMainLoop*>(arg)); |
| return FALSE; // Don't call this callback again |
| } |
| |
| gboolean GetStatusTimerCallback(void* unused) { |
| chromeos::UpdateProgress progress; |
| bool success = chromeos::RetrieveUpdateProgress(&progress); |
| if (!success) { |
| cout << "ERROR: RetrieveUpdateProgress() failed." << endl; |
| return FALSE; // Don't call this callback again |
| } |
| cout << "Polled for status and got:" << endl; |
| PrintUpdateProgress(progress); |
| return TRUE; // Keep calling back |
| } |
| |
| } // namespace {} |
| |
| int main(int argc, const char** argv) { |
| // Initialize the g_type systems an g_main event loop, normally this would be |
| // done by chrome. |
| ::g_type_init(); |
| GMainLoop* loop = ::g_main_loop_new(NULL, false); |
| bool success = LoadCrosLibrary(argv); |
| DCHECK(success) << "Failed to load cros .so"; |
| |
| chromeos::UpdateStatusConnection connection = |
| chromeos::MonitorUpdateStatus(&TestUpdateMonitor, NULL); |
| |
| // Callback to quit after 60 seconds: |
| g_timeout_add(60 * 1000, &ExitTimerCallback, loop); |
| |
| // Poll for status every 5 seconds: |
| g_timeout_add(5 * 1000, &GetStatusTimerCallback, NULL); |
| |
| ::g_main_loop_run(loop); |
| |
| // When we're done, we disconnect the power status. |
| chromeos::DisconnectUpdateProgress(connection); |
| |
| return 0; |
| } |