File: iapps_finder_impl_win.cc

package info (click to toggle)
chromium-browser 41.0.2272.118-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 2,189,132 kB
  • sloc: cpp: 9,691,462; ansic: 3,341,451; python: 712,689; asm: 518,779; xml: 208,926; java: 169,820; sh: 119,353; perl: 68,907; makefile: 28,311; yacc: 13,305; objc: 11,385; tcl: 3,186; cs: 2,225; sql: 2,217; lex: 2,215; lisp: 1,349; pascal: 1,256; awk: 407; ruby: 155; sed: 53; php: 14; exp: 11
file content (97 lines) | stat: -rw-r--r-- 3,260 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/media_galleries/fileapi/iapps_finder_impl.h"

#include <string>

#include "base/base_paths_win.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "chrome/browser/media_galleries/fileapi/iapps_finder.h"
#include "chrome/browser/media_galleries/fileapi/safe_itunes_pref_parser_win.h"
#include "chrome/common/chrome_paths.h"
#include "components/storage_monitor/storage_info.h"
#include "content/public/browser/browser_thread.h"

namespace iapps {

namespace {

// Try to read the iTunes preferences file from the default location and return
// its contents if found.
std::string GetPrefFileData() {
  std::string xml_pref_data;

  base::FilePath appdata_dir;
  if (PathService::Get(base::DIR_APP_DATA, &appdata_dir)) {
    base::FilePath pref_file = appdata_dir.AppendASCII("Apple Computer")
                                          .AppendASCII("iTunes")
                                          .AppendASCII("iTunesPrefs.xml");
    base::ReadFileToString(pref_file, &xml_pref_data);
  }
  return xml_pref_data;
}

// Check the default location for a correctly named file.
void TryDefaultLocation(const iapps::IAppsFinderCallback& callback) {
  DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);

  base::FilePath music_dir;
  if (!PathService::Get(chrome::DIR_USER_MUSIC, &music_dir)) {
    callback.Run(std::string());
    return;
  }
  base::FilePath library_file =
      music_dir.AppendASCII("iTunes").AppendASCII("iTunes Music Library.xml");

  if (!base::PathExists(library_file)) {
    callback.Run(std::string());
    return;
  }
  callback.Run(library_file.AsUTF8Unsafe());
}

// Check the location that parsing the preferences XML file found.
void FinishedParsingPrefXML(const iapps::IAppsFinderCallback& callback,
                            const base::FilePath& library_file) {
  DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);

  if (library_file.empty() || !base::PathExists(library_file)) {
    TryDefaultLocation(callback);
    return;
  }
  callback.Run(library_file.AsUTF8Unsafe());
}

void FindITunesLibraryOnFileThread(const iapps::IAppsFinderCallback& callback) {
  DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);

  std::string xml_pref_data = GetPrefFileData();
  if (xml_pref_data.empty()) {
    TryDefaultLocation(callback);
    return;
  }

  scoped_refptr<itunes::SafeITunesPrefParserWin> parser =
      new itunes::SafeITunesPrefParserWin(
          xml_pref_data,
          base::Bind(&FinishedParsingPrefXML, callback));
  parser->Start();
}

}  // namespace

// The Windows-specific ITunesFinder uses a utility process to parse the
// iTunes preferences XML file if it exists. If not or if the parsing fails,
// ITunesFinderWin will try a default location as well.
void FindITunesLibrary(const IAppsFinderCallback& callback) {
  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
  FindIAppsOnFileThread(storage_monitor::StorageInfo::ITUNES,
                        base::Bind(FindITunesLibraryOnFileThread), callback);
}

}  // namespace iapps