Chromium Code Reviews| 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/chromeos/gdata/gdata_file_system_proxy.h" | 5 #include "chrome/browser/chromeos/gdata/gdata_file_system_proxy.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/platform_file.h" | 11 #include "base/platform_file.h" |
| 12 #include "base/string_util.h" | 12 #include "base/string_util.h" |
| 13 #include "base/values.h" | 13 #include "base/values.h" |
| 14 #include "content/public/browser/browser_thread.h" | 14 #include "content/public/browser/browser_thread.h" |
| 15 #include "chrome/browser/chromeos/gdata/gdata.pb.h" | |
| 15 #include "chrome/browser/chromeos/gdata/gdata_system_service.h" | 16 #include "chrome/browser/chromeos/gdata/gdata_system_service.h" |
| 16 #include "chrome/browser/chromeos/gdata/gdata_file_system.h" | 17 #include "chrome/browser/chromeos/gdata/gdata_file_system.h" |
| 17 #include "webkit/blob/shareable_file_reference.h" | 18 #include "webkit/blob/shareable_file_reference.h" |
| 18 #include "webkit/fileapi/file_system_file_util_proxy.h" | 19 #include "webkit/fileapi/file_system_file_util_proxy.h" |
| 19 #include "webkit/fileapi/file_system_types.h" | 20 #include "webkit/fileapi/file_system_types.h" |
| 20 #include "webkit/fileapi/file_system_util.h" | 21 #include "webkit/fileapi/file_system_util.h" |
| 21 | 22 |
| 22 using base::MessageLoopProxy; | 23 using base::MessageLoopProxy; |
| 23 using content::BrowserThread; | 24 using content::BrowserThread; |
| 24 using fileapi::FileSystemOperationInterface; | 25 using fileapi::FileSystemOperationInterface; |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 49 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)); | 50 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)); |
| 50 } | 51 } |
| 51 | 52 |
| 52 callback.Run(error, file_info, local_path, file_ref); | 53 callback.Run(error, file_info, local_path, file_ref); |
| 53 } | 54 } |
| 54 | 55 |
| 55 } // namespace | 56 } // namespace |
| 56 | 57 |
| 57 namespace gdata { | 58 namespace gdata { |
| 58 | 59 |
| 59 base::FileUtilProxy::Entry GDataEntryToFileUtilProxyEntry( | 60 void GDataGDataEntryProtoToFileUtilProxyEntry( |
|
achuithb
2012/05/01 09:21:44
GDataGData? I think one GData is sufficient?
This
satorux1
2012/05/01 17:24:31
Good catch! Fixed.
| |
| 60 const GDataEntry& gdata_entry) { | 61 const GDataEntryProto& proto, |
| 62 base::FileUtilProxy::Entry* entry) { | |
| 63 entry->name = proto.file_name(); | |
| 64 | |
| 65 base::PlatformFileInfo file_info; | |
| 66 GDataEntry::ConvertProtoToPlatformFileInfo(proto.file_info(), &file_info); | |
| 67 entry->size = file_info.size; | |
| 68 entry->last_modified_time = file_info.last_modified; | |
|
achuithb
2012/05/01 09:21:44
You should just set entry->is_directory here from
satorux1
2012/05/01 17:24:31
The code was so bad. Good to have a great code rev
| |
| 69 } | |
| 70 | |
| 71 base::FileUtilProxy::Entry GDataDirectoryProtoToFileUtilProxyEntry( | |
| 72 const GDataDirectoryProto& proto) { | |
| 61 base::FileUtilProxy::Entry entry; | 73 base::FileUtilProxy::Entry entry; |
| 62 entry.is_directory = gdata_entry.file_info().is_directory; | 74 entry.is_directory = true; |
| 63 | 75 |
| 64 // TODO(zelidrag): Add file name modification logic to enforce uniquness of | 76 GDataGDataEntryProtoToFileUtilProxyEntry(proto.gdata_entry(), &entry); |
| 65 // file paths across this file system. | |
| 66 entry.name = gdata_entry.file_name(); | |
| 67 | |
| 68 entry.size = gdata_entry.file_info().size; | |
| 69 entry.last_modified_time = gdata_entry.file_info().last_modified; | |
| 70 return entry; | 77 return entry; |
| 71 } | 78 } |
| 72 | 79 |
| 80 base::FileUtilProxy::Entry GDataFileProtoToFileUtilProxyEntry( | |
| 81 const GDataFileProto & proto) { | |
| 82 base::FileUtilProxy::Entry entry; | |
| 83 entry.is_directory = false; | |
| 84 | |
| 85 GDataGDataEntryProtoToFileUtilProxyEntry(proto.gdata_entry(), &entry); | |
| 86 return entry; | |
| 87 } | |
| 88 | |
| 73 // GDataFileSystemProxy class implementation. | 89 // GDataFileSystemProxy class implementation. |
| 74 | 90 |
| 75 GDataFileSystemProxy::GDataFileSystemProxy( | 91 GDataFileSystemProxy::GDataFileSystemProxy( |
| 76 GDataFileSystemInterface* file_system) | 92 GDataFileSystemInterface* file_system) |
| 77 : file_system_(file_system) { | 93 : file_system_(file_system) { |
| 78 // Should be created from the file browser extension API (AddMountFunction) | 94 // Should be created from the file browser extension API (AddMountFunction) |
| 79 // on UI thread. | 95 // on UI thread. |
| 80 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 96 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 81 } | 97 } |
| 82 | 98 |
| 83 GDataFileSystemProxy::~GDataFileSystemProxy() { | 99 GDataFileSystemProxy::~GDataFileSystemProxy() { |
| 84 // Should be deleted from the CrosMountPointProvider on IO thread. | 100 // Should be deleted from the CrosMountPointProvider on IO thread. |
| 85 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 101 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 86 } | 102 } |
| 87 | 103 |
| 88 void GDataFileSystemProxy::GetFileInfo(const GURL& file_url, | 104 void GDataFileSystemProxy::GetFileInfo(const GURL& file_url, |
| 89 const FileSystemOperationInterface::GetMetadataCallback& callback) { | 105 const FileSystemOperationInterface::GetMetadataCallback& callback) { |
| 90 FilePath file_path; | 106 FilePath file_path; |
| 91 if (!ValidateUrl(file_url, &file_path)) { | 107 if (!ValidateUrl(file_url, &file_path)) { |
| 92 base::MessageLoopProxy::current()->PostTask( | 108 base::MessageLoopProxy::current()->PostTask( |
| 93 FROM_HERE, | 109 FROM_HERE, |
| 94 base::Bind(callback, | 110 base::Bind(callback, |
| 95 base::PLATFORM_FILE_ERROR_NOT_FOUND, | 111 base::PLATFORM_FILE_ERROR_NOT_FOUND, |
| 96 base::PlatformFileInfo(), | 112 base::PlatformFileInfo(), |
| 97 FilePath())); | 113 FilePath())); |
| 98 return; | 114 return; |
| 99 } | 115 } |
| 100 | 116 |
| 101 file_system_->FindEntryByPathAsync( | 117 file_system_->GetEntryInfoByPathAsync( |
| 102 file_path, | 118 file_path, |
| 103 base::Bind(&GDataFileSystemProxy::OnGetMetadata, | 119 base::Bind(&GDataFileSystemProxy::OnGetMetadata, |
| 104 this, | 120 this, |
| 105 file_path, | 121 file_path, |
| 106 callback)); | 122 callback)); |
| 107 } | 123 } |
| 108 | 124 |
| 109 void GDataFileSystemProxy::Copy(const GURL& src_file_url, | 125 void GDataFileSystemProxy::Copy(const GURL& src_file_url, |
| 110 const GURL& dest_file_url, | 126 const GURL& dest_file_url, |
| 111 const FileSystemOperationInterface::StatusCallback& callback) { | 127 const FileSystemOperationInterface::StatusCallback& callback) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 145 if (!ValidateUrl(file_url, &file_path)) { | 161 if (!ValidateUrl(file_url, &file_path)) { |
| 146 base::MessageLoopProxy::current()->PostTask( | 162 base::MessageLoopProxy::current()->PostTask( |
| 147 FROM_HERE, | 163 FROM_HERE, |
| 148 base::Bind(callback, | 164 base::Bind(callback, |
| 149 base::PLATFORM_FILE_ERROR_NOT_FOUND, | 165 base::PLATFORM_FILE_ERROR_NOT_FOUND, |
| 150 std::vector<base::FileUtilProxy::Entry>(), | 166 std::vector<base::FileUtilProxy::Entry>(), |
| 151 false)); | 167 false)); |
| 152 return; | 168 return; |
| 153 } | 169 } |
| 154 | 170 |
| 155 file_system_->FindEntryByPathAsync( | 171 file_system_->ReadDirectoryByPathAsync( |
| 156 file_path, | 172 file_path, |
| 157 base::Bind(&GDataFileSystemProxy::OnReadDirectory, | 173 base::Bind(&GDataFileSystemProxy::OnReadDirectory, |
| 158 this, | 174 this, |
| 159 file_system_->hide_hosted_documents(), | 175 file_system_->hide_hosted_documents(), |
| 160 callback)); | 176 callback)); |
| 161 } | 177 } |
| 162 | 178 |
| 163 void GDataFileSystemProxy::Remove(const GURL& file_url, bool recursive, | 179 void GDataFileSystemProxy::Remove(const GURL& file_url, bool recursive, |
| 164 const FileSystemOperationInterface::StatusCallback& callback) { | 180 const FileSystemOperationInterface::StatusCallback& callback) { |
| 165 FilePath file_path; | 181 FilePath file_path; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 220 type != fileapi::kFileSystemTypeExternal) { | 236 type != fileapi::kFileSystemTypeExternal) { |
| 221 return false; | 237 return false; |
| 222 } | 238 } |
| 223 return true; | 239 return true; |
| 224 } | 240 } |
| 225 | 241 |
| 226 void GDataFileSystemProxy::OnGetMetadata( | 242 void GDataFileSystemProxy::OnGetMetadata( |
| 227 const FilePath& file_path, | 243 const FilePath& file_path, |
| 228 const FileSystemOperationInterface::GetMetadataCallback& callback, | 244 const FileSystemOperationInterface::GetMetadataCallback& callback, |
| 229 base::PlatformFileError error, | 245 base::PlatformFileError error, |
| 230 const FilePath& directory_path, | 246 scoped_ptr<gdata::GDataEntryProto> entry_proto) { |
| 231 GDataEntry* entry) { | |
| 232 if (error != base::PLATFORM_FILE_OK) { | 247 if (error != base::PLATFORM_FILE_OK) { |
| 233 callback.Run(error, base::PlatformFileInfo(), FilePath()); | 248 callback.Run(error, base::PlatformFileInfo(), FilePath()); |
| 234 return; | 249 return; |
| 235 } | 250 } |
| 251 DCHECK(entry_proto.get()); | |
| 236 | 252 |
| 237 callback.Run(base::PLATFORM_FILE_OK, entry->file_info(), file_path); | 253 base::PlatformFileInfo file_info; |
| 254 GDataEntry::ConvertProtoToPlatformFileInfo( | |
| 255 entry_proto->file_info(), | |
| 256 &file_info); | |
| 257 | |
| 258 callback.Run(base::PLATFORM_FILE_OK, file_info, file_path); | |
| 238 } | 259 } |
| 239 | 260 |
| 240 void GDataFileSystemProxy::OnReadDirectory( | 261 void GDataFileSystemProxy::OnReadDirectory( |
| 241 bool hide_hosted_documents, | 262 bool hide_hosted_documents, |
| 242 const FileSystemOperationInterface::ReadDirectoryCallback& | 263 const FileSystemOperationInterface::ReadDirectoryCallback& |
| 243 callback, | 264 callback, |
| 244 base::PlatformFileError error, | 265 base::PlatformFileError error, |
| 245 const FilePath& directory_path, | 266 scoped_ptr<gdata::GDataDirectoryProto> directory_proto) { |
| 246 GDataEntry* entry) { | 267 DCHECK(error != base::PLATFORM_FILE_OK); |
| 247 DCHECK(entry || error != base::PLATFORM_FILE_OK); | |
| 248 | |
| 249 GDataDirectory* directory = entry ? entry->AsGDataDirectory() : NULL; | |
| 250 if (!directory && error == base::PLATFORM_FILE_OK) | |
| 251 error = base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY; | |
| 252 | 268 |
| 253 if (error != base::PLATFORM_FILE_OK) { | 269 if (error != base::PLATFORM_FILE_OK) { |
| 254 callback.Run(error, std::vector<base::FileUtilProxy::Entry>(), false); | 270 callback.Run(error, std::vector<base::FileUtilProxy::Entry>(), false); |
| 255 return; | 271 return; |
| 256 } | 272 } |
| 257 std::vector<base::FileUtilProxy::Entry> entries; | 273 std::vector<base::FileUtilProxy::Entry> entries; |
| 258 // Convert gdata files to something File API stack can understand. | 274 // Convert gdata files to something File API stack can understand. |
| 259 for (GDataDirectoryCollection::const_iterator iter = | 275 for (int i = 0; i < directory_proto->child_directories_size(); ++i) { |
| 260 directory->child_directories().begin(); | 276 const GDataDirectoryProto& proto = directory_proto->child_directories(i); |
| 261 iter != directory->child_directories().end(); ++iter) { | 277 entries.push_back(GDataDirectoryProtoToFileUtilProxyEntry(proto)); |
| 262 entries.push_back(GDataEntryToFileUtilProxyEntry(*(iter->second))); | |
| 263 } | 278 } |
| 264 for (GDataFileCollection::const_iterator iter = | 279 for (int i = 0; i < directory_proto->child_files_size(); ++i) { |
| 265 directory->child_files().begin(); | 280 const GDataFileProto& proto = directory_proto->child_files(i); |
| 266 iter != directory->child_files().end(); ++iter) { | 281 if (hide_hosted_documents && proto.is_hosted_document()) |
| 267 if (hide_hosted_documents) { | |
| 268 GDataFile* file = iter->second; | |
| 269 if (file->is_hosted_document()) | |
| 270 continue; | 282 continue; |
| 271 } | 283 entries.push_back(GDataFileProtoToFileUtilProxyEntry(proto)); |
| 272 entries.push_back(GDataEntryToFileUtilProxyEntry(*(iter->second))); | |
| 273 } | 284 } |
| 274 | 285 |
| 275 callback.Run(base::PLATFORM_FILE_OK, entries, false); | 286 callback.Run(base::PLATFORM_FILE_OK, entries, false); |
| 276 } | 287 } |
| 277 | 288 |
| 278 } // namespace gdata | 289 } // namespace gdata |
| OLD | NEW |