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