| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/storage_monitor/volume_mount_watcher_win.h" | 5 #include "chrome/browser/storage_monitor/volume_mount_watcher_win.h" |
| 6 | 6 |
| 7 #include <windows.h> | 7 #include <windows.h> |
| 8 #include <dbt.h> | 8 #include <dbt.h> |
| 9 #include <fileapi.h> | 9 #include <fileapi.h> |
| 10 | 10 |
| 11 #include "base/bind_helpers.h" |
| 11 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
| 12 #include "base/string_util.h" | 13 #include "base/string_util.h" |
| 13 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
| 14 #include "base/utf_string_conversions.h" | 15 #include "base/utf_string_conversions.h" |
| 15 #include "chrome/browser/storage_monitor/media_device_notifications_utils.h" | 16 #include "chrome/browser/storage_monitor/media_device_notifications_utils.h" |
| 16 #include "chrome/browser/storage_monitor/media_storage_util.h" | 17 #include "chrome/browser/storage_monitor/media_storage_util.h" |
| 17 #include "content/public/browser/browser_thread.h" | 18 #include "content/public/browser/browser_thread.h" |
| 18 | 19 |
| 19 using content::BrowserThread; | 20 using content::BrowserThread; |
| 20 | 21 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 } | 168 } |
| 168 | 169 |
| 169 } // namespace | 170 } // namespace |
| 170 | 171 |
| 171 namespace chrome { | 172 namespace chrome { |
| 172 | 173 |
| 173 const int kWorkerPoolNumThreads = 3; | 174 const int kWorkerPoolNumThreads = 3; |
| 174 const char* kWorkerPoolNamePrefix = "DeviceInfoPool"; | 175 const char* kWorkerPoolNamePrefix = "DeviceInfoPool"; |
| 175 | 176 |
| 176 VolumeMountWatcherWin::VolumeMountWatcherWin() | 177 VolumeMountWatcherWin::VolumeMountWatcherWin() |
| 177 : device_info_worker_pool_(new base::SequencedWorkerPool( | 178 : weak_factory_(this), |
| 178 kWorkerPoolNumThreads, kWorkerPoolNamePrefix)), | |
| 179 weak_factory_(this), | |
| 180 notifications_(NULL) { | 179 notifications_(NULL) { |
| 181 get_attached_devices_callback_ = base::Bind(&GetAttachedDevices); | 180 get_attached_devices_callback_ = base::Bind(&GetAttachedDevices); |
| 182 get_device_details_callback_ = base::Bind(&GetDeviceDetails); | 181 get_device_details_callback_ = base::Bind(&GetDeviceDetails); |
| 182 |
| 183 device_info_worker_pool_ = new base::SequencedWorkerPool( |
| 184 kWorkerPoolNumThreads, kWorkerPoolNamePrefix); |
| 185 task_runner_ = |
| 186 device_info_worker_pool_->GetSequencedTaskRunnerWithShutdownBehavior( |
| 187 device_info_worker_pool_->GetSequenceToken(), |
| 188 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); |
| 183 } | 189 } |
| 184 | 190 |
| 185 // static | 191 // static |
| 186 base::FilePath VolumeMountWatcherWin::DriveNumberToFilePath(int drive_number) { | 192 base::FilePath VolumeMountWatcherWin::DriveNumberToFilePath(int drive_number) { |
| 187 if (drive_number < 0 || drive_number > 25) | 193 if (drive_number < 0 || drive_number > 25) |
| 188 return base::FilePath(); | 194 return base::FilePath(); |
| 189 string16 path(L"_:\\"); | 195 string16 path(L"_:\\"); |
| 190 path[0] = L'A' + drive_number; | 196 path[0] = L'A' + drive_number; |
| 191 return base::FilePath(path); | 197 return base::FilePath(path); |
| 192 } | 198 } |
| 193 | 199 |
| 194 // In order to get all the weak pointers created on the UI thread, and doing | 200 // In order to get all the weak pointers created on the UI thread, and doing |
| 195 // synchronous Windows calls in the worker pool, this kicks off a chain of | 201 // synchronous Windows calls in the worker pool, this kicks off a chain of |
| 196 // events which will | 202 // events which will |
| 197 // a) Enumerate attached devices | 203 // a) Enumerate attached devices |
| 198 // b) Create weak pointers for which to send completion signals from | 204 // b) Create weak pointers for which to send completion signals from |
| 199 // c) Retrieve metadata on the volumes and then | 205 // c) Retrieve metadata on the volumes and then |
| 200 // d) Notify that metadata to listeners. | 206 // d) Notify that metadata to listeners. |
| 201 void VolumeMountWatcherWin::Init() { | 207 void VolumeMountWatcherWin::Init() { |
| 202 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 208 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 203 | 209 |
| 204 // When VolumeMountWatcherWin is created, the message pumps are not running | 210 // When VolumeMountWatcherWin is created, the message pumps are not running |
| 205 // so a posted task from the constructor would never run. Therefore, do all | 211 // so a posted task from the constructor would never run. Therefore, do all |
| 206 // the initializations here. | 212 // the initializations here. |
| 207 device_info_worker_pool_->PostTask(FROM_HERE, base::Bind( | 213 // Disabled pending resolution of http://crbug.com/173953 |
| 208 &FindExistingDevicesAndAdd, get_attached_devices_callback_, | 214 // task_runner_->PostTask(FROM_HERE, base::Bind( |
| 209 weak_factory_.GetWeakPtr())); | 215 // &FindExistingDevicesAndAdd, get_attached_devices_callback_, |
| 216 // weak_factory_.GetWeakPtr())); |
| 217 |
| 218 // This task is a mystery. Without it, the ToastCrasher test fails, but |
| 219 // it isn't clear why. Need to move pool creation later? |
| 220 task_runner_->PostTask(FROM_HERE, base::Bind(&base::DoNothing)); |
| 210 } | 221 } |
| 211 | 222 |
| 212 // static | 223 // static |
| 213 void VolumeMountWatcherWin::FindExistingDevicesAndAdd( | 224 void VolumeMountWatcherWin::FindExistingDevicesAndAdd( |
| 214 base::Callback<std::vector<base::FilePath>(void)> | 225 base::Callback<std::vector<base::FilePath>(void)> |
| 215 get_attached_devices_callback, | 226 get_attached_devices_callback, |
| 216 base::WeakPtr<chrome::VolumeMountWatcherWin> volume_watcher) { | 227 base::WeakPtr<chrome::VolumeMountWatcherWin> volume_watcher) { |
| 217 std::vector<base::FilePath> removable_devices = | 228 std::vector<base::FilePath> removable_devices = |
| 218 get_attached_devices_callback.Run(); | 229 get_attached_devices_callback.Run(); |
| 219 | 230 |
| 220 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( | 231 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( |
| 221 &chrome::VolumeMountWatcherWin::AddDevicesOnUIThread, | 232 &chrome::VolumeMountWatcherWin::AddDevicesOnUIThread, |
| 222 volume_watcher, removable_devices)); | 233 volume_watcher, removable_devices)); |
| 223 } | 234 } |
| 224 | 235 |
| 225 void VolumeMountWatcherWin::AddDevicesOnUIThread( | 236 void VolumeMountWatcherWin::AddDevicesOnUIThread( |
| 226 std::vector<base::FilePath> removable_devices) { | 237 std::vector<base::FilePath> removable_devices) { |
| 227 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 238 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 228 | 239 |
| 229 scoped_refptr<base::TaskRunner> runner = | |
| 230 device_info_worker_pool_->GetTaskRunnerWithShutdownBehavior( | |
| 231 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); | |
| 232 for (size_t i = 0; i < removable_devices.size(); i++) { | 240 for (size_t i = 0; i < removable_devices.size(); i++) { |
| 233 if (ContainsKey(pending_device_checks_, removable_devices[i])) | 241 if (ContainsKey(pending_device_checks_, removable_devices[i])) |
| 234 continue; | 242 continue; |
| 235 pending_device_checks_.insert(removable_devices[i]); | 243 pending_device_checks_.insert(removable_devices[i]); |
| 236 runner->PostTask(FROM_HERE, | 244 task_runner_->PostTask(FROM_HERE, |
| 237 base::Bind(&RetrieveInfoForDeviceAndAdd, | 245 base::Bind(&RetrieveInfoForDeviceAndAdd, |
| 238 removable_devices[i], | 246 removable_devices[i], |
| 239 get_device_details_callback_, | 247 get_device_details_callback_, |
| 240 weak_factory_.GetWeakPtr())); | 248 weak_factory_.GetWeakPtr())); |
| 241 } | 249 } |
| 242 } | 250 } |
| 243 | 251 |
| 244 // static | 252 // static |
| 245 void VolumeMountWatcherWin::RetrieveInfoForDeviceAndAdd( | 253 void VolumeMountWatcherWin::RetrieveInfoForDeviceAndAdd( |
| 246 const base::FilePath& device_path, | 254 const base::FilePath& device_path, |
| 247 base::Callback<bool(const base::FilePath&, string16*, std::string*, | 255 base::Callback<bool(const base::FilePath&, string16*, std::string*, |
| 248 string16*, bool*, uint64*)> get_device_details_callback, | 256 string16*, bool*, uint64*)> get_device_details_callback, |
| 249 base::WeakPtr<chrome::VolumeMountWatcherWin> volume_watcher) { | 257 base::WeakPtr<chrome::VolumeMountWatcherWin> volume_watcher) { |
| 250 string16 device_location; | 258 string16 device_location; |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 // If the device isn't type removable (like a CD), it won't be there. | 406 // If the device isn't type removable (like a CD), it won't be there. |
| 399 if (device_info == device_metadata_.end()) | 407 if (device_info == device_metadata_.end()) |
| 400 return; | 408 return; |
| 401 | 409 |
| 402 if (notifications_) | 410 if (notifications_) |
| 403 notifications_->ProcessDetach(device_info->second.device_id); | 411 notifications_->ProcessDetach(device_info->second.device_id); |
| 404 device_metadata_.erase(device_info); | 412 device_metadata_.erase(device_info); |
| 405 } | 413 } |
| 406 | 414 |
| 407 } // namespace chrome | 415 } // namespace chrome |
| OLD | NEW |