| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/itunes_file_util.h" | 5 #include "chrome/browser/media_galleries/fileapi/itunes_file_util.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 | 27 |
| 28 namespace { | 28 namespace { |
| 29 | 29 |
| 30 base::File::Error MakeDirectoryFileInfo(base::File::Info* file_info) { | 30 base::File::Error MakeDirectoryFileInfo(base::File::Info* file_info) { |
| 31 base::File::Info result; | 31 base::File::Info result; |
| 32 result.is_directory = true; | 32 result.is_directory = true; |
| 33 *file_info = result; | 33 *file_info = result; |
| 34 return base::File::FILE_OK; | 34 return base::File::FILE_OK; |
| 35 } | 35 } |
| 36 | 36 |
| 37 std::vector<std::string> GetVirtualPathComponents( |
| 38 const fileapi::FileSystemURL& url) { |
| 39 ImportedMediaGalleryRegistry* imported_registry = |
| 40 ImportedMediaGalleryRegistry::GetInstance(); |
| 41 base::FilePath root = imported_registry->ImportedRoot().Append("itunes"); |
| 42 |
| 43 DCHECK(root.IsParent(url.path())); |
| 44 base::FilePath virtual_path; |
| 45 root.AppendRelativePath(url.path(), &virtual_path); |
| 46 |
| 47 std::vector<std::string> result; |
| 48 fileapi::VirtualPath::GetComponentsUTF8Unsafe(virtual_path, &result); |
| 49 return result; |
| 50 } |
| 51 |
| 37 } // namespace | 52 } // namespace |
| 38 | 53 |
| 39 const char kITunesLibraryXML[] = "iTunes Music Library.xml"; | 54 const char kITunesLibraryXML[] = "iTunes Music Library.xml"; |
| 40 const char kITunesMediaDir[] = "iTunes Media"; | 55 const char kITunesMediaDir[] = "iTunes Media"; |
| 41 const char kITunesMusicDir[] = "Music"; | 56 const char kITunesMusicDir[] = "Music"; |
| 42 const char kITunesAutoAddDir[] = "Automatically Add to iTunes"; | 57 const char kITunesAutoAddDir[] = "Automatically Add to iTunes"; |
| 43 | 58 |
| 44 ITunesFileUtil::ITunesFileUtil(MediaPathFilter* media_path_filter) | 59 ITunesFileUtil::ITunesFileUtil(MediaPathFilter* media_path_filter) |
| 45 : NativeMediaFileUtil(media_path_filter), | 60 : NativeMediaFileUtil(media_path_filter), |
| 46 weak_factory_(this), | 61 weak_factory_(this), |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 // / - root directory | 99 // / - root directory |
| 85 // /iTunes Music Library.xml - library xml file | 100 // /iTunes Music Library.xml - library xml file |
| 86 // /iTunes Media/Automatically Add to iTunes - auto-import directory | 101 // /iTunes Media/Automatically Add to iTunes - auto-import directory |
| 87 // /iTunes Media/Music/<Artist>/<Album>/<Track> - tracks | 102 // /iTunes Media/Music/<Artist>/<Album>/<Track> - tracks |
| 88 // | 103 // |
| 89 base::File::Error ITunesFileUtil::GetFileInfoSync( | 104 base::File::Error ITunesFileUtil::GetFileInfoSync( |
| 90 fileapi::FileSystemOperationContext* context, | 105 fileapi::FileSystemOperationContext* context, |
| 91 const fileapi::FileSystemURL& url, | 106 const fileapi::FileSystemURL& url, |
| 92 base::File::Info* file_info, | 107 base::File::Info* file_info, |
| 93 base::FilePath* platform_path) { | 108 base::FilePath* platform_path) { |
| 94 std::vector<std::string> components; | 109 std::vector<std::string> components = GetVirtualPathComponents(url); |
| 95 fileapi::VirtualPath::GetComponentsUTF8Unsafe(url.path(), &components); | |
| 96 | 110 |
| 97 if (components.size() == 0) | 111 if (components.size() == 0) |
| 98 return MakeDirectoryFileInfo(file_info); | 112 return MakeDirectoryFileInfo(file_info); |
| 99 | 113 |
| 100 if (components.size() == 1 && components[0] == kITunesLibraryXML) { | 114 if (components.size() == 1 && components[0] == kITunesLibraryXML) { |
| 101 // We can't just call NativeMediaFileUtil::GetFileInfoSync() here because it | 115 // We can't just call NativeMediaFileUtil::GetFileInfoSync() here because it |
| 102 // uses the MediaPathFilter. At this point, |library_path_| is known good | 116 // uses the MediaPathFilter. At this point, |library_path_| is known good |
| 103 // because GetFileInfoWithFreshDataProvider() gates access to this method. | 117 // because GetFileInfoWithFreshDataProvider() gates access to this method. |
| 104 base::FilePath file_path = GetDataProvider()->library_path(); | 118 base::FilePath file_path = GetDataProvider()->library_path(); |
| 105 if (platform_path) | 119 if (platform_path) |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 } | 160 } |
| 147 | 161 |
| 148 return base::File::FILE_ERROR_NOT_FOUND; | 162 return base::File::FILE_ERROR_NOT_FOUND; |
| 149 } | 163 } |
| 150 | 164 |
| 151 base::File::Error ITunesFileUtil::ReadDirectorySync( | 165 base::File::Error ITunesFileUtil::ReadDirectorySync( |
| 152 fileapi::FileSystemOperationContext* context, | 166 fileapi::FileSystemOperationContext* context, |
| 153 const fileapi::FileSystemURL& url, | 167 const fileapi::FileSystemURL& url, |
| 154 EntryList* file_list) { | 168 EntryList* file_list) { |
| 155 DCHECK(file_list->empty()); | 169 DCHECK(file_list->empty()); |
| 156 std::vector<std::string> components; | 170 std::vector<std::string> components = GetVirtualPathComponents(url); |
| 157 fileapi::VirtualPath::GetComponentsUTF8Unsafe(url.path(), &components); | |
| 158 | 171 |
| 159 if (components.size() == 0) { | 172 if (components.size() == 0) { |
| 160 base::File::Info xml_info; | 173 base::File::Info xml_info; |
| 161 if (!base::GetFileInfo(GetDataProvider()->library_path(), &xml_info)) | 174 if (!base::GetFileInfo(GetDataProvider()->library_path(), &xml_info)) |
| 162 return base::File::FILE_ERROR_IO; | 175 return base::File::FILE_ERROR_IO; |
| 163 file_list->push_back(DirectoryEntry(kITunesLibraryXML, | 176 file_list->push_back(DirectoryEntry(kITunesLibraryXML, |
| 164 DirectoryEntry::FILE, | 177 DirectoryEntry::FILE, |
| 165 xml_info.size, xml_info.last_modified)); | 178 xml_info.size, xml_info.last_modified)); |
| 166 file_list->push_back(DirectoryEntry(kITunesMediaDir, | 179 file_list->push_back(DirectoryEntry(kITunesMediaDir, |
| 167 DirectoryEntry::DIRECTORY, | 180 DirectoryEntry::DIRECTORY, |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 const fileapi::FileSystemURL& url) { | 270 const fileapi::FileSystemURL& url) { |
| 258 return base::File::FILE_ERROR_SECURITY; | 271 return base::File::FILE_ERROR_SECURITY; |
| 259 } | 272 } |
| 260 | 273 |
| 261 base::File::Error ITunesFileUtil::CreateSnapshotFileSync( | 274 base::File::Error ITunesFileUtil::CreateSnapshotFileSync( |
| 262 fileapi::FileSystemOperationContext* context, | 275 fileapi::FileSystemOperationContext* context, |
| 263 const fileapi::FileSystemURL& url, | 276 const fileapi::FileSystemURL& url, |
| 264 base::File::Info* file_info, | 277 base::File::Info* file_info, |
| 265 base::FilePath* platform_path, | 278 base::FilePath* platform_path, |
| 266 scoped_refptr<webkit_blob::ShareableFileReference>* file_ref) { | 279 scoped_refptr<webkit_blob::ShareableFileReference>* file_ref) { |
| 267 DCHECK(!url.path().IsAbsolute()); | 280 std::vector<std::string> components = GetVirtualPathComponents(url); |
| 268 if (url.path() != base::FilePath().AppendASCII(kITunesLibraryXML)) { | 281 if (components.size() != 1 || components[0] != kITunesLibraryXML) { |
| 269 return NativeMediaFileUtil::CreateSnapshotFileSync(context, url, file_info, | 282 return NativeMediaFileUtil::CreateSnapshotFileSync(context, url, file_info, |
| 270 platform_path, file_ref); | 283 platform_path, file_ref); |
| 271 } | 284 } |
| 272 | 285 |
| 273 // The following code is different than | 286 // The following code is different than |
| 274 // NativeMediaFileUtil::CreateSnapshotFileSync in that it knows that the | 287 // NativeMediaFileUtil::CreateSnapshotFileSync in that it knows that the |
| 275 // library xml file is not a directory and it doesn't run mime sniffing on the | 288 // library xml file is not a directory and it doesn't run mime sniffing on the |
| 276 // file. The only way to get here is by way of | 289 // file. The only way to get here is by way of |
| 277 // CreateSnapshotFileWithFreshDataProvider() so the file has already been | 290 // CreateSnapshotFileWithFreshDataProvider() so the file has already been |
| 278 // parsed and deemed valid. | 291 // parsed and deemed valid. |
| 279 *file_ref = scoped_refptr<webkit_blob::ShareableFileReference>(); | 292 *file_ref = scoped_refptr<webkit_blob::ShareableFileReference>(); |
| 280 return GetFileInfoSync(context, url, file_info, platform_path); | 293 return GetFileInfoSync(context, url, file_info, platform_path); |
| 281 } | 294 } |
| 282 | 295 |
| 283 base::File::Error ITunesFileUtil::GetLocalFilePath( | 296 base::File::Error ITunesFileUtil::GetLocalFilePath( |
| 284 fileapi::FileSystemOperationContext* context, | 297 fileapi::FileSystemOperationContext* context, |
| 285 const fileapi::FileSystemURL& url, | 298 const fileapi::FileSystemURL& url, |
| 286 base::FilePath* local_file_path) { | 299 base::FilePath* local_file_path) { |
| 287 std::vector<std::string> components; | 300 std::vector<std::string> components = GetVirtualPathComponents(url); |
| 288 fileapi::VirtualPath::GetComponentsUTF8Unsafe(url.path(), &components); | |
| 289 | 301 |
| 290 if (components.size() == 1 && components[0] == kITunesLibraryXML) { | 302 if (components.size() == 1 && components[0] == kITunesLibraryXML) { |
| 291 *local_file_path = GetDataProvider()->library_path(); | 303 *local_file_path = GetDataProvider()->library_path(); |
| 292 return base::File::FILE_OK; | 304 return base::File::FILE_OK; |
| 293 } | 305 } |
| 294 | 306 |
| 295 if (components.size() >= 2 && components[0] == kITunesMediaDir && | 307 if (components.size() >= 2 && components[0] == kITunesMediaDir && |
| 296 components[1] == kITunesAutoAddDir) { | 308 components[1] == kITunesAutoAddDir) { |
| 297 *local_file_path = GetDataProvider()->auto_add_path(); | 309 *local_file_path = GetDataProvider()->auto_add_path(); |
| 298 if (local_file_path->empty()) | 310 if (local_file_path->empty()) |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 callback); | 391 callback); |
| 380 } | 392 } |
| 381 | 393 |
| 382 ITunesDataProvider* ITunesFileUtil::GetDataProvider() { | 394 ITunesDataProvider* ITunesFileUtil::GetDataProvider() { |
| 383 if (!imported_registry_) | 395 if (!imported_registry_) |
| 384 imported_registry_ = ImportedMediaGalleryRegistry::GetInstance(); | 396 imported_registry_ = ImportedMediaGalleryRegistry::GetInstance(); |
| 385 return imported_registry_->ITunesDataProvider(); | 397 return imported_registry_->ITunesDataProvider(); |
| 386 } | 398 } |
| 387 | 399 |
| 388 } // namespace itunes | 400 } // namespace itunes |
| OLD | NEW |