Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(604)

Unified Diff: ui/progress_wnd.cc

Issue 624713003: Keep only base/extractor.[cc|h]. (Closed) Base URL: https://chromium.googlesource.com/external/omaha.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/progress_wnd.h ('k') | ui/progress_wnd_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/progress_wnd.cc
diff --git a/ui/progress_wnd.cc b/ui/progress_wnd.cc
deleted file mode 100644
index 59852cd4147e343be9f661b15b7e858c1091ef94..0000000000000000000000000000000000000000
--- a/ui/progress_wnd.cc
+++ /dev/null
@@ -1,840 +0,0 @@
-// Copyright 2007-2010 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// ========================================================================
-
-
-#include "omaha/ui/progress_wnd.h"
-#include "base/basictypes.h"
-#include "omaha/base/constants.h"
-#include "omaha/base/debug.h"
-#include "omaha/base/error.h"
-#include "omaha/base/logging.h"
-#include "omaha/base/system_info.h"
-#include "omaha/base/utils.h"
-#include "omaha/common/goopdate_utils.h"
-#include "omaha/ui/ui_ctls.h"
-#include "omaha/ui/ui_metrics.h"
-
-namespace omaha {
-
-namespace {
-
-// The current UI is only able to show one completion type. If apps in the
-// bundle have different completion type, then we need to decide which
-// one should be shown to the user. The following array lists the types
-// from low priority to high priority. The completion type with highest
-// priority will be shown to the user.
-const CompletionCodes kCompletionCodesActionPriority[] = {
- COMPLETION_CODE_EXIT_SILENTLY,
- COMPLETION_CODE_EXIT_SILENTLY_ON_LAUNCH_COMMAND,
- COMPLETION_CODE_SUCCESS,
- COMPLETION_CODE_LAUNCH_COMMAND,
- COMPLETION_CODE_RESTART_BROWSER_NOTICE_ONLY,
- COMPLETION_CODE_RESTART_ALL_BROWSERS_NOTICE_ONLY,
- COMPLETION_CODE_RESTART_BROWSER,
- COMPLETION_CODE_RESTART_ALL_BROWSERS,
- COMPLETION_CODE_REBOOT_NOTICE_ONLY,
- COMPLETION_CODE_REBOOT,
- COMPLETION_CODE_ERROR,
- COMPLETION_CODE_INSTALL_FINISHED_BEFORE_CANCEL,
-};
-
-// kCompletionCodesActionPriority should have all the values in enumeration
-// CompletionCodes. The enumeration value starts from 1 so the array size
-// should match the last value in the enumeration.
-COMPILE_ASSERT(arraysize(kCompletionCodesActionPriority) ==
- COMPLETION_CODE_INSTALL_FINISHED_BEFORE_CANCEL,
- CompletionCodesActionPriority_missing_completion_code);
-
-int GetActionPriority(CompletionCodes code) {
- for (int i = 0; i < arraysize(kCompletionCodesActionPriority); ++i) {
- if (kCompletionCodesActionPriority[i] == code) {
- return i;
- }
- }
-
- ASSERT1(false);
- return -1;
-}
-
-bool AreAllAppsCanceled(const std::vector<AppCompletionInfo>& apps_info) {
- for (size_t i = 0; i < apps_info.size(); ++i) {
- if (!apps_info[i].is_canceled) {
- return false;
- }
- }
-
- return true;
-}
-
-} // namespace
-
-InstallStoppedWnd::InstallStoppedWnd(CMessageLoop* message_loop, HWND parent)
- : message_loop_(message_loop),
- parent_(parent) {
- CORE_LOG(L3, (_T("[InstallStoppedWnd::InstallStoppedWnd]")));
- ASSERT1(message_loop);
- ASSERT1(::IsWindow(parent));
-}
-
-InstallStoppedWnd::~InstallStoppedWnd() {
- CORE_LOG(L3, (_T("[InstallStoppedWnd::~InstallStoppedWnd]")));
- if (IsWindow()) {
- VERIFY1(SUCCEEDED(CloseWindow()));
- }
-}
-
-// Enables the parent window and destroys this window.
-// Enabling the parent window before destroying this one causes the parent
-// window to get the focus and avoids a visible momentary lack of focus if we
-// instead call SetFocus for the parent after the window is destroyed.
-HRESULT InstallStoppedWnd::CloseWindow() {
- ASSERT1(IsWindow());
- VERIFY1(::EnableWindow(parent_, true));
-
- return DestroyWindow() ? S_OK : HRESULTFromLastError();
-}
-
-// Disables the parent window.
-LRESULT InstallStoppedWnd::OnInitDialog(UINT,
- WPARAM,
- LPARAM,
- BOOL& handled) { // NOLINT
- VERIFY1(!::EnableWindow(parent_, false));
- VERIFY1(message_loop_->AddMessageFilter(this));
- handled = true;
- return 1;
-}
-
-// By letting the parent destroy this window, the parent to manage the entire
-// lifetime of this window and avoid creating a synchronization problem by
-// changing the value of IsInstallStoppedWindowPresent() during the middle of
-// one of the parent's methods.
-LRESULT InstallStoppedWnd::OnClickButton(WORD,
- WORD id,
- HWND,
- BOOL& handled) { // NOLINT
- CORE_LOG(L3, (_T("[InstallStoppedWnd::OnClickButton]")));
- ASSERT1(id == IDOK || id == IDCANCEL);
- VERIFY1(::PostMessage(parent_, WM_INSTALL_STOPPED, id, 0));
- handled = true;
- return 0;
-}
-
-LRESULT InstallStoppedWnd::OnDestroy(UINT,
- WPARAM,
- LPARAM,
- BOOL& handled) { // NOLINT
- VERIFY1(message_loop_->RemoveMessageFilter(this));
- handled = true;
- return 0;
-}
-
-ProgressWnd::ProgressWnd(CMessageLoop* message_loop, HWND parent)
- : CompleteWnd(IDD_PROGRESS,
- ICC_STANDARD_CLASSES | ICC_PROGRESS_CLASS,
- message_loop,
- parent),
- cur_state_(STATE_INIT),
- events_sink_(NULL),
- is_canceled_(false) {
- CORE_LOG(L3, (_T("[ProgressWnd::ProgressWnd]")));
-}
-
-ProgressWnd::~ProgressWnd() {
- CORE_LOG(L3, (_T("[ProgressWnd::~ProgressWnd]")));
- ASSERT1(!IsWindow());
- cur_state_ = STATE_END;
-}
-
-void ProgressWnd::SetEventSink(ProgressWndEvents* ev) {
- events_sink_ = ev;
- CompleteWnd::SetEventSink(events_sink_);
-}
-
-LRESULT ProgressWnd::OnInitDialog(UINT message,
- WPARAM w_param,
- LPARAM l_param,
- BOOL& handled) { // NOLINT
- CORE_LOG(L3, (_T("[ProgressWnd::OnInitDialog]")));
- UNREFERENCED_PARAMETER(message);
- UNREFERENCED_PARAMETER(w_param);
- UNREFERENCED_PARAMETER(l_param);
- UNREFERENCED_PARAMETER(handled);
-
- InitializeDialog();
-
- pause_resume_text_.reset(new StaticEx);
- pause_resume_text_->SubclassWindow(GetDlgItem(IDC_PAUSE_RESUME_TEXT));
-
- CString state_text;
- VERIFY1(state_text.LoadString(IDS_INITIALIZING));
- VERIFY1(::SetWindowText(GetDlgItem(IDC_INSTALLER_STATE_TEXT), state_text));
- VERIFY1(SUCCEEDED(SetMarqueeMode(true)));
- VERIFY1(SUCCEEDED(ChangeControlState()));
-
- metrics_timer_.reset(new HighresTimer);
-
- return 1; // Let the system set the focus.
-}
-
-// If closing is disabled, does not close the window.
-// If in a completion state, the window is closed.
-// Otherwise, the InstallStoppedWnd is displayed and the window is closed only
-// if the user decides to cancel.
-bool ProgressWnd::MaybeCloseWindow() {
- if (!is_close_enabled()) {
- return false;
- }
-
- if (cur_state_ != STATE_COMPLETE_SUCCESS &&
- cur_state_ != STATE_COMPLETE_ERROR &&
- cur_state_ != STATE_COMPLETE_RESTART_BROWSER &&
- cur_state_ != STATE_COMPLETE_RESTART_ALL_BROWSERS &&
- cur_state_ != STATE_COMPLETE_REBOOT) {
- // The UI is not in final state: ask the user to proceed with closing it.
- // A modal dialog opens and sends a message back to this window to
- // communicate the user decision.
- install_stopped_wnd_.reset(new InstallStoppedWnd(message_loop(), *this));
- HWND hwnd = install_stopped_wnd_->Create(*this);
- ASSERT1(hwnd);
- if (hwnd) {
- CString title;
- VERIFY1(title.LoadString(IDS_INSTALLATION_STOPPED_WINDOW_TITLE));
- VERIFY1(install_stopped_wnd_->SetWindowText(title));
-
- CString button_text;
- VERIFY1(button_text.LoadString(IDS_RESUME_INSTALLATION));
- VERIFY1(::SetWindowText(
- install_stopped_wnd_->GetDlgItem(IDOK), button_text));
-
- VERIFY1(button_text.LoadString(IDS_CANCEL_INSTALLATION));
- VERIFY1(::SetWindowText(
- install_stopped_wnd_->GetDlgItem(IDCANCEL), button_text));
-
- CString s;
- s.FormatMessage(IDS_INSTALL_STOPPED, bundle_name());
- VERIFY1(::SetWindowText(
- install_stopped_wnd_->GetDlgItem(IDC_INSTALL_STOPPED_TEXT), s));
-
- VERIFY1(install_stopped_wnd_->CenterWindow(*this));
- VERIFY1(!install_stopped_wnd_->ShowWindow(SW_SHOWDEFAULT));
- return false;
- }
- }
-
- VERIFY1(SUCCEEDED(CloseWindow()));
- return true;
-}
-
-LRESULT ProgressWnd::OnClickedButton(WORD notify_code,
- WORD id,
- HWND wnd_ctl,
- BOOL& handled) { // NOLINT
- CORE_LOG(L3, (_T("[ProgressWnd::OnClickedButton]")));
- ASSERT1(id == IDC_BUTTON1 || id == IDC_BUTTON2 || id == IDC_CLOSE);
- ASSERT1(events_sink_);
-
-#pragma warning(push)
-// C4061: enumerator 'xxx' in switch of enum 'yyy' is not explicitly handled by
-// a case label.
-#pragma warning(disable : 4061)
-
- switch (id) {
- case IDC_BUTTON1:
- // TODO(omaha): Consider doing something if the callbacks fail.
- switch (cur_state_) {
- case STATE_COMPLETE_RESTART_BROWSER:
- ++metric_worker_ui_restart_browser_now_click;
- VERIFY1(events_sink_->DoRestartBrowser(false, post_install_urls_));
- break;
- case STATE_COMPLETE_RESTART_ALL_BROWSERS:
- ++metric_worker_ui_restart_all_browsers_now_click;
- VERIFY1(events_sink_->DoRestartBrowser(true, post_install_urls_));
- break;
- case STATE_COMPLETE_REBOOT:
- ++metric_worker_ui_reboot_now_click;
- VERIFY1(events_sink_->DoReboot());
- break;
- default:
- ASSERT1(false);
- }
- break;
- case IDC_BUTTON2:
- switch (cur_state_) {
- case STATE_COMPLETE_RESTART_BROWSER:
- case STATE_COMPLETE_RESTART_ALL_BROWSERS:
- case STATE_COMPLETE_REBOOT:
- break;
- default:
- ASSERT1(false);
- }
- break;
- case IDC_CLOSE:
- switch (cur_state_) {
- case STATE_COMPLETE_SUCCESS:
- case STATE_COMPLETE_ERROR:
- return CompleteWnd::OnClickedButton(notify_code,
- id,
- wnd_ctl,
- handled);
- break;
- default:
- ASSERT1(false);
- }
- break;
- default:
- ASSERT1(false);
- }
-#pragma warning(pop)
-
- // TODO(omaha3): In closing the Window here, we assume that none of the above
- // code does anything that might delay the UI response. This should be true
- // since we won't actually be restarting browsers, etc. from the UI.
- handled = true;
- VERIFY1(SUCCEEDED(CloseWindow()));
-
- return 0;
-}
-
-LRESULT ProgressWnd::OnInstallStopped(UINT msg,
- WPARAM wparam,
- LPARAM,
- BOOL& handled) { // NOLINT
- CORE_LOG(L3, (_T("[ProgressWnd::OnInstallStopped]")));
- UNREFERENCED_PARAMETER(msg);
-
- install_stopped_wnd_.reset();
-
- ASSERT1(msg == WM_INSTALL_STOPPED);
- ASSERT1(wparam == IDOK || wparam == IDCANCEL);
- // TODO(omaha): Swap the meaning of IDOK and IDCANCEL. IDCANCEL gets passed
- // when the user hits the esc key. Successive esc presses result in the window
- // disappearing. Instead, we would like the default (set in the .rc files) and
- // esc key option to both resume. Changing this requires swapping all uses
- // in this file as well as in the IDD_INSTALL_STOPPED definition.
- // Maybe use different constants internally too since these values are used
- // by different classes and ProgressWnd should not need to know how
- // InstallStoppedWnd is implemented.
- // It's possible this will also fix arrow key problem (http://b/1338787).
- switch (wparam) {
- case IDOK:
- // TODO(omaha): Implement "Resume" here.
- break;
- case IDCANCEL:
- HandleCancelRequest();
- break;
- default:
- ASSERT1(false);
- break;
- }
-
- handled = true;
- return 0;
-}
-
-void ProgressWnd::HandleCancelRequest() {
- CString s;
- VERIFY1(s.LoadString(IDS_CANCELING));
- VERIFY1(::SetWindowText(GetDlgItem(IDC_INSTALLER_STATE_TEXT), s));
-
- if (is_canceled_) {
- return;
- }
- is_canceled_ = true;
-
- // The user has decided to cancel.
- metric_worker_ui_cancel_ms.AddSample(metrics_timer_->GetElapsedMs());
- ++metric_worker_ui_cancels;
-
- if (events_sink_) {
- events_sink_->DoCancel();
- }
-}
-
-void ProgressWnd::OnCheckingForUpdate() {
- CORE_LOG(L3, (_T("[ProgressWnd::OnCheckingForUpdate]")));
- ASSERT1(thread_id() == ::GetCurrentThreadId());
- if (!IsWindow()) {
- return;
- }
-
- cur_state_ = STATE_CHECKING_FOR_UPDATE;
-
- CString s;
- VERIFY1(s.LoadString(IDS_WAITING_TO_CONNECT));
- VERIFY1(::SetWindowText(GetDlgItem(IDC_INSTALLER_STATE_TEXT), s));
-
- VERIFY1(SUCCEEDED(SetMarqueeMode(true)));
- VERIFY1(SUCCEEDED(ChangeControlState()));
-}
-
-void ProgressWnd::OnUpdateAvailable(const CString& app_name,
- const CString& version_string) {
- CORE_LOG(L3, (_T("[ProgressWnd::OnUpdateAvailable][%s][%s]"),
- app_name, version_string));
- UNREFERENCED_PARAMETER(app_name);
- UNREFERENCED_PARAMETER(version_string);
-
- ASSERT1(thread_id() == ::GetCurrentThreadId());
- if (!IsWindow()) {
- return;
- }
-}
-
-void ProgressWnd::OnWaitingToDownload(const CString& app_name) {
- CORE_LOG(L3, (_T("[ProgressWnd::OnWaitingToDownload][%s]"), app_name));
- ASSERT1(thread_id() == ::GetCurrentThreadId());
- if (!IsWindow()) {
- return;
- }
-
- cur_state_ = STATE_WAITING_TO_DOWNLOAD;
-
- CString s;
- s.FormatMessage(IDS_WAITING_TO_DOWNLOAD, app_name);
- VERIFY1(::SetWindowText(GetDlgItem(IDC_INSTALLER_STATE_TEXT), s));
-
- VERIFY1(SUCCEEDED(SetMarqueeMode(true)));
- VERIFY1(SUCCEEDED(ChangeControlState()));
-}
-
-// May be called repeatedly during download.
-void ProgressWnd::OnDownloading(const CString& app_name,
- int time_remaining_ms,
- int pos) {
- CORE_LOG(L5, (_T("[ProgressWnd::OnDownloading][%s][remaining ms=%d][pos=%d]"),
- app_name, time_remaining_ms, pos));
- ASSERT1(thread_id() == ::GetCurrentThreadId());
- if (!IsWindow()) {
- return;
- }
-
- ASSERT1(0 <= pos && pos <= 100);
-
- cur_state_ = STATE_DOWNLOADING;
-
-// This resource is not included in the resource files since it's not used.
-#if 0
- VERIFY1(s.LoadString(IDS_PAUSE));
- VERIFY1(::SetWindowText(GetDlgItem(IDC_PAUSE_RESUME_TEXT), s));
-#endif
-
- CString s;
-
- int time_remaining_sec = CeilingDivide(time_remaining_ms, kMsPerSec);
- if (time_remaining_ms < 0) {
- s.FormatMessage(IDS_WAITING_TO_DOWNLOAD, app_name);
- } else if (time_remaining_ms == 0) {
- s.FormatMessage(IDS_DOWNLOADING_COMPLETED, app_name);
- } else if (time_remaining_sec < kSecPerMin) {
- // Less than one minute remaining.
- s.FormatMessage(IDS_DOWNLOADING_SHORT, app_name, time_remaining_sec);
- } else if (time_remaining_sec < kSecondsPerHour) {
- // Less than one hour remaining.
- int time_remaining_minute = CeilingDivide(time_remaining_sec, kSecPerMin);
- s.FormatMessage(IDS_DOWNLOADING_LONG, app_name, time_remaining_minute);
- } else {
- int time_remaining_hour = CeilingDivide(time_remaining_sec,
- kSecondsPerHour);
- s.FormatMessage(IDS_DOWNLOADING_VERY_LONG, app_name, time_remaining_hour);
- }
-
- VERIFY1(::SetWindowText(GetDlgItem(IDC_INSTALLER_STATE_TEXT), s));
- VERIFY1(SUCCEEDED(ChangeControlState()));
-
- // When the network is connecting keep the marquee moving, otherwise
- // the user has no indication something is still going on.
- // TODO(omaha): when resuming an incomplete download this will not work.
- VERIFY1(SUCCEEDED(SetMarqueeMode(pos == 0)));
- ::SendMessage(GetDlgItem(IDC_PROGRESS), PBM_SETPOS, pos, 0);
-}
-
-void ProgressWnd::OnWaitingRetryDownload(const CString& app_name,
- time64 next_retry_time) {
- CORE_LOG(L5, (_T("[ProgressWnd::OnWaitingRetryDownload][%s][retry at:%llu]"),
- app_name, next_retry_time));
- ASSERT1(thread_id() == ::GetCurrentThreadId());
- if (!IsWindow()) {
- return;
- }
-
- time64 now = GetCurrent100NSTime();
- if (now < next_retry_time) {
- CString s;
- int retry_time_in_sec =
- static_cast<int>(CeilingDivide(next_retry_time - now, kSecsTo100ns));
- s.FormatMessage(IDS_DOWNLOAD_RETRY, app_name, retry_time_in_sec);
- VERIFY1(::SetWindowText(GetDlgItem(IDC_INSTALLER_STATE_TEXT), s));
- VERIFY1(SUCCEEDED(ChangeControlState()));
- }
-}
-
-void ProgressWnd::OnWaitingToInstall(const CString& app_name,
- bool* can_start_install) {
- CORE_LOG(L3, (_T("[ProgressWnd::OnWaitingToInstall][%s]"), app_name));
- ASSERT1(thread_id() == ::GetCurrentThreadId());
- ASSERT1(can_start_install);
- if (!IsWindow()) {
- return;
- }
-
- if (STATE_WAITING_TO_INSTALL != cur_state_) {
- cur_state_ = STATE_WAITING_TO_INSTALL;
-
- CString s;
- s.FormatMessage(IDS_WAITING_TO_INSTALL, app_name);
- VERIFY1(::SetWindowText(GetDlgItem(IDC_INSTALLER_STATE_TEXT), s));
-
- VERIFY1(SUCCEEDED(SetMarqueeMode(true)));
- VERIFY1(SUCCEEDED(ChangeControlState()));
- }
-
- // If we want to instead close the window and start install, call
- // CloseInstallStoppedWindow() and return *can_start_install = true.
- *can_start_install = !IsInstallStoppedWindowPresent();
-}
-
-// May be called repeatedly during install.
-void ProgressWnd::OnInstalling(const CString& app_name) {
- CORE_LOG(L5, (_T("[ProgressWnd::OnInstalling][%s]"), app_name));
- ASSERT1(thread_id() == ::GetCurrentThreadId());
- if (!IsWindow()) {
- return;
- }
-
- // TODO(omaha3): This can now occur because installs are not gated.
- // ASSERT1(!IsInstallStoppedWindowPresent());
-
- if (STATE_INSTALLING != cur_state_) {
- cur_state_ = STATE_INSTALLING;
-
- CString s;
- s.FormatMessage(IDS_INSTALLING, app_name);
- VERIFY1(::SetWindowText(GetDlgItem(IDC_INSTALLER_STATE_TEXT), s));
-
- VERIFY1(SUCCEEDED(SetMarqueeMode(true)));
- VERIFY1(SUCCEEDED(ChangeControlState()));
- }
-}
-
-// TODO(omaha): Should this message display the app name or bundle name? Is the
-// entire bundle paused?
-void ProgressWnd::OnPause() {
- CORE_LOG(L3, (_T("[ProgressWnd::OnPause]")));
- ASSERT(false, (_T("These strings are not in the .rc files.")));
- ASSERT1(thread_id() == ::GetCurrentThreadId());
- if (!IsWindow()) {
- return;
- }
-
- cur_state_ = STATE_PAUSED;
-
-// These resources are not included in resource files since they are not used.
-#if 0
- CString s;
- s.FormatMessage(IDS_DOWNLOAD_PAUSED, bundle_name());
- VERIFY1(::SetWindowText(GetDlgItem(IDC_INSTALLER_STATE_TEXT), s));
-
- VERIFY1(s.LoadString(IDS_RESUME));
- VERIFY1(::SetWindowText(GetDlgItem(IDC_PAUSE_RESUME_TEXT), s));
-#endif
-
- // TODO(omaha): implement time left.
-
- VERIFY1(SUCCEEDED(ChangeControlState()));
-}
-
-void ProgressWnd::DeterminePostInstallUrls(const ObserverCompletionInfo& info) {
- ASSERT1(post_install_urls_.empty());
- post_install_urls_.clear();
-
- for (size_t i = 0; i < info.apps_info.size(); ++i) {
- const AppCompletionInfo& app_info = info.apps_info[i];
- if (!app_info.post_install_url.IsEmpty() &&
- (app_info.completion_code == COMPLETION_CODE_RESTART_ALL_BROWSERS ||
- app_info.completion_code == COMPLETION_CODE_RESTART_BROWSER)) {
- post_install_urls_.push_back(app_info.post_install_url);
- }
- }
- ASSERT1(!post_install_urls_.empty());
-}
-
-// TODO(omaha): We can eliminate this function is we have a better UI that can
-// show compeltion status for each app in the bundle.
-//
-// Overall completion code is determined by apps' completion codes and bundle
-// completion code. If bundle installation fails or installation completed after
-// a cancel is attempted, returns bundle completion code.
-// Otherwise the app's completion code that has the greatest priority is
-// returned.
-CompletionCodes ProgressWnd::GetBundleOverallCompletionCode(
- const ObserverCompletionInfo& info) const {
- if (info.completion_code == COMPLETION_CODE_ERROR ||
- info.completion_code == COMPLETION_CODE_INSTALL_FINISHED_BEFORE_CANCEL) {
- return info.completion_code;
- }
-
- ASSERT1(info.completion_code == COMPLETION_CODE_SUCCESS);
-
- CompletionCodes overall_completion_code =
- kCompletionCodesActionPriority[0];
- for (size_t i = 0; i < info.apps_info.size(); ++i) {
- if (GetActionPriority(overall_completion_code) <
- GetActionPriority(info.apps_info[i].completion_code)) {
- overall_completion_code = info.apps_info[i].completion_code;
- }
- }
-
- return overall_completion_code;
-}
-
-// TODO(omaha3): How should we display the restart browser and reboot messages
-// when multiple apps are being installed, some of which may have failed? Should
-// we use the app name or bundle name?
-void ProgressWnd::OnComplete(const ObserverCompletionInfo& observer_info) {
- CORE_LOG(L3, (_T("[ProgressWnd::OnComplete][%s]"), observer_info.ToString()));
- ASSERT1(thread_id() == ::GetCurrentThreadId());
-
- if (!CompleteWnd::OnComplete()) {
- return;
- }
-
- // Close the 'Install Stop' window if it is on the screen.
- // TODO(omaha3): This had been before all main dialog UI. Make sure looks OK.
- CloseInstallStoppedWindow();
-
- // TODO(omaha3): Do we want to avoid launching commands during an interactive
- // /ua update? If so, we'll need to handle that somehow. Using the observer
- // handles the silent update and install cases as well as the OnDemand case.
- bool launch_commands_succeeded = LaunchCmdLines(observer_info);
-
- CString s;
- CompletionCodes overall_completion_code =
- GetBundleOverallCompletionCode(observer_info);
- CORE_LOG(L3, (_T("[overall completion code: %d]"), overall_completion_code));
- switch (overall_completion_code) {
- case COMPLETION_CODE_SUCCESS:
- case COMPLETION_CODE_LAUNCH_COMMAND:
- case COMPLETION_CODE_INSTALL_FINISHED_BEFORE_CANCEL:
- cur_state_ = STATE_COMPLETE_SUCCESS;
-
- // TODO(omaha): Do not inherit from CompleteWnd once we have the new
- // bundle-supporting UI. Among other things, calling
- // DisplayCompletionDialog causes second call to OmahaWnd::OnComplete().
- CompleteWnd::DisplayCompletionDialog(true,
- observer_info.completion_text,
- observer_info.help_url);
- break;
- case COMPLETION_CODE_ERROR:
- // If all apps are canceled, no need to display any dialog.
- if (AreAllAppsCanceled(observer_info.apps_info)) {
- VERIFY1(SUCCEEDED(CloseWindow()));
- return;
- } else {
- cur_state_ = STATE_COMPLETE_ERROR;
- CompleteWnd::DisplayCompletionDialog(false,
- observer_info.completion_text,
- observer_info.help_url);
- }
- break;
- case COMPLETION_CODE_RESTART_ALL_BROWSERS:
- cur_state_ = STATE_COMPLETE_RESTART_ALL_BROWSERS;
- VERIFY1(s.LoadString(IDS_RESTART_NOW));
- VERIFY1(::SetWindowText(GetDlgItem(IDC_BUTTON1), s));
- VERIFY1(s.LoadString(IDS_RESTART_LATER));
- VERIFY1(::SetWindowText(GetDlgItem(IDC_BUTTON2), s));
- s.FormatMessage(IDS_TEXT_RESTART_ALL_BROWSERS, bundle_name());
- VERIFY1(::SetWindowText(GetDlgItem(IDC_COMPLETE_TEXT), s));
- DeterminePostInstallUrls(observer_info);
- ++metric_worker_ui_restart_all_browsers_buttons_displayed;
- break;
- case COMPLETION_CODE_RESTART_BROWSER:
- cur_state_ = STATE_COMPLETE_RESTART_BROWSER;
- VERIFY1(s.LoadString(IDS_RESTART_NOW));
- VERIFY1(::SetWindowText(GetDlgItem(IDC_BUTTON1), s));
- VERIFY1(s.LoadString(IDS_RESTART_LATER));
- VERIFY1(::SetWindowText(GetDlgItem(IDC_BUTTON2), s));
- s.FormatMessage(IDS_TEXT_RESTART_BROWSER, bundle_name());
- VERIFY1(::SetWindowText(GetDlgItem(IDC_COMPLETE_TEXT), s));
- DeterminePostInstallUrls(observer_info);
- ++metric_worker_ui_restart_browser_buttons_displayed;
- break;
- case COMPLETION_CODE_REBOOT:
- ASSERT(false, (_T("The button actions are not implemented.")));
- cur_state_ = STATE_COMPLETE_REBOOT;
- VERIFY1(s.LoadString(IDS_RESTART_NOW));
- VERIFY1(::SetWindowText(GetDlgItem(IDC_BUTTON1), s));
- VERIFY1(s.LoadString(IDS_RESTART_LATER));
- VERIFY1(::SetWindowText(GetDlgItem(IDC_BUTTON2), s));
- s.FormatMessage(IDS_TEXT_RESTART_COMPUTER, bundle_name());
- VERIFY1(::SetWindowText(GetDlgItem(IDC_COMPLETE_TEXT), s));
- ++metric_worker_ui_reboot_buttons_displayed;
- break;
- // TODO(omaha3): We may be able to eliminate these by having the caller
- // specify the appropriate success text. That is the only difference from
- // the COMPLETION_CODE_SUCCESS case. Alternatively, we can make a decision
- // in this class based on, for example, whether the browser is supported.
- case COMPLETION_CODE_RESTART_ALL_BROWSERS_NOTICE_ONLY:
- cur_state_ = STATE_COMPLETE_SUCCESS;
- s.FormatMessage(IDS_TEXT_RESTART_ALL_BROWSERS, bundle_name());
- CompleteWnd::DisplayCompletionDialog(true, s, observer_info.help_url);
- break;
- case COMPLETION_CODE_REBOOT_NOTICE_ONLY:
- cur_state_ = STATE_COMPLETE_SUCCESS;
- s.FormatMessage(IDS_TEXT_RESTART_COMPUTER, bundle_name());
- CompleteWnd::DisplayCompletionDialog(true, s, observer_info.help_url);
- break;
- case COMPLETION_CODE_RESTART_BROWSER_NOTICE_ONLY:
- cur_state_ = STATE_COMPLETE_SUCCESS;
- s.FormatMessage(IDS_TEXT_RESTART_BROWSER, bundle_name());
- CompleteWnd::DisplayCompletionDialog(true, s, observer_info.help_url);
- break;
- case COMPLETION_CODE_EXIT_SILENTLY_ON_LAUNCH_COMMAND:
- cur_state_ = STATE_COMPLETE_SUCCESS;
- if (launch_commands_succeeded) {
- VERIFY1(SUCCEEDED(CloseWindow()));
- return;
- }
-
- CompleteWnd::DisplayCompletionDialog(true,
- observer_info.completion_text,
- observer_info.help_url);
- break;
- case COMPLETION_CODE_EXIT_SILENTLY:
- cur_state_ = STATE_COMPLETE_SUCCESS;
- VERIFY1(SUCCEEDED(CloseWindow()));
- return;
- default:
- ASSERT1(false);
- break;
- }
-
- VERIFY1(SUCCEEDED(ChangeControlState()));
-}
-
-HRESULT ProgressWnd::LaunchCmdLine(const AppCompletionInfo& app_info) {
- CORE_LOG(L3, (_T("[ProgressWnd::LaunchCmdLine][%s]"),
- app_info.post_install_launch_command_line));
- if (app_info.post_install_launch_command_line.IsEmpty()) {
- return S_OK;
- }
-
- if (app_info.completion_code != COMPLETION_CODE_LAUNCH_COMMAND &&
- app_info.completion_code !=
- COMPLETION_CODE_EXIT_SILENTLY_ON_LAUNCH_COMMAND) {
- CORE_LOG(LW, (_T("Launch command line [%s] is not empty but completion ")
- _T("code [%d] doesn't require a launch"),
- app_info.post_install_launch_command_line.GetString(),
- app_info.completion_code));
- return S_OK;
- }
-
- ASSERT1(SUCCEEDED(app_info.error_code));
- ASSERT1(!app_info.is_noupdate);
-
- HRESULT hr = goopdate_utils::LaunchCmdLine(
- is_machine(), app_info.post_install_launch_command_line);
- if (FAILED(hr)) {
- CORE_LOG(LE, (_T("[goopdate_utils::LaunchCmdLine failed][0x%x]"), hr));
- return hr;
- }
-
- return S_OK;
-}
-
-bool ProgressWnd::LaunchCmdLines(const ObserverCompletionInfo& info) {
- bool result = true;
-
- CORE_LOG(L3, (_T("[ProgressWnd::LaunchCmdLines]")));
- for (size_t i = 0; i < info.apps_info.size(); ++i) {
- const AppCompletionInfo& app_info = info.apps_info[i];
- if (FAILED(app_info.error_code)) {
- continue;
- }
- result &= SUCCEEDED(LaunchCmdLine(app_info));
- VERIFY1(result);
- }
-
- return result;
-}
-
-HRESULT ProgressWnd::ChangeControlState() {
- for (size_t i = 0; i != arraysize(ctls_); ++i) {
- const ControlState& ctl_state = ctls_[i];
- SetControlAttributes(ctl_state.id_, ctl_state.attr_[cur_state_]);
- }
- return S_OK;
-}
-
-HRESULT ProgressWnd::SetMarqueeMode(bool is_marquee) {
- if (!SystemInfo::IsRunningOnXPOrLater()) {
- // Marquee is not supported on OSes below XP.
- return S_OK;
- }
-
- HWND progress_bar = GetDlgItem(IDC_PROGRESS);
- if (!progress_bar) {
- return GOOPDATE_E_UI_INTERNAL_ERROR;
- }
-
- LONG style = ::GetWindowLong(progress_bar, GWL_STYLE);
- if (!style) {
- return HRESULTFromLastError();
- }
-
- if (is_marquee) {
- if (style & PBS_MARQUEE) {
- return S_OK;
- }
-
- style |= PBS_MARQUEE;
- style = ::SetWindowLong(progress_bar, GWL_STYLE, style);
- if (!style) {
- return HRESULTFromLastError();
- }
-
- bool result = ::SendMessage(progress_bar, PBM_SETMARQUEE,
- is_marquee, kMarqueeModeUpdatesMs) != 0;
- return result ? S_OK : GOOPDATE_E_UI_INTERNAL_ERROR;
- } else {
- if (!(style & PBS_MARQUEE)) {
- return S_OK;
- }
-
- style &= ~PBS_MARQUEE;
- style = ::SetWindowLong(progress_bar, GWL_STYLE, style);
- if (!style) {
- return HRESULTFromLastError();
- }
- return S_OK;
- }
-}
-
-bool ProgressWnd::IsInstallStoppedWindowPresent() {
- return install_stopped_wnd_.get() && install_stopped_wnd_->IsWindow();
-}
-
-bool ProgressWnd::CloseInstallStoppedWindow() {
- if (IsInstallStoppedWindowPresent()) {
- VERIFY1(SUCCEEDED(install_stopped_wnd_->CloseWindow()));
- install_stopped_wnd_.reset();
- return true;
- } else {
- return false;
- }
-}
-
-} // namespace omaha
-
« no previous file with comments | « ui/progress_wnd.h ('k') | ui/progress_wnd_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698