iapps_finder_impl_win.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Copyright 2013 The Chromium Authors. All rights reserved. 230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Use of this source code is governed by a BSD-style license that can be 330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// found in the LICENSE file. 430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "chrome/browser/media_galleries/fileapi/iapps_finder_impl.h" 630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <string> 830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "base/base_paths_win.h" 1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "base/file_util.h" 1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "base/files/file_path.h" 1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "base/logging.h" 1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "base/path_service.h" 1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "chrome/browser/media_galleries/fileapi/iapps_finder.h" 1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "chrome/browser/media_galleries/fileapi/safe_itunes_pref_parser_win.h" 1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "chrome/common/chrome_paths.h" 1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "components/storage_monitor/storage_info.h" 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "content/public/browser/browser_thread.h" 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace iapps { 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace { 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Try to read the iTunes preferences file from the default location and return 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// its contents if found. 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstd::string GetPrefFileData() { 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun std::string xml_pref_data; 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun base::FilePath appdata_dir; 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (PathService::Get(base::DIR_APP_DATA, &appdata_dir)) { 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun base::FilePath pref_file = appdata_dir.AppendASCII("Apple Computer") 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun .AppendASCII("iTunes") 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun .AppendASCII("iTunesPrefs.xml"); 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun base::ReadFileToString(pref_file, &xml_pref_data); 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return xml_pref_data; 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Check the default location for a correctly named file. 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TryDefaultLocation(const iapps::IAppsFinderCallback& callback) { 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun base::FilePath music_dir; 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (!PathService::Get(chrome::DIR_USER_MUSIC, &music_dir)) { 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun callback.Run(std::string()); 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return; 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun base::FilePath library_file = 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun music_dir.AppendASCII("iTunes").AppendASCII("iTunes Music Library.xml"); 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (!base::PathExists(library_file)) { 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun callback.Run(std::string()); 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return; 54 } 55 callback.Run(library_file.AsUTF8Unsafe()); 56} 57 58// Check the location that parsing the preferences XML file found. 59void FinishedParsingPrefXML(const iapps::IAppsFinderCallback& callback, 60 const base::FilePath& library_file) { 61 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); 62 63 if (library_file.empty() || !base::PathExists(library_file)) { 64 TryDefaultLocation(callback); 65 return; 66 } 67 callback.Run(library_file.AsUTF8Unsafe()); 68} 69 70void FindITunesLibraryOnFileThread(const iapps::IAppsFinderCallback& callback) { 71 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); 72 73 std::string xml_pref_data = GetPrefFileData(); 74 if (xml_pref_data.empty()) { 75 TryDefaultLocation(callback); 76 return; 77 } 78 79 scoped_refptr<itunes::SafeITunesPrefParserWin> parser = 80 new itunes::SafeITunesPrefParserWin( 81 xml_pref_data, 82 base::Bind(&FinishedParsingPrefXML, callback)); 83 parser->Start(); 84} 85 86} // namespace 87 88// The Windows-specific ITunesFinder uses a utility process to parse the 89// iTunes preferences XML file if it exists. If not or if the parsing fails, 90// ITunesFinderWin will try a default location as well. 91void FindITunesLibrary(const IAppsFinderCallback& callback) { 92 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 93 FindIAppsOnFileThread(storage_monitor::StorageInfo::ITUNES, 94 base::Bind(FindITunesLibraryOnFileThread), callback); 95} 96 97} // namespace iapps 98