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 // StorageMonitorLinux implementation. | 5 // StorageMonitorLinux implementation. |
6 | 6 |
7 #include "chrome/browser/storage_monitor/storage_monitor_linux.h" | 7 #include "chrome/browser/storage_monitor/storage_monitor_linux.h" |
8 | 8 |
9 #include <mntent.h> | 9 #include <mntent.h> |
10 #include <stdio.h> | 10 #include <stdio.h> |
11 | 11 |
12 #include <list> | 12 #include <list> |
13 | 13 |
14 #include "base/basictypes.h" | 14 #include "base/basictypes.h" |
15 #include "base/bind.h" | 15 #include "base/bind.h" |
16 #include "base/command_line.h" | 16 #include "base/command_line.h" |
17 #include "base/metrics/histogram.h" | 17 #include "base/metrics/histogram.h" |
18 #include "base/stl_util.h" | 18 #include "base/stl_util.h" |
19 #include "base/string_util.h" | 19 #include "base/string_util.h" |
20 #include "base/strings/string_number_conversions.h" | 20 #include "base/strings/string_number_conversions.h" |
21 #include "base/utf_string_conversions.h" | 21 #include "base/utf_string_conversions.h" |
22 #include "chrome/browser/storage_monitor/media_storage_util.h" | 22 #include "chrome/browser/storage_monitor/media_storage_util.h" |
23 #include "chrome/browser/storage_monitor/media_transfer_protocol_device_observer
_linux.h" | 23 #include "chrome/browser/storage_monitor/media_transfer_protocol_device_observer
_linux.h" |
24 #include "chrome/browser/storage_monitor/removable_device_constants.h" | 24 #include "chrome/browser/storage_monitor/removable_device_constants.h" |
| 25 #include "chrome/browser/storage_monitor/test_media_transfer_protocol_manager_li
nux.h" |
25 #include "chrome/browser/storage_monitor/udev_util_linux.h" | 26 #include "chrome/browser/storage_monitor/udev_util_linux.h" |
26 #include "chrome/common/chrome_switches.h" | 27 #include "chrome/common/chrome_switches.h" |
27 #include "device/media_transfer_protocol/media_transfer_protocol_manager.h" | 28 #include "device/media_transfer_protocol/media_transfer_protocol_manager.h" |
28 | 29 |
29 namespace chrome { | 30 namespace chrome { |
30 | 31 |
31 using content::BrowserThread; | 32 using content::BrowserThread; |
32 typedef MtabWatcherLinux::MountPointDeviceMap MountPointDeviceMap; | 33 typedef MtabWatcherLinux::MountPointDeviceMap MountPointDeviceMap; |
33 | 34 |
34 namespace { | 35 namespace { |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 return new MtabWatcherLinux(mtab_path, delegate); | 226 return new MtabWatcherLinux(mtab_path, delegate); |
226 } | 227 } |
227 | 228 |
228 } // namespace | 229 } // namespace |
229 | 230 |
230 StorageMonitorLinux::StorageMonitorLinux(const base::FilePath& path) | 231 StorageMonitorLinux::StorageMonitorLinux(const base::FilePath& path) |
231 : mtab_path_(path), | 232 : mtab_path_(path), |
232 get_device_info_callback_(base::Bind(&GetDeviceInfo)), | 233 get_device_info_callback_(base::Bind(&GetDeviceInfo)), |
233 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { | 234 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { |
234 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 235 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 236 |
| 237 // TODO(thestig) Do not do this here. Do it in TestingBrowserProcess when |
| 238 // BrowserProcess owns StorageMonitor. |
| 239 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType)) { |
| 240 SetMediaTransferProtocolManagerForTest( |
| 241 new TestMediaTransferProtocolManagerLinux()); |
| 242 } |
235 } | 243 } |
236 | 244 |
237 StorageMonitorLinux::~StorageMonitorLinux() { | 245 StorageMonitorLinux::~StorageMonitorLinux() { |
238 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 246 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
239 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType)) | |
240 device::MediaTransferProtocolManager::Shutdown(); | |
241 } | 247 } |
242 | 248 |
243 void StorageMonitorLinux::Init() { | 249 void StorageMonitorLinux::Init() { |
244 DCHECK(!mtab_path_.empty()); | 250 DCHECK(!mtab_path_.empty()); |
245 | 251 |
246 BrowserThread::PostTaskAndReplyWithResult( | 252 BrowserThread::PostTaskAndReplyWithResult( |
247 BrowserThread::FILE, FROM_HERE, | 253 BrowserThread::FILE, FROM_HERE, |
248 base::Bind(&CreateMtabWatcherLinuxOnFileThread, | 254 base::Bind(&CreateMtabWatcherLinuxOnFileThread, |
249 mtab_path_, | 255 mtab_path_, |
250 weak_ptr_factory_.GetWeakPtr()), | 256 weak_ptr_factory_.GetWeakPtr()), |
251 base::Bind(&StorageMonitorLinux::OnMtabWatcherCreated, | 257 base::Bind(&StorageMonitorLinux::OnMtabWatcherCreated, |
252 weak_ptr_factory_.GetWeakPtr())); | 258 weak_ptr_factory_.GetWeakPtr())); |
253 | 259 |
254 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType)) { | 260 if (!media_transfer_protocol_manager_) { |
255 scoped_refptr<base::MessageLoopProxy> loop_proxy; | 261 scoped_refptr<base::MessageLoopProxy> loop_proxy = |
256 loop_proxy = content::BrowserThread::GetMessageLoopProxyForThread( | 262 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE); |
257 content::BrowserThread::FILE); | 263 media_transfer_protocol_manager_.reset( |
258 device::MediaTransferProtocolManager::Initialize(loop_proxy); | 264 device::MediaTransferProtocolManager::Initialize(loop_proxy)); |
| 265 } |
259 | 266 |
260 media_transfer_protocol_device_observer_.reset( | 267 media_transfer_protocol_device_observer_.reset( |
261 new MediaTransferProtocolDeviceObserverLinux(receiver())); | 268 new MediaTransferProtocolDeviceObserverLinux(receiver())); |
262 } | |
263 } | 269 } |
264 | 270 |
265 bool StorageMonitorLinux::GetStorageInfoForPath( | 271 bool StorageMonitorLinux::GetStorageInfoForPath( |
266 const base::FilePath& path, | 272 const base::FilePath& path, |
267 StorageInfo* device_info) const { | 273 StorageInfo* device_info) const { |
268 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 274 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
269 | 275 |
270 // TODO(thestig) |media_transfer_protocol_device_observer_| should always be | 276 // TODO(thestig) |media_transfer_protocol_device_observer_| should always be |
271 // valid. | 277 // valid. |
272 if (media_transfer_protocol_device_observer_ && | 278 if (media_transfer_protocol_device_observer_ && |
(...skipping 10 matching lines...) Expand all Loading... |
283 current = current.DirName(); | 289 current = current.DirName(); |
284 | 290 |
285 MountMap::const_iterator mount_info = mount_info_map_.find(current); | 291 MountMap::const_iterator mount_info = mount_info_map_.find(current); |
286 if (mount_info == mount_info_map_.end()) | 292 if (mount_info == mount_info_map_.end()) |
287 return false; | 293 return false; |
288 if (device_info) | 294 if (device_info) |
289 *device_info = mount_info->second.storage_info; | 295 *device_info = mount_info->second.storage_info; |
290 return true; | 296 return true; |
291 } | 297 } |
292 | 298 |
| 299 device::MediaTransferProtocolManager* |
| 300 StorageMonitorLinux::media_transfer_protocol_manager() { |
| 301 return media_transfer_protocol_manager_.get(); |
| 302 } |
| 303 |
293 void StorageMonitorLinux::SetGetDeviceInfoCallbackForTest( | 304 void StorageMonitorLinux::SetGetDeviceInfoCallbackForTest( |
294 const GetDeviceInfoCallback& get_device_info_callback) { | 305 const GetDeviceInfoCallback& get_device_info_callback) { |
295 get_device_info_callback_ = get_device_info_callback; | 306 get_device_info_callback_ = get_device_info_callback; |
296 } | 307 } |
297 | 308 |
| 309 void StorageMonitorLinux::SetMediaTransferProtocolManagerForTest( |
| 310 device::MediaTransferProtocolManager* test_manager) { |
| 311 DCHECK(!media_transfer_protocol_manager_); |
| 312 media_transfer_protocol_manager_.reset(test_manager); |
| 313 } |
| 314 |
298 void StorageMonitorLinux::OnMtabWatcherCreated(MtabWatcherLinux* watcher) { | 315 void StorageMonitorLinux::OnMtabWatcherCreated(MtabWatcherLinux* watcher) { |
299 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 316 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
300 mtab_watcher_.reset(watcher); | 317 mtab_watcher_.reset(watcher); |
301 } | 318 } |
302 | 319 |
303 void StorageMonitorLinux::UpdateMtab(const MountPointDeviceMap& new_mtab) { | 320 void StorageMonitorLinux::UpdateMtab(const MountPointDeviceMap& new_mtab) { |
304 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 321 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
305 | 322 |
306 // Check existing mtab entries for unaccounted mount points. | 323 // Check existing mtab entries for unaccounted mount points. |
307 // These mount points must have been removed in the new mtab. | 324 // These mount points must have been removed in the new mtab. |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 | 445 |
429 if (removable) { | 446 if (removable) { |
430 // TODO(gbillock) Do this in a higher level instead of here. | 447 // TODO(gbillock) Do this in a higher level instead of here. |
431 storage_info->name = MediaStorageUtil::GetDisplayNameForDevice( | 448 storage_info->name = MediaStorageUtil::GetDisplayNameForDevice( |
432 storage_info->total_size_in_bytes, storage_info->name); | 449 storage_info->total_size_in_bytes, storage_info->name); |
433 receiver()->ProcessAttach(*storage_info); | 450 receiver()->ProcessAttach(*storage_info); |
434 } | 451 } |
435 } | 452 } |
436 | 453 |
437 } // namespace chrome | 454 } // namespace chrome |
OLD | NEW |