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