|  | // Copyright (c) 2015 The Chromium 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 "components/browser_watcher/endsession_watcher_window_win.h" | 
|  |  | 
|  | #include "base/logging.h" | 
|  | #include "base/win/wrapped_window_proc.h" | 
|  |  | 
|  | namespace browser_watcher { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | const wchar_t kWindowClassName[] = L"Chrome_BrowserWatcherWindow"; | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | EndSessionWatcherWindow::EndSessionWatcherWindow( | 
|  | const EndSessionMessageCallback& on_end_session_message) : | 
|  | on_end_session_message_(on_end_session_message) { | 
|  | WNDCLASSEX window_class = {0}; | 
|  | base::win::InitializeWindowClass( | 
|  | kWindowClassName, | 
|  | &base::win::WrappedWindowProc<EndSessionWatcherWindow::WndProcThunk>, | 
|  | 0, 0, 0, NULL, NULL, NULL, NULL, NULL, | 
|  | &window_class); | 
|  | instance_ = window_class.hInstance; | 
|  | ATOM clazz = ::RegisterClassEx(&window_class); | 
|  | DCHECK(clazz); | 
|  |  | 
|  | // TODO(siggi): will a message window do here? | 
|  | window_ = ::CreateWindow(kWindowClassName, | 
|  | 0, 0, 0, 0, 0, 0, 0, 0, instance_, 0); | 
|  | ::SetWindowLongPtr(window_, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this)); | 
|  | DCHECK_EQ(::GetWindowLongPtr(window_, GWLP_USERDATA), | 
|  | reinterpret_cast<LONG_PTR>(this)); | 
|  | } | 
|  |  | 
|  | EndSessionWatcherWindow::~EndSessionWatcherWindow() { | 
|  | if (window_) { | 
|  | ::DestroyWindow(window_); | 
|  | ::UnregisterClass(kWindowClassName, instance_); | 
|  | } | 
|  | } | 
|  |  | 
|  | LRESULT EndSessionWatcherWindow::OnEndSessionMessage(UINT message, | 
|  | WPARAM wparam, | 
|  | LPARAM lparam) { | 
|  | on_end_session_message_.Run(message, lparam); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | LRESULT CALLBACK EndSessionWatcherWindow::WndProcThunk(HWND hwnd, | 
|  | UINT message, | 
|  | WPARAM wparam, | 
|  | LPARAM lparam) { | 
|  | EndSessionWatcherWindow* msg_wnd = | 
|  | reinterpret_cast<EndSessionWatcherWindow*>( | 
|  | ::GetWindowLongPtr(hwnd, GWLP_USERDATA)); | 
|  | if (msg_wnd) | 
|  | return msg_wnd->WndProc(hwnd, message, wparam, lparam); | 
|  |  | 
|  | return ::DefWindowProc(hwnd, message, wparam, lparam); | 
|  | } | 
|  |  | 
|  | LRESULT EndSessionWatcherWindow::WndProc(HWND hwnd, | 
|  | UINT message, | 
|  | WPARAM wparam, | 
|  | LPARAM lparam) { | 
|  | switch (message) { | 
|  | case WM_ENDSESSION: | 
|  | case WM_QUERYENDSESSION: | 
|  | return OnEndSessionMessage(message, wparam, lparam); | 
|  | default: | 
|  | break; | 
|  | } | 
|  |  | 
|  | return ::DefWindowProc(hwnd, message, wparam, lparam); | 
|  | } | 
|  |  | 
|  | }  // namespace browser_watcher |