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_PICASA_ALBUM_TABLE_READER_H_ 6 #define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_SAFE_PICASA_ALBUM_TABLE_READER_H_ 7 8 #include <string> 9 10 #include "base/callback.h" 11 #include "base/compiler_specific.h" 12 #include "base/memory/weak_ptr.h" 13 #include "chrome/common/media_galleries/picasa_types.h" 14 #include "content/public/browser/utility_process_host.h" 15 #include "content/public/browser/utility_process_host_client.h" 16 17 namespace base { 18 class FilePath; 19 } 20 21 namespace IPC { 22 class Message; 23 } 24 25 namespace picasa { 26 27 // SafePicasaAlbumTableReader parses the given Picasa PMP Album Table safely 28 // via a utility process. The SafePicasaAlbumTableReader object is ref-counted 29 // and kept alive after Start() is called until the ParserCallback is called. 30 // The ParserCallback is guaranteed to be called eventually either when the 31 // utility process replies or when it dies. 32 class SafePicasaAlbumTableReader : public content::UtilityProcessHostClient { 33 public: 34 typedef base::Callback<void(bool, 35 const std::vector<AlbumInfo>&, 36 const std::vector<AlbumInfo>&)> ParserCallback; 37 38 SafePicasaAlbumTableReader(const AlbumTableFiles& album_table_files, 39 const ParserCallback& callback); 40 41 void Start(); 42 43 private: 44 enum ParserState { 45 INITIAL_STATE, 46 PINGED_UTILITY_PROCESS_STATE, 47 STARTED_PARSING_STATE, 48 FINISHED_PARSING_STATE, 49 }; 50 51 // Private because content::UtilityProcessHostClient is ref-counted. 52 virtual ~SafePicasaAlbumTableReader(); 53 54 // Launches the utility process. Must run on the IO thread. 55 void StartWorkOnIOThread(); 56 57 // Notification that the utility process is running, and we can now get its 58 // process handle. 59 // Runs on the IO thread. 60 void OnProcessStarted(); 61 62 // Notification from the utility process when it finshes parsing the PMP 63 // database. This is received even if PMP parsing fails. 64 // Runs on the IO thread. 65 void OnParsePicasaPMPDatabaseFinished(bool parse_success, 66 const std::vector<AlbumInfo>& albums, 67 const std::vector<AlbumInfo>& folders); 68 69 // UtilityProcessHostClient implementation. 70 // Runs on the IO thread. 71 virtual void OnProcessCrashed(int exit_code) OVERRIDE; 72 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 73 74 const AlbumTableFiles album_table_files_; 75 76 // Only accessed on the IO thread. 77 base::WeakPtr<content::UtilityProcessHost> utility_process_host_; 78 79 // Only accessed on the Media Task Runner. 80 const ParserCallback callback_; 81 82 // Verifies the messages from the utility process came at the right time. 83 // Initialized on the Media Task Runner, but only accessed on the IO thread. 84 ParserState parser_state_; 85 86 DISALLOW_COPY_AND_ASSIGN(SafePicasaAlbumTableReader); 87 }; 88 89 } // namespace picasa 90 91 #endif // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_SAFE_PICASA_ALBUM_TABLE_READER_H_ 92