 Chromium Code Reviews
 Chromium Code Reviews Issue 149363004:
  Media Galleries: Initial media scanner implementation.  (Closed) 
  Base URL: svn://chrome-svn/chrome/trunk/src/
    
  
    Issue 149363004:
  Media Galleries: Initial media scanner implementation.  (Closed) 
  Base URL: svn://chrome-svn/chrome/trunk/src/| 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; | 
| + } | 
| +} |