| OLD | NEW |
| (Empty) |
| 1 // Copyright 2007-2009 Google Inc. | |
| 2 // | |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
| 4 // you may not use this file except in compliance with the License. | |
| 5 // You may obtain a copy of the License at | |
| 6 // | |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 // | |
| 9 // Unless required by applicable law or agreed to in writing, software | |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 12 // See the License for the specific language governing permissions and | |
| 13 // limitations under the License. | |
| 14 // ======================================================================== | |
| 15 | |
| 16 | |
| 17 #include "omaha/ui/complete_wnd.h" | |
| 18 #include "omaha/base/const_addresses.h" | |
| 19 #include "omaha/base/debug.h" | |
| 20 #include "omaha/base/error.h" | |
| 21 #include "omaha/base/logging.h" | |
| 22 #include "omaha/base/safe_format.h" | |
| 23 #include "omaha/base/omaha_version.h" | |
| 24 #include "omaha/base/vistautil.h" | |
| 25 #include "omaha/common/goopdate_utils.h" | |
| 26 #include "omaha/ui/ui_metrics.h" | |
| 27 | |
| 28 namespace omaha { | |
| 29 | |
| 30 CompleteWnd::CompleteWnd(CMessageLoop* message_loop, HWND parent) | |
| 31 : OmahaWnd(IDD_PROGRESS, message_loop, parent), | |
| 32 events_sink_(NULL), | |
| 33 control_classes_(ICC_STANDARD_CLASSES) { | |
| 34 CORE_LOG(L3, (_T("[CompleteWnd::CompleteWnd]"))); | |
| 35 } | |
| 36 | |
| 37 // dialog_id specifies the dialog resource to use. | |
| 38 // control_classes specifies the control classes required for dialog_id. | |
| 39 CompleteWnd::CompleteWnd(int dialog_id, | |
| 40 DWORD control_classes, | |
| 41 CMessageLoop* message_loop, | |
| 42 HWND parent) | |
| 43 : OmahaWnd(dialog_id, message_loop, parent), | |
| 44 events_sink_(NULL), | |
| 45 control_classes_(control_classes | ICC_STANDARD_CLASSES) { | |
| 46 CORE_LOG(L3, (_T("[CompleteWnd::CompleteWnd]"))); | |
| 47 } | |
| 48 | |
| 49 HRESULT CompleteWnd::Initialize() { | |
| 50 CORE_LOG(L3, (_T("[CompleteWnd::Initialize]"))); | |
| 51 | |
| 52 HRESULT hr = InitializeCommonControls(control_classes_); | |
| 53 if (FAILED(hr)) { | |
| 54 return hr; | |
| 55 } | |
| 56 | |
| 57 return OmahaWnd::Initialize(); | |
| 58 } | |
| 59 | |
| 60 void CompleteWnd::SetEventSink(CompleteWndEvents* ev) { | |
| 61 events_sink_ = ev; | |
| 62 OmahaWnd::SetEventSink(events_sink_); | |
| 63 } | |
| 64 | |
| 65 LRESULT CompleteWnd::OnInitDialog(UINT message, | |
| 66 WPARAM w_param, | |
| 67 LPARAM l_param, | |
| 68 BOOL& handled) { // NOLINT | |
| 69 CORE_LOG(L3, (_T("[CompleteWnd::OnInitDialog]"))); | |
| 70 UNREFERENCED_PARAMETER(message); | |
| 71 UNREFERENCED_PARAMETER(w_param); | |
| 72 UNREFERENCED_PARAMETER(l_param); | |
| 73 handled = true; | |
| 74 | |
| 75 InitializeDialog(); | |
| 76 | |
| 77 SetControlAttributes(IDC_COMPLETE_TEXT, kDisabledNonButtonAttributes); | |
| 78 SetControlAttributes(IDC_ERROR_TEXT, kDisabledNonButtonAttributes); | |
| 79 SetControlAttributes(IDC_IMAGE, kDisabledNonButtonAttributes); | |
| 80 SetControlAttributes(IDC_GET_HELP_TEXT, kDisabledNonButtonAttributes); | |
| 81 SetControlAttributes(IDC_CLOSE, kDefaultActiveButtonAttributes); | |
| 82 | |
| 83 return 1; // Let the system set the focus. | |
| 84 } | |
| 85 | |
| 86 LRESULT CompleteWnd::OnClickedButton(WORD notify_code, | |
| 87 WORD id, | |
| 88 HWND wnd_ctl, | |
| 89 BOOL& handled) { // NOLINT | |
| 90 CORE_LOG(L3, (_T("[CompleteWnd::OnClickedButton]"))); | |
| 91 UNREFERENCED_PARAMETER(id); | |
| 92 UNREFERENCED_PARAMETER(notify_code); | |
| 93 UNREFERENCED_PARAMETER(wnd_ctl); | |
| 94 ASSERT1(id == IDC_CLOSE); | |
| 95 ASSERT1(is_complete()); | |
| 96 handled = true; | |
| 97 | |
| 98 VERIFY1(SUCCEEDED(CloseWindow())); | |
| 99 | |
| 100 return 0; | |
| 101 } | |
| 102 | |
| 103 LRESULT CompleteWnd::OnUrlClicked(int, LPNMHDR params, BOOL& handled) { // NOLI
NT | |
| 104 CORE_LOG(L3, (_T("[CompleteWnd::OnUrlClicked]"))); | |
| 105 ASSERT1(params); | |
| 106 | |
| 107 if (IDC_GET_HELP_TEXT == params->idFrom) { | |
| 108 ++metric_worker_ui_get_help_click; | |
| 109 } | |
| 110 | |
| 111 NMSTATICEX* notification = reinterpret_cast<NMSTATICEX*>(params); | |
| 112 ASSERT1(events_sink_); | |
| 113 if (events_sink_) { | |
| 114 bool is_launched = events_sink_->DoLaunchBrowser(notification->action); | |
| 115 // Assert that the launch succeeded because this code should not be called | |
| 116 // if the launch mechanism (i.e. IProcessLauncher when running elevated) is | |
| 117 // not in place. This could also fail if the default browser has been | |
| 118 // uninstalled, but that is unlikely. | |
| 119 ASSERT1(is_launched); | |
| 120 // TODO(omaha): Consider doing something if the browser launch failed. | |
| 121 // Could display a message in English saying it failed for some reason, | |
| 122 // please CTRL-C this dialog, get the URL and paste it into a browser. | |
| 123 } | |
| 124 | |
| 125 handled = true; | |
| 126 return 1; | |
| 127 } | |
| 128 | |
| 129 bool CompleteWnd::MaybeCloseWindow() { | |
| 130 VERIFY1(SUCCEEDED(CloseWindow())); | |
| 131 return true; | |
| 132 } | |
| 133 | |
| 134 void CompleteWnd::DisplayCompletionDialog(bool is_success, | |
| 135 const CString& text, | |
| 136 const CString& help_url) { | |
| 137 CORE_LOG(L3, (_T("[CompleteWnd::DisplayCompletionDialog]") | |
| 138 _T("[success=%d][text=%s]"), is_success, text)); | |
| 139 ASSERT1(!text.IsEmpty()); | |
| 140 | |
| 141 // FormatMessage() converts all LFs to CRLFs, which display as boxes in UI. | |
| 142 // We have also observed some BITS error messages with boxes that may have | |
| 143 // been caused by CRLFs. | |
| 144 // To avoid boxes, convert all CRLFs to LFs, which result in line breaks. | |
| 145 CString display_text = text; | |
| 146 display_text.Replace(_T("\r\n"), _T("\n")); | |
| 147 | |
| 148 if (!OmahaWnd::OnComplete()) { | |
| 149 return; | |
| 150 } | |
| 151 | |
| 152 // It is possible for the OnComplete callback to be called multiple times. | |
| 153 // Subclassing the control multiple times results in a crash, therefore | |
| 154 // unsubclass the control if the control has been created and subclassed | |
| 155 // before. | |
| 156 if (complete_text_ != NULL) { | |
| 157 // TODO(omaha3): I'm not sure this can happen in the polling model. | |
| 158 ASSERT1(false); | |
| 159 | |
| 160 complete_text_->UnsubclassWindow(true); | |
| 161 complete_text_.reset(NULL); | |
| 162 } | |
| 163 | |
| 164 CString s; | |
| 165 if (is_success) { | |
| 166 VERIFY1(s.LoadString(IDS_CLOSE)); | |
| 167 VERIFY1(::SetWindowText(GetDlgItem(IDC_CLOSE), s)); | |
| 168 complete_text_.reset(new StaticEx); | |
| 169 complete_text_->SubclassWindow(GetDlgItem(IDC_COMPLETE_TEXT)); | |
| 170 VERIFY1(::SetWindowText(GetDlgItem(IDC_COMPLETE_TEXT), text)); | |
| 171 } else { | |
| 172 VERIFY1(s.LoadString(IDS_CLOSE)); | |
| 173 VERIFY1(::SetWindowText(GetDlgItem(IDC_CLOSE), s)); | |
| 174 complete_text_.reset(new StaticEx); | |
| 175 complete_text_->SubclassWindow(GetDlgItem(IDC_ERROR_TEXT)); | |
| 176 VERIFY1(::SetWindowText(GetDlgItem(IDC_ERROR_TEXT), display_text)); | |
| 177 VERIFY1(SUCCEEDED(ShowGetHelpLink(help_url))); | |
| 178 } | |
| 179 | |
| 180 VERIFY1(SUCCEEDED(SetControlState(is_success))); | |
| 181 | |
| 182 return; | |
| 183 } | |
| 184 | |
| 185 | |
| 186 HRESULT CompleteWnd::SetControlState(bool is_success) { | |
| 187 SetControlAttributes(is_success ? IDC_COMPLETE_TEXT : IDC_ERROR_TEXT, | |
| 188 kVisibleTextAttributes); | |
| 189 if (is_success) { | |
| 190 SetControlAttributes(IDC_IMAGE, kVisibleImageAttributes); | |
| 191 } else { | |
| 192 SetControlAttributes(IDC_GET_HELP_TEXT, kVisibleTextAttributes); | |
| 193 } | |
| 194 SetControlAttributes(IDC_CLOSE, kDefaultActiveButtonAttributes); | |
| 195 | |
| 196 return S_OK; | |
| 197 } | |
| 198 | |
| 199 // If help_url is empty, no link will be displayed. | |
| 200 HRESULT CompleteWnd::ShowGetHelpLink(const CString& help_url) { | |
| 201 // If there is no event sink, clicking the URL will fail. | |
| 202 ASSERT1(events_sink_); | |
| 203 | |
| 204 if (help_url.IsEmpty()) { | |
| 205 return S_OK; | |
| 206 } | |
| 207 ASSERT1(0 == help_url.Find(_T("http://"))); | |
| 208 | |
| 209 const TCHAR* const kLinkFormat = _T("<b><a=%s>%s</a></b>"); | |
| 210 CString display_text; | |
| 211 VERIFY1(display_text.LoadString(IDS_GET_HELP_TEXT)); | |
| 212 CString link_string; | |
| 213 SafeCStringFormat(&link_string, kLinkFormat, help_url, display_text); | |
| 214 | |
| 215 get_help_text_.reset(new StaticEx); | |
| 216 get_help_text_->SubclassWindow(GetDlgItem(IDC_GET_HELP_TEXT)); | |
| 217 VERIFY1(::SetWindowText(GetDlgItem(IDC_GET_HELP_TEXT), link_string)); | |
| 218 | |
| 219 ++metric_worker_ui_get_help_displayed; | |
| 220 return S_OK; | |
| 221 } | |
| 222 | |
| 223 } // namespace omaha | |
| 224 | |
| OLD | NEW |