 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 | 
| @@ -75,6 +78,19 @@ | 
| !net::IsSupportedMimeType(mime_type); | 
| } | 
| +// static | 
| 
vandebo (ex-Chrome)
2014/01/30 01:03:11
remove
 
Lei Zhang
2014/01/30 01:35:41
Done.
 | 
| +std::vector<base::FilePath::StringType> GetMediaExtensionList( | 
| + const std::string& mime_type) { | 
| + std::vector<base::FilePath::StringType> extensions; | 
| + net::GetExtensionsForMimeType(mime_type, &extensions); | 
| + std::vector<base::FilePath::StringType>::iterator new_end = | 
| + std::remove_if(extensions.begin(), | 
| + extensions.end(), | 
| + &IsUnsupportedExtension); | 
| + extensions.erase(new_end, extensions.end()); | 
| + return extensions; | 
| +} | 
| + | 
| } // namespace | 
| MediaPathFilter::MediaPathFilter() | 
| @@ -86,10 +102,16 @@ | 
| } | 
| 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()) ? | 
| 
vandebo (ex-Chrome)
2014/01/30 01:03:11
nit: no need for trinary here.
 
Lei Zhang
2014/01/30 01:35:41
Done.
 | 
| + MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN : | 
| + static_cast<MediaGalleryScanFileType>(it->second); | 
| } | 
| void MediaPathFilter::EnsureInitialized() { | 
| @@ -97,26 +119,44 @@ | 
| 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_); | 
| + // 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. | 
| + MediaFileExtensionList extensions_list = GetMediaExtensionList("image/*"); | 
| + AddExtensionsToMediaFileExtensionMap( | 
| + extensions_list, | 
| + kExtraSupportedImageExtensions, | 
| + arraysize(kExtraSupportedImageExtensions), | 
| + MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE); | 
| + extensions_list = GetMediaExtensionList("audio/*"); | 
| + AddExtensionsToMediaFileExtensionMap( | 
| + extensions_list, | 
| + kExtraSupportedAudioExtensions, | 
| + arraysize(kExtraSupportedAudioExtensions), | 
| + MEDIA_GALLERY_SCAN_FILE_TYPE_AUDIO); | 
| + extensions_list = GetMediaExtensionList("video/*"); | 
| + AddExtensionsToMediaFileExtensionMap( | 
| + extensions_list, | 
| + kExtraSupportedVideoExtensions, | 
| + arraysize(kExtraSupportedVideoExtensions), | 
| + MEDIA_GALLERY_SCAN_FILE_TYPE_VIDEO); | 
| - 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()); | 
| - | 
| - // Add other common extensions. | 
| - for (size_t i = 0; i < arraysize(kExtraSupportedExtensions); ++i) | 
| - media_file_extensions_.push_back(kExtraSupportedExtensions[i]); | 
| - | 
| - 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()); | 
| - | 
| initialized_ = true; | 
| } | 
| + | 
| +void MediaPathFilter::AddExtensionsToMediaFileExtensionMap( | 
| + const MediaFileExtensionList& extensions, | 
| + const base::FilePath::CharType* const* additional_extensions, | 
| + size_t additional_extensions_size, | 
| + MediaGalleryScanFileType type) { | 
| + for (size_t i = 0; i < extensions.size(); ++i) { | 
| + base::FilePath::StringType extension_with_sep = | 
| + base::FilePath::kExtensionSeparator + extensions[i]; | 
| + media_file_extensions_map_[extension_with_sep] |= type; | 
| + } | 
| + for (size_t i = 0; i < additional_extensions_size; ++i) { | 
| 
vandebo (ex-Chrome)
2014/01/30 01:03:11
nit: You basically have the same loop here twice.
 
Lei Zhang
2014/01/30 01:35:41
const char* array != std::string() array. I still
 | 
| + base::FilePath::StringType extension_with_sep = | 
| + base::FilePath::kExtensionSeparator + additional_extensions[i]; | 
| + media_file_extensions_map_[extension_with_sep] |= type; | 
| + } | 
| +} |