Home | History | Annotate | Download | only in fileapi
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_SAFE_IAPPS_LIBRARY_PARSER_H_
      6 #define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_SAFE_IAPPS_LIBRARY_PARSER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/callback.h"
     11 #include "base/compiler_specific.h"
     12 #include "base/files/file.h"
     13 #include "base/files/file_path.h"
     14 #include "base/memory/weak_ptr.h"
     15 #include "chrome/common/media_galleries/iphoto_library.h"
     16 #include "chrome/common/media_galleries/itunes_library.h"
     17 #include "content/public/browser/utility_process_host.h"
     18 #include "content/public/browser/utility_process_host_client.h"
     19 
     20 namespace IPC {
     21 class Message;
     22 }
     23 
     24 namespace iapps {
     25 
     26 // SafeIAppsLibraryParser parses the given iTunes library XML file safely via
     27 // a utility process. The SafeIAppsLibraryParser object is ref-counted and
     28 // kept alive after Start() is called until the ParserCallback is called.
     29 // The ParserCallback is guaranteed to be called eventually either when the
     30 // utility process replies or when it dies.
     31 // Since iApps library XML files can be big, SafeIAppsLibraryParser passes
     32 // the file handle to the utility process.
     33 // SafeIAppsLibraryParser lives on the Media Task Runner unless otherwise
     34 // noted.
     35 class SafeIAppsLibraryParser : public content::UtilityProcessHostClient {
     36  public:
     37   typedef base::Callback<void(bool, const iphoto::parser::Library&)>
     38       IPhotoParserCallback;
     39   typedef base::Callback<void(bool, const itunes::parser::Library&)>
     40       ITunesParserCallback;
     41 
     42   SafeIAppsLibraryParser();
     43 
     44   // Start the parse of the iPhoto library file.
     45   void ParseIPhotoLibrary(const base::FilePath& library_file,
     46                           const IPhotoParserCallback& callback);
     47 
     48   // Start the parse of the iTunes library file.
     49   void ParseITunesLibrary(const base::FilePath& library_file,
     50                           const ITunesParserCallback& callback);
     51 
     52 
     53  private:
     54   enum ParserState {
     55     INITIAL_STATE,
     56     PINGED_UTILITY_PROCESS_STATE,
     57     STARTED_PARSING_STATE,
     58     FINISHED_PARSING_STATE,
     59   };
     60 
     61   // content::UtilityProcessHostClient is ref-counted.
     62   virtual ~SafeIAppsLibraryParser();
     63 
     64   // Posts a task to start the XML parsing in the utility process.
     65   void Start();
     66 
     67   // Launches the utility process.  Must run on the IO thread.
     68   void StartProcessOnIOThread();
     69 
     70   // Notification that the utility process is running, and we can now get its
     71   // process handle.
     72   // Runs on the IO thread.
     73   void OnUtilityProcessStarted();
     74 
     75   // Notification from the utility process when it finishes parsing the
     76   // iPhoto XML. Runs on the IO thread.
     77 #if defined(OS_MACOSX)
     78   void OnGotIPhotoLibrary(bool result, const iphoto::parser::Library& library);
     79 #endif
     80 
     81   // Notification from the utility process when it finishes parsing the
     82   // iTunes XML. Runs on the IO thread.
     83   void OnGotITunesLibrary(bool result, const itunes::parser::Library& library);
     84 
     85   // Sets |parser_state_| in case the library XML file cannot be opened.
     86   // Runs on the IO thread.
     87   void OnOpenLibraryFileFailed();
     88 
     89   // Communicates an error to the callback given to the constructor.
     90   void OnError();
     91 
     92   // UtilityProcessHostClient implementation.
     93   // Runs on the IO thread.
     94   virtual void OnProcessCrashed(int exit_code) OVERRIDE;
     95   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
     96 
     97   base::FilePath library_file_path_;
     98 
     99   // Once we have opened the file, we store the handle so that we can use it
    100   // once the utility process has launched.
    101   base::File library_file_;
    102 
    103   // Only accessed on the IO thread.
    104   base::WeakPtr<content::UtilityProcessHost> utility_process_host_;
    105 
    106   // Only accessed on the Media Task Runner.
    107   ITunesParserCallback itunes_callback_;
    108 
    109   // Only accessed on the Media Task Runner.
    110   IPhotoParserCallback iphoto_callback_;
    111 
    112   // Verifies the messages from the utility process came at the right time.
    113   // Initialized on the Media Task Runner, but only accessed on the IO thread.
    114   ParserState parser_state_;
    115 
    116   DISALLOW_COPY_AND_ASSIGN(SafeIAppsLibraryParser);
    117 };
    118 
    119 }  // namespace iapps
    120 
    121 #endif  // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_SAFE_IAPPS_LIBRARY_PARSER_H_
    122