1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "remoting/host/continue_window.h"
#include <windows.h>
#include <memory>
#include "base/compiler_specific.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/single_thread_task_runner.h"
#include "base/win/current_module.h"
#include "remoting/host/win/core_resource.h"
namespace remoting {
namespace {
class ContinueWindowWin : public ContinueWindow {
public:
ContinueWindowWin();
ContinueWindowWin(const ContinueWindowWin&) = delete;
ContinueWindowWin& operator=(const ContinueWindowWin&) = delete;
~ContinueWindowWin() override;
protected:
// ContinueWindow overrides.
void ShowUi() override;
void HideUi() override;
private:
static BOOL CALLBACK DialogProc(HWND hwmd,
UINT msg,
WPARAM wParam,
LPARAM lParam);
BOOL OnDialogMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void EndDialog();
HWND hwnd_;
};
ContinueWindowWin::ContinueWindowWin() : hwnd_(nullptr) {}
ContinueWindowWin::~ContinueWindowWin() {
EndDialog();
}
void ContinueWindowWin::ShowUi() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!hwnd_);
hwnd_ = CreateDialogParam(CURRENT_MODULE(), MAKEINTRESOURCE(IDD_CONTINUE),
nullptr, (DLGPROC)DialogProc, (LPARAM)this);
if (!hwnd_) {
LOG(ERROR) << "Unable to create Disconnect dialog for remoting.";
return;
}
ShowWindow(hwnd_, SW_SHOW);
}
void ContinueWindowWin::HideUi() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
EndDialog();
}
BOOL CALLBACK ContinueWindowWin::DialogProc(HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam) {
ContinueWindowWin* win = nullptr;
if (msg == WM_INITDIALOG) {
win = reinterpret_cast<ContinueWindowWin*>(lParam);
CHECK(win);
SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR)win);
} else {
LONG_PTR lp = GetWindowLongPtr(hwnd, DWLP_USER);
win = reinterpret_cast<ContinueWindowWin*>(lp);
}
if (win == nullptr) {
return FALSE;
}
return win->OnDialogMessage(hwnd, msg, wParam, lParam);
}
BOOL ContinueWindowWin::OnDialogMessage(HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
switch (msg) {
case WM_CLOSE:
// Ignore close messages.
return TRUE;
case WM_DESTROY:
// Ensure we don't try to use the HWND anymore.
hwnd_ = nullptr;
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_CONTINUE_DEFAULT:
ContinueSession();
::EndDialog(hwnd, LOWORD(wParam));
hwnd_ = nullptr;
return TRUE;
case IDC_CONTINUE_CANCEL:
DisconnectSession();
::EndDialog(hwnd, LOWORD(wParam));
hwnd_ = nullptr;
return TRUE;
}
}
return FALSE;
}
void ContinueWindowWin::EndDialog() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (hwnd_) {
::DestroyWindow(hwnd_);
hwnd_ = nullptr;
}
}
} // namespace
// static
std::unique_ptr<HostWindow> HostWindow::CreateContinueWindow() {
return std::make_unique<ContinueWindowWin>();
}
} // namespace remoting
|