Chromium Code Reviews| Index: chrome/browser/media_galleries/fileapi/media_path_filter.cc |
| =================================================================== |
| --- chrome/browser/media_galleries/fileapi/media_path_filter.cc (revision 247534) |
| +++ chrome/browser/media_galleries/fileapi/media_path_filter.cc (working copy) |
| @@ -12,7 +12,7 @@ |
| namespace { |
| -const base::FilePath::CharType* const kExtraSupportedExtensions[] = { |
| +const base::FilePath::CharType* const kExtraSupportedImageExtensions[] = { |
| // RAW picture file types. |
| // Some of which are just image/tiff. |
| FILE_PATH_LITERAL("3fr"), // (Hasselblad) |
| @@ -45,8 +45,9 @@ |
| // - Leica / Panasonic RAW files - image/x-panasonic-raw |
| // - Phase One RAW files - image/x-phaseone-raw |
| FILE_PATH_LITERAL("raw"), |
| +}; |
| - // Video files types. |
| +const base::FilePath::CharType* const kExtraSupportedVideoExtensions[] = { |
| FILE_PATH_LITERAL("3gp"), |
| FILE_PATH_LITERAL("3gpp"), |
| FILE_PATH_LITERAL("avi"), |
| @@ -58,9 +59,11 @@ |
| FILE_PATH_LITERAL("mpegps"), |
| FILE_PATH_LITERAL("mpg"), |
| FILE_PATH_LITERAL("wmv"), |
| +}; |
| - // Audio file types. Many of these file types are audio files in the same |
| - // containers that the MIME sniffer already detects as video/subtype. |
| +const base::FilePath::CharType* const kExtraSupportedAudioExtensions[] = { |
| + // Many of these file types are audio files in the same containers that the |
| + // MIME sniffer already detects as video/subtype. |
| FILE_PATH_LITERAL("aac"), // audio/mpeg |
| FILE_PATH_LITERAL("alac"), // video/mp4 |
| FILE_PATH_LITERAL("flac"), // audio/x-flac |
| @@ -86,10 +89,15 @@ |
| } |
| bool MediaPathFilter::Match(const base::FilePath& path) { |
| + return GetType(path) != MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN; |
| +} |
| + |
| +MediaGalleryScanFileType MediaPathFilter::GetType(const base::FilePath& path) { |
| EnsureInitialized(); |
| - return std::binary_search(media_file_extensions_.begin(), |
| - media_file_extensions_.end(), |
| - StringToLowerASCII(path.Extension())); |
| + MediaFileExtensionMap::const_iterator it = |
| + media_file_extensions_map_.find(StringToLowerASCII(path.Extension())); |
| + return (it == media_file_extensions_map_.end()) ? |
| + MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN : it->second; |
| } |
| void MediaPathFilter::EnsureInitialized() { |
| @@ -97,26 +105,54 @@ |
| if (initialized_) |
| return; |
| - // This may require I/O, so doing this in the ctor and removing |
| - // |initialized_| would result in a ThreadRestrictions failure. |
| - net::GetExtensionsForMimeType("image/*", &media_file_extensions_); |
| - net::GetExtensionsForMimeType("audio/*", &media_file_extensions_); |
| - net::GetExtensionsForMimeType("video/*", &media_file_extensions_); |
| + MediaFileExtensionList extensions_list; |
| - MediaFileExtensionList::iterator new_end = |
| - std::remove_if(media_file_extensions_.begin(), |
| - media_file_extensions_.end(), |
| - &IsUnsupportedExtension); |
| - media_file_extensions_.erase(new_end, media_file_extensions_.end()); |
| + // This may require I/O when it calls net::GetExtensionsForMimeType(), so |
| + // doing this in the ctor and removing |initialized_| would result in a |
| + // ThreadRestrictions failure. |
| + GetMediaExtensionList("image/*", &extensions_list); |
| + for (size_t i = 0; i < arraysize(kExtraSupportedImageExtensions); ++i) |
|
vandebo (ex-Chrome)
2014/01/29 18:41:45
nit: seems silly to add it to the list, just to it
Lei Zhang
2014/01/30 00:10:49
Done.
|
| + extensions_list.push_back(kExtraSupportedImageExtensions[i]); |
| + AddExtensionsToMediaFileExtensionMap(extensions_list, |
| + MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE); |
| + extensions_list.clear(); |
| + GetMediaExtensionList("audio/*", &extensions_list); |
| + for (size_t i = 0; i < arraysize(kExtraSupportedAudioExtensions); ++i) |
| + extensions_list.push_back(kExtraSupportedAudioExtensions[i]); |
| + AddExtensionsToMediaFileExtensionMap(extensions_list, |
| + MEDIA_GALLERY_SCAN_FILE_TYPE_AUDIO); |
| + extensions_list.clear(); |
| + GetMediaExtensionList("video/*", &extensions_list); |
| + for (size_t i = 0; i < arraysize(kExtraSupportedVideoExtensions); ++i) |
| + extensions_list.push_back(kExtraSupportedVideoExtensions[i]); |
| + AddExtensionsToMediaFileExtensionMap(extensions_list, |
| + MEDIA_GALLERY_SCAN_FILE_TYPE_VIDEO); |
| - // Add other common extensions. |
| - for (size_t i = 0; i < arraysize(kExtraSupportedExtensions); ++i) |
| - media_file_extensions_.push_back(kExtraSupportedExtensions[i]); |
| + initialized_ = true; |
| +} |
| - for (MediaFileExtensionList::iterator itr = media_file_extensions_.begin(); |
| - itr != media_file_extensions_.end(); ++itr) |
| - *itr = base::FilePath::kExtensionSeparator + *itr; |
| - std::sort(media_file_extensions_.begin(), media_file_extensions_.end()); |
| +// static |
| +void MediaPathFilter::GetMediaExtensionList( |
| + const std::string& mime_type, |
| + MediaFileExtensionList* extensions) { |
| + DCHECK(extensions); |
| - initialized_ = true; |
| + net::GetExtensionsForMimeType(mime_type, extensions); |
| + MediaFileExtensionList::iterator new_end = |
| + std::remove_if(extensions->begin(), |
| + extensions->end(), |
| + &IsUnsupportedExtension); |
| + extensions->erase(new_end, extensions->end()); |
| } |
| + |
| +void MediaPathFilter::AddExtensionsToMediaFileExtensionMap( |
| + const MediaFileExtensionList& extensions, |
| + MediaGalleryScanFileType type) { |
| + for (size_t i = 0; i < extensions.size(); ++i) { |
| + base::FilePath::StringType extension_with_sep = |
| + base::FilePath::kExtensionSeparator + extensions[i]; |
| + // Overwriting is fine. It means the most recent caller gets priority for |
| + // an ambiguous file extension. |
| + media_file_extensions_map_[extension_with_sep] = type; |
| + } |
| +} |