| Index: device/core/device_monitor_win.cc
|
| diff --git a/device/core/device_monitor_win.cc b/device/core/device_monitor_win.cc
|
| deleted file mode 100644
|
| index adeb3fab15db645fbd130c2ae52da7ea908e29af..0000000000000000000000000000000000000000
|
| --- a/device/core/device_monitor_win.cc
|
| +++ /dev/null
|
| @@ -1,210 +0,0 @@
|
| -// Copyright 2014 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 "device/core/device_monitor_win.h"
|
| -
|
| -#include <dbt.h>
|
| -#include <windows.h>
|
| -
|
| -#include <map>
|
| -#include <memory>
|
| -
|
| -#include "base/at_exit.h"
|
| -#include "base/bind.h"
|
| -#include "base/macros.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/sys_string_conversions.h"
|
| -#include "base/win/message_window.h"
|
| -
|
| -namespace device {
|
| -
|
| -class DeviceMonitorMessageWindow;
|
| -
|
| -namespace {
|
| -
|
| -const wchar_t kWindowClassName[] = L"DeviceMonitorMessageWindow";
|
| -DeviceMonitorMessageWindow* g_message_window;
|
| -
|
| -// Provides basic comparability for GUIDs so that they can be used as keys to an
|
| -// STL map.
|
| -struct CompareGUID {
|
| - bool operator()(const GUID& a, const GUID& b) const {
|
| - return memcmp(&a, &b, sizeof a) < 0;
|
| - }
|
| -};
|
| -}
|
| -
|
| -// This singleton class manages a shared message window for all registered
|
| -// device notification observers. It vends one instance of DeviceManagerWin for
|
| -// each unique GUID it sees.
|
| -class DeviceMonitorMessageWindow {
|
| - public:
|
| - static DeviceMonitorMessageWindow* GetInstance() {
|
| - if (!g_message_window) {
|
| - g_message_window = new DeviceMonitorMessageWindow();
|
| - if (g_message_window->Init()) {
|
| - base::AtExitManager::RegisterTask(
|
| - base::Bind(&base::DeletePointer<DeviceMonitorMessageWindow>,
|
| - base::Unretained(g_message_window)));
|
| - } else {
|
| - delete g_message_window;
|
| - g_message_window = nullptr;
|
| - }
|
| - }
|
| - return g_message_window;
|
| - }
|
| -
|
| - DeviceMonitorWin* GetForDeviceInterface(const GUID& device_interface) {
|
| - std::unique_ptr<DeviceMonitorWin>& device_monitor =
|
| - device_monitors_[device_interface];
|
| - if (!device_monitor) {
|
| - device_monitor.reset(new DeviceMonitorWin());
|
| - }
|
| - return device_monitor.get();
|
| - }
|
| -
|
| - DeviceMonitorWin* GetForAllInterfaces() { return &all_device_monitor_; }
|
| -
|
| - private:
|
| - friend void base::DeletePointer<DeviceMonitorMessageWindow>(
|
| - DeviceMonitorMessageWindow* message_window);
|
| -
|
| - DeviceMonitorMessageWindow() {
|
| - }
|
| -
|
| - ~DeviceMonitorMessageWindow() {
|
| - if (notify_handle_) {
|
| - UnregisterDeviceNotification(notify_handle_);
|
| - }
|
| - }
|
| -
|
| - bool Init() {
|
| - window_.reset(new base::win::MessageWindow());
|
| - if (!window_->CreateNamed(
|
| - base::Bind(&DeviceMonitorMessageWindow::HandleMessage,
|
| - base::Unretained(this)),
|
| - base::string16(kWindowClassName))) {
|
| - LOG(ERROR) << "Failed to create message window: " << kWindowClassName;
|
| - return false;
|
| - }
|
| -
|
| - DEV_BROADCAST_DEVICEINTERFACE db = {sizeof(DEV_BROADCAST_DEVICEINTERFACE),
|
| - DBT_DEVTYP_DEVICEINTERFACE};
|
| - notify_handle_ = RegisterDeviceNotification(
|
| - window_->hwnd(), &db,
|
| - DEVICE_NOTIFY_WINDOW_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
|
| - if (!notify_handle_) {
|
| - PLOG(ERROR) << "Failed to register for device notifications";
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| - }
|
| -
|
| - bool HandleMessage(UINT message,
|
| - WPARAM wparam,
|
| - LPARAM lparam,
|
| - LRESULT* result) {
|
| - if (message == WM_DEVICECHANGE &&
|
| - (wparam == DBT_DEVICEARRIVAL || wparam == DBT_DEVICEREMOVECOMPLETE)) {
|
| - DEV_BROADCAST_HDR* hdr = reinterpret_cast<DEV_BROADCAST_HDR*>(lparam);
|
| - if (hdr->dbch_devicetype != DBT_DEVTYP_DEVICEINTERFACE)
|
| - return false;
|
| -
|
| - DEV_BROADCAST_DEVICEINTERFACE* db =
|
| - reinterpret_cast<DEV_BROADCAST_DEVICEINTERFACE*>(hdr);
|
| -
|
| - DeviceMonitorWin* device_monitor = nullptr;
|
| - const auto& map_entry = device_monitors_.find(db->dbcc_classguid);
|
| - if (map_entry != device_monitors_.end())
|
| - device_monitor = map_entry->second.get();
|
| -
|
| - std::string device_path(base::SysWideToUTF8(db->dbcc_name));
|
| - DCHECK(base::IsStringASCII(device_path));
|
| - device_path = base::ToLowerASCII(device_path);
|
| -
|
| - if (wparam == DBT_DEVICEARRIVAL) {
|
| - if (device_monitor) {
|
| - device_monitor->NotifyDeviceAdded(db->dbcc_classguid, device_path);
|
| - }
|
| - all_device_monitor_.NotifyDeviceAdded(db->dbcc_classguid, device_path);
|
| - } else if (wparam == DBT_DEVICEREMOVECOMPLETE) {
|
| - if (device_monitor) {
|
| - device_monitor->NotifyDeviceRemoved(db->dbcc_classguid, device_path);
|
| - }
|
| - all_device_monitor_.NotifyDeviceRemoved(db->dbcc_classguid,
|
| - device_path);
|
| - }
|
| - *result = NULL;
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - std::map<GUID, std::unique_ptr<DeviceMonitorWin>, CompareGUID>
|
| - device_monitors_;
|
| - DeviceMonitorWin all_device_monitor_;
|
| - std::unique_ptr<base::win::MessageWindow> window_;
|
| - HDEVNOTIFY notify_handle_ = NULL;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DeviceMonitorMessageWindow);
|
| -};
|
| -
|
| -void DeviceMonitorWin::Observer::OnDeviceAdded(const GUID& class_guid,
|
| - const std::string& device_path) {
|
| -}
|
| -
|
| -void DeviceMonitorWin::Observer::OnDeviceRemoved(
|
| - const GUID& class_guid,
|
| - const std::string& device_path) {
|
| -}
|
| -
|
| -// static
|
| -DeviceMonitorWin* DeviceMonitorWin::GetForDeviceInterface(
|
| - const GUID& device_interface) {
|
| - DeviceMonitorMessageWindow* message_window =
|
| - DeviceMonitorMessageWindow::GetInstance();
|
| - if (message_window) {
|
| - return message_window->GetForDeviceInterface(device_interface);
|
| - }
|
| - return nullptr;
|
| -}
|
| -
|
| -// static
|
| -DeviceMonitorWin* DeviceMonitorWin::GetForAllInterfaces() {
|
| - DeviceMonitorMessageWindow* message_window =
|
| - DeviceMonitorMessageWindow::GetInstance();
|
| - if (message_window) {
|
| - return message_window->GetForAllInterfaces();
|
| - }
|
| - return nullptr;
|
| -}
|
| -
|
| -DeviceMonitorWin::~DeviceMonitorWin() {
|
| -}
|
| -
|
| -void DeviceMonitorWin::AddObserver(Observer* observer) {
|
| - observer_list_.AddObserver(observer);
|
| -}
|
| -
|
| -void DeviceMonitorWin::RemoveObserver(Observer* observer) {
|
| - observer_list_.RemoveObserver(observer);
|
| -}
|
| -
|
| -DeviceMonitorWin::DeviceMonitorWin() {
|
| -}
|
| -
|
| -void DeviceMonitorWin::NotifyDeviceAdded(const GUID& class_guid,
|
| - const std::string& device_path) {
|
| - FOR_EACH_OBSERVER(Observer, observer_list_,
|
| - OnDeviceAdded(class_guid, device_path));
|
| -}
|
| -
|
| -void DeviceMonitorWin::NotifyDeviceRemoved(const GUID& class_guid,
|
| - const std::string& device_path) {
|
| - FOR_EACH_OBSERVER(Observer, observer_list_,
|
| - OnDeviceRemoved(class_guid, device_path));
|
| -}
|
| -
|
| -} // namespace device
|
|
|