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

Side by Side Diff: device/hid/hid_service.cc

Issue 825523003: Convert HidDeviceInfo from a struct to a refcounted class. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added TODO to remove friend class definitions. Created 5 years, 11 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 unified diff | Download patch
« no previous file with comments | « device/hid/hid_service.h ('k') | device/hid/hid_service_linux.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "device/hid/hid_service.h" 5 #include "device/hid/hid_service.h"
6 6
7 #include "base/at_exit.h" 7 #include "base/at_exit.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "base/stl_util.h" 11 #include "base/stl_util.h"
12 12
13 #if defined(OS_LINUX) && defined(USE_UDEV) 13 #if defined(OS_LINUX) && defined(USE_UDEV)
14 #include "device/hid/hid_service_linux.h" 14 #include "device/hid/hid_service_linux.h"
15 #elif defined(OS_MACOSX) 15 #elif defined(OS_MACOSX)
16 #include "device/hid/hid_service_mac.h" 16 #include "device/hid/hid_service_mac.h"
17 #else 17 #else
18 #include "device/hid/hid_service_win.h" 18 #include "device/hid/hid_service_win.h"
19 #endif 19 #endif
20 20
21 namespace device { 21 namespace device {
22 22
23 namespace { 23 namespace {
24 24
25 HidService* g_service; 25 HidService* g_service;
26 } 26 }
27 27
28 void HidService::Observer::OnDeviceAdded(
29 scoped_refptr<HidDeviceInfo> device_info) {
30 }
31
32 void HidService::Observer::OnDeviceRemoved(
33 scoped_refptr<HidDeviceInfo> device_info) {
34 }
35
28 HidService* HidService::GetInstance( 36 HidService* HidService::GetInstance(
29 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) { 37 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) {
30 if (g_service == NULL) { 38 if (g_service == NULL) {
31 #if defined(OS_LINUX) && defined(USE_UDEV) 39 #if defined(OS_LINUX) && defined(USE_UDEV)
32 g_service = new HidServiceLinux(file_task_runner); 40 g_service = new HidServiceLinux(file_task_runner);
33 #elif defined(OS_MACOSX) 41 #elif defined(OS_MACOSX)
34 g_service = new HidServiceMac(file_task_runner); 42 g_service = new HidServiceMac(file_task_runner);
35 #elif defined(OS_WIN) 43 #elif defined(OS_WIN)
36 g_service = new HidServiceWin(); 44 g_service = new HidServiceWin();
37 #endif 45 #endif
38 if (g_service != nullptr) { 46 if (g_service != nullptr) {
39 base::AtExitManager::RegisterTask(base::Bind( 47 base::AtExitManager::RegisterTask(base::Bind(
40 &base::DeletePointer<HidService>, base::Unretained(g_service))); 48 &base::DeletePointer<HidService>, base::Unretained(g_service)));
41 } 49 }
42 } 50 }
43 return g_service; 51 return g_service;
44 } 52 }
45 53
46 void HidService::SetInstanceForTest(HidService* instance) { 54 void HidService::SetInstanceForTest(HidService* instance) {
47 DCHECK(!g_service); 55 DCHECK(!g_service);
48 g_service = instance; 56 g_service = instance;
49 base::AtExitManager::RegisterTask(base::Bind(&base::DeletePointer<HidService>, 57 base::AtExitManager::RegisterTask(base::Bind(&base::DeletePointer<HidService>,
50 base::Unretained(g_service))); 58 base::Unretained(g_service)));
51 } 59 }
52 60
53 void HidService::GetDevices(const GetDevicesCallback& callback) { 61 void HidService::GetDevices(const GetDevicesCallback& callback) {
54 DCHECK(thread_checker_.CalledOnValidThread()); 62 DCHECK(thread_checker_.CalledOnValidThread());
55 if (enumeration_ready_) { 63 if (enumeration_ready_) {
56 std::vector<HidDeviceInfo> devices; 64 std::vector<scoped_refptr<HidDeviceInfo>> devices;
57 for (const auto& map_entry : devices_) { 65 for (const auto& map_entry : devices_) {
58 devices.push_back(map_entry.second); 66 devices.push_back(map_entry.second);
59 } 67 }
60 base::MessageLoop::current()->PostTask(FROM_HERE, 68 base::MessageLoop::current()->PostTask(FROM_HERE,
61 base::Bind(callback, devices)); 69 base::Bind(callback, devices));
62 } else { 70 } else {
63 pending_enumerations_.push_back(callback); 71 pending_enumerations_.push_back(callback);
64 } 72 }
65 } 73 }
66 74
67 void HidService::AddObserver(HidService::Observer* observer) { 75 void HidService::AddObserver(HidService::Observer* observer) {
68 observer_list_.AddObserver(observer); 76 observer_list_.AddObserver(observer);
69 } 77 }
70 78
71 void HidService::RemoveObserver(HidService::Observer* observer) { 79 void HidService::RemoveObserver(HidService::Observer* observer) {
72 observer_list_.RemoveObserver(observer); 80 observer_list_.RemoveObserver(observer);
73 } 81 }
74 82
75 // Fills in the device info struct of the given device_id. 83 // Fills in the device info struct of the given device_id.
76 bool HidService::GetDeviceInfo(const HidDeviceId& device_id, 84 scoped_refptr<HidDeviceInfo> HidService::GetDeviceInfo(
77 HidDeviceInfo* info) const { 85 const HidDeviceId& device_id) const {
78 DCHECK(thread_checker_.CalledOnValidThread()); 86 DCHECK(thread_checker_.CalledOnValidThread());
79 DeviceMap::const_iterator it = devices_.find(device_id); 87 DeviceMap::const_iterator it = devices_.find(device_id);
80 if (it == devices_.end()) 88 if (it == devices_.end()) {
81 return false; 89 return nullptr;
82 *info = it->second; 90 }
83 return true; 91 return it->second;
84 } 92 }
85 93
86 HidService::HidService() : enumeration_ready_(false) { 94 HidService::HidService() : enumeration_ready_(false) {
87 } 95 }
88 96
89 HidService::~HidService() { 97 HidService::~HidService() {
90 DCHECK(thread_checker_.CalledOnValidThread()); 98 DCHECK(thread_checker_.CalledOnValidThread());
91 } 99 }
92 100
93 void HidService::AddDevice(const HidDeviceInfo& info) { 101 void HidService::AddDevice(scoped_refptr<HidDeviceInfo> device_info) {
94 DCHECK(thread_checker_.CalledOnValidThread()); 102 DCHECK(thread_checker_.CalledOnValidThread());
95 if (!ContainsKey(devices_, info.device_id)) { 103 if (!ContainsKey(devices_, device_info->device_id())) {
96 devices_[info.device_id] = info; 104 devices_[device_info->device_id()] = device_info;
97 105
98 if (enumeration_ready_) { 106 if (enumeration_ready_) {
99 FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceAdded(info)); 107 FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceAdded(device_info));
100 } 108 }
101 } 109 }
102 } 110 }
103 111
104 void HidService::RemoveDevice(const HidDeviceId& device_id) { 112 void HidService::RemoveDevice(const HidDeviceId& device_id) {
105 DCHECK(thread_checker_.CalledOnValidThread()); 113 DCHECK(thread_checker_.CalledOnValidThread());
106 DeviceMap::iterator it = devices_.find(device_id); 114 DeviceMap::iterator it = devices_.find(device_id);
107 if (it != devices_.end()) { 115 if (it != devices_.end()) {
108 if (enumeration_ready_) { 116 if (enumeration_ready_) {
109 FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceRemoved(it->second)); 117 FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceRemoved(it->second));
110 } 118 }
111 devices_.erase(it); 119 devices_.erase(it);
112 } 120 }
113 } 121 }
114 122
115 void HidService::FirstEnumerationComplete() { 123 void HidService::FirstEnumerationComplete() {
116 enumeration_ready_ = true; 124 enumeration_ready_ = true;
117 125
118 if (!pending_enumerations_.empty()) { 126 if (!pending_enumerations_.empty()) {
119 std::vector<HidDeviceInfo> devices; 127 std::vector<scoped_refptr<HidDeviceInfo>> devices;
120 for (const auto& map_entry : devices_) { 128 for (const auto& map_entry : devices_) {
121 devices.push_back(map_entry.second); 129 devices.push_back(map_entry.second);
122 } 130 }
123 131
124 for (const GetDevicesCallback& callback : pending_enumerations_) { 132 for (const GetDevicesCallback& callback : pending_enumerations_) {
125 callback.Run(devices); 133 callback.Run(devices);
126 } 134 }
127 pending_enumerations_.clear(); 135 pending_enumerations_.clear();
128 } 136 }
129 } 137 }
130 138
131 } // namespace device 139 } // namespace device
OLDNEW
« no previous file with comments | « device/hid/hid_service.h ('k') | device/hid/hid_service_linux.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698