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

Side by Side Diff: chrome/browser/media_galleries/fileapi/mtp_device_map_service.cc

Issue 947943002: Implement CopyFileFromLocal of MTPDeviceAsyncDelegate. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments. Created 5 years, 9 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
OLDNEW
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/media_galleries/fileapi/mtp_device_map_service.h" 5 #include "chrome/browser/media_galleries/fileapi/mtp_device_map_service.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
11 #include "chrome/browser/media_galleries/fileapi/mtp_device_async_delegate.h" 11 #include "chrome/browser/media_galleries/fileapi/mtp_device_async_delegate.h"
12 #include "content/public/browser/browser_thread.h" 12 #include "content/public/browser/browser_thread.h"
13 #include "storage/browser/fileapi/external_mount_points.h" 13 #include "storage/browser/fileapi/external_mount_points.h"
14 14
15 namespace { 15 namespace {
16 16
17 base::LazyInstance<MTPDeviceMapService> g_mtp_device_map_service = 17 base::LazyInstance<MTPDeviceMapService> g_mtp_device_map_service =
18 LAZY_INSTANCE_INITIALIZER; 18 LAZY_INSTANCE_INITIALIZER;
19 19
20 } // namespace 20 } // namespace
21 21
22 // static 22 // static
23 MTPDeviceMapService* MTPDeviceMapService::GetInstance() { 23 MTPDeviceMapService* MTPDeviceMapService::GetInstance() {
24 return g_mtp_device_map_service.Pointer(); 24 return g_mtp_device_map_service.Pointer();
25 } 25 }
26 26
27 void MTPDeviceMapService::RegisterMTPFileSystem( 27 void MTPDeviceMapService::RegisterMTPFileSystem(
28 const base::FilePath::StringType& device_location, 28 const base::FilePath::StringType& device_location,
29 const std::string& fsid) { 29 const std::string& filesystem_id,
30 const bool read_only) {
30 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 31 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
32 DCHECK(!device_location.empty());
33 DCHECK(!filesystem_id.empty());
31 34
32 if (!ContainsKey(mtp_device_usage_map_, device_location)) { 35 const AsyncDelegateKey key = GetAsyncDelegateKey(device_location, read_only);
36 if (!ContainsKey(mtp_device_usage_map_, key)) {
33 // Note that this initializes the delegate asynchronously, but since 37 // Note that this initializes the delegate asynchronously, but since
34 // the delegate will only be used from the IO thread, it is guaranteed 38 // the delegate will only be used from the IO thread, it is guaranteed
35 // to be created before use of it expects it to be there. 39 // to be created before use of it expects it to be there.
36 CreateMTPDeviceAsyncDelegate(device_location, 40 CreateMTPDeviceAsyncDelegate(
41 device_location, read_only,
37 base::Bind(&MTPDeviceMapService::AddAsyncDelegate, 42 base::Bind(&MTPDeviceMapService::AddAsyncDelegate,
38 base::Unretained(this), device_location)); 43 base::Unretained(this), device_location, read_only));
39 mtp_device_usage_map_[device_location] = 0; 44 mtp_device_usage_map_[key] = 0;
40 } 45 }
41 46
42 mtp_device_usage_map_[device_location]++; 47 mtp_device_usage_map_[key]++;
43 mtp_device_map_[fsid] = device_location; 48 mtp_device_map_[filesystem_id] = make_pair(device_location, read_only);
44 } 49 }
45 50
46 void MTPDeviceMapService::RevokeMTPFileSystem(const std::string& fsid) { 51 void MTPDeviceMapService::RevokeMTPFileSystem(
52 const std::string& filesystem_id) {
47 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 53 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
54 DCHECK(!filesystem_id.empty());
48 55
49 MTPDeviceFileSystemMap::iterator it = mtp_device_map_.find(fsid); 56 MTPDeviceFileSystemMap::iterator it = mtp_device_map_.find(filesystem_id);
50 if (it != mtp_device_map_.end()) { 57 if (it != mtp_device_map_.end()) {
51 base::FilePath::StringType device_location = it->second; 58 const base::FilePath::StringType device_location = it->second.first;
59 const bool read_only = it->second.second;
60
52 mtp_device_map_.erase(it); 61 mtp_device_map_.erase(it);
53 MTPDeviceUsageMap::iterator delegate_it = 62
54 mtp_device_usage_map_.find(device_location); 63 const AsyncDelegateKey key =
64 GetAsyncDelegateKey(device_location, read_only);
65 MTPDeviceUsageMap::iterator delegate_it = mtp_device_usage_map_.find(key);
55 DCHECK(delegate_it != mtp_device_usage_map_.end()); 66 DCHECK(delegate_it != mtp_device_usage_map_.end());
56 mtp_device_usage_map_[device_location]--; 67
57 if (mtp_device_usage_map_[device_location] == 0) { 68 mtp_device_usage_map_[key]--;
69 if (mtp_device_usage_map_[key] == 0) {
58 mtp_device_usage_map_.erase(delegate_it); 70 mtp_device_usage_map_.erase(delegate_it);
59 RemoveAsyncDelegate(device_location); 71 RemoveAsyncDelegate(device_location, read_only);
60 } 72 }
61 } 73 }
62 } 74 }
63 75
64 void MTPDeviceMapService::AddAsyncDelegate( 76 void MTPDeviceMapService::AddAsyncDelegate(
65 const base::FilePath::StringType& device_location, 77 const base::FilePath::StringType& device_location,
78 const bool read_only,
66 MTPDeviceAsyncDelegate* delegate) { 79 MTPDeviceAsyncDelegate* delegate) {
67 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 80 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
68 DCHECK(delegate); 81 DCHECK(delegate);
69 DCHECK(!device_location.empty()); 82 DCHECK(!device_location.empty());
70 if (ContainsKey(async_delegate_map_, device_location)) 83
84 const AsyncDelegateKey key = GetAsyncDelegateKey(device_location, read_only);
85 if (ContainsKey(async_delegate_map_, key))
71 return; 86 return;
72 async_delegate_map_[device_location] = delegate; 87 async_delegate_map_[key] = delegate;
73 } 88 }
74 89
75 void MTPDeviceMapService::RemoveAsyncDelegate( 90 void MTPDeviceMapService::RemoveAsyncDelegate(
76 const base::FilePath::StringType& device_location) { 91 const base::FilePath::StringType& device_location,
92 const bool read_only) {
77 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 93 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
78 AsyncDelegateMap::iterator it = async_delegate_map_.find(device_location); 94 DCHECK(!device_location.empty());
95
96 const AsyncDelegateKey key = GetAsyncDelegateKey(device_location, read_only);
97 AsyncDelegateMap::iterator it = async_delegate_map_.find(key);
79 DCHECK(it != async_delegate_map_.end()); 98 DCHECK(it != async_delegate_map_.end());
80 it->second->CancelPendingTasksAndDeleteDelegate(); 99 it->second->CancelPendingTasksAndDeleteDelegate();
81 async_delegate_map_.erase(it); 100 async_delegate_map_.erase(it);
82 } 101 }
83 102
103 MTPDeviceMapService::AsyncDelegateKey MTPDeviceMapService::GetAsyncDelegateKey(
Lei Zhang 2015/03/03 10:03:17 Also static?
yawano 2015/03/03 10:33:14 Done.
104 const base::FilePath::StringType& device_location,
105 const bool read_only) {
106 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
107
108 base::FilePath::StringType key;
109 key.append(read_only ? FILE_PATH_LITERAL("ReadOnly")
110 : FILE_PATH_LITERAL("ReadWrite"));
111 key.append(FILE_PATH_LITERAL("|"));
112 key.append(device_location);
113 return key;
114 }
115
84 MTPDeviceAsyncDelegate* MTPDeviceMapService::GetMTPDeviceAsyncDelegate( 116 MTPDeviceAsyncDelegate* MTPDeviceMapService::GetMTPDeviceAsyncDelegate(
85 const std::string& filesystem_id) { 117 const std::string& filesystem_id) {
86 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 118 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
119 DCHECK(!filesystem_id.empty());
120
121 // File system may be already revoked on ExternalMountPoints side, we check
122 // here that the file system is still valid.
87 base::FilePath device_path; 123 base::FilePath device_path;
88 if (!storage::ExternalMountPoints::GetSystemInstance()->GetRegisteredPath( 124 if (!storage::ExternalMountPoints::GetSystemInstance()->GetRegisteredPath(
89 filesystem_id, &device_path)) { 125 filesystem_id, &device_path)) {
90 return NULL; 126 return NULL;
91 } 127 }
92 128
93 const base::FilePath::StringType& device_location = device_path.value(); 129 const base::FilePath::StringType& device_location = device_path.value();
94 DCHECK(!device_location.empty()); 130
95 AsyncDelegateMap::const_iterator it = 131 MTPDeviceFileSystemMap::const_iterator mtp_device_map_it =
96 async_delegate_map_.find(device_location); 132 mtp_device_map_.find(filesystem_id);
97 return (it != async_delegate_map_.end()) ? it->second : NULL; 133 if (mtp_device_map_it == mtp_device_map_.end())
134 return NULL;
135
136 DCHECK_EQ(device_path.value(), mtp_device_map_it->second.first);
137 const bool read_only = mtp_device_map_it->second.second;
138 const AsyncDelegateKey key = GetAsyncDelegateKey(device_location, read_only);
139
140 AsyncDelegateMap::const_iterator async_delegate_map_it =
141 async_delegate_map_.find(key);
142 return (async_delegate_map_it != async_delegate_map_.end())
143 ? async_delegate_map_it->second
144 : NULL;
98 } 145 }
99 146
100 MTPDeviceMapService::MTPDeviceMapService() { 147 MTPDeviceMapService::MTPDeviceMapService() {
101 } 148 }
102 149
103 MTPDeviceMapService::~MTPDeviceMapService() { 150 MTPDeviceMapService::~MTPDeviceMapService() {
104 DCHECK(mtp_device_usage_map_.empty()); 151 DCHECK(mtp_device_usage_map_.empty());
105 } 152 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698