1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/media_galleries/fileapi/safe_itunes_pref_parser_win.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/extensions/chrome_utility_extensions_messages.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/browser_thread.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/utility_process_host.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing content::BrowserThread;
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing content::UtilityProcessHost;
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace itunes {
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSafeITunesPrefParserWin::SafeITunesPrefParserWin(
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::string& unsafe_xml,
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const ParserCallback& callback)
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : unsafe_xml_(unsafe_xml),
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      callback_(callback),
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      parser_state_(INITIAL_STATE) {
22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(!callback_.is_null());
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SafeITunesPrefParserWin::Start() {
27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BrowserThread::PostTask(
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BrowserThread::IO,
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FROM_HERE,
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&SafeITunesPrefParserWin::StartWorkOnIOThread, this));
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSafeITunesPrefParserWin::~SafeITunesPrefParserWin() {
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SafeITunesPrefParserWin::StartWorkOnIOThread() {
38e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::IO);
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK_EQ(INITIAL_STATE, parser_state_);
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UtilityProcessHost* host =
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      UtilityProcessHost::Create(this, base::MessageLoopProxy::current());
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  host->Send(new ChromeUtilityMsg_ParseITunesPrefXml(unsafe_xml_));
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  parser_state_ = STARTED_PARSING_STATE;
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SafeITunesPrefParserWin::OnGotITunesDirectory(
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const base::FilePath& library_file) {
49e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::IO);
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (parser_state_ != STARTED_PARSING_STATE)
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          base::Bind(callback_, library_file));
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  parser_state_ = FINISHED_PARSING_STATE;
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SafeITunesPrefParserWin::OnProcessCrashed(int exit_code) {
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  OnGotITunesDirectory(base::FilePath());
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool SafeITunesPrefParserWin::OnMessageReceived(
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const IPC::Message& message) {
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool handled = true;
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  IPC_BEGIN_MESSAGE_MAP(SafeITunesPrefParserWin, message)
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_GotITunesDirectory,
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                        OnGotITunesDirectory)
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    IPC_MESSAGE_UNHANDLED(handled = false)
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  IPC_END_MESSAGE_MAP()
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return handled;
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace itunes
74