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 17namespace base { 18class FilePath; 19} 20 21namespace IPC { 22class Message; 23} 24 25namespace 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. 32class 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