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#ifndef CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_SAFE_ITUNES_PREF_PARSER_WIN_H_
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_SAFE_ITUNES_PREF_PARSER_WIN_H_
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <string>
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/callback.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/compiler_specific.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/utility_process_host_client.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace base {
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass FilePath;
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace IPC {
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass Message;
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace itunes {
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// SafeITunesPrefParserWin parses the given iTunes preferences XML data safely
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// via a utility process. The SafeITunesPrefParserWin object is ref-counted and
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// kept alive after Start() is called until the ParserCallback is called.
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// The ParserCallback is guaranteed to be called eventually either when the
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// utility process replies or when it dies.
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SafeITunesPrefParserWin : public content::UtilityProcessHostClient {
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef base::Callback<void(const base::FilePath&)> ParserCallback;
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SafeITunesPrefParserWin(const std::string& unsafe_xml,
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          const ParserCallback& callback);
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void Start();
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  enum ParserState {
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    INITIAL_STATE,
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    STARTED_PARSING_STATE,
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    FINISHED_PARSING_STATE,
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Private because content::UtilityProcessHostClient is ref-counted.
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~SafeITunesPrefParserWin();
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void StartWorkOnIOThread();
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Handles the results from OnProcessCrashed() and OnMessageReceived() on
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // the IO thread.
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnGotITunesDirectory(const base::FilePath& library_file);
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // UtilityProcessHostClient implementation.
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnProcessCrashed(int exit_code) OVERRIDE;
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const std::string unsafe_xml_;
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const ParserCallback callback_;
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Verifies the messages from the utility process came at the right time.
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Initialized on the FILE thread, but only accessed on the IO thread.
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ParserState parser_state_;
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(SafeITunesPrefParserWin);
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace itunes
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_SAFE_ITUNES_PREF_PARSER_WIN_H_
71