1 // Copyright 2014 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_UTILITY_MEDIA_GALLERIES_IPC_DATA_SOURCE_H_ 6 #define CHROME_UTILITY_MEDIA_GALLERIES_IPC_DATA_SOURCE_H_ 7 8 #include <map> 9 #include <string> 10 11 #include "base/memory/ref_counted.h" 12 #include "base/threading/thread_checker.h" 13 #include "chrome/utility/utility_message_handler.h" 14 #include "media/base/data_source.h" 15 16 namespace base { 17 class TaskRunner; 18 } 19 20 namespace metadata { 21 22 // Provides the metadata parser with bytes from the browser process via IPC. 23 // Class must be created and destroyed on the utility thread. Class may be used 24 // as a DataSource on a different thread. The utility thread must not be blocked 25 // for read operations to succeed. 26 class IPCDataSource: public media::DataSource, 27 public UtilityMessageHandler { 28 public: 29 // May only be called on the utility thread. 30 explicit IPCDataSource(int64 total_size); 31 virtual ~IPCDataSource(); 32 33 // Implementation of DataSource. These methods may be called on any single 34 // thread. First usage of these methods attaches a thread checker. 35 virtual void Stop() OVERRIDE; 36 virtual void Read(int64 position, int size, uint8* data, 37 const ReadCB& read_cb) OVERRIDE; 38 virtual bool GetSize(int64* size_out) OVERRIDE; 39 virtual bool IsStreaming() OVERRIDE; 40 virtual void SetBitrate(int bitrate) OVERRIDE; 41 42 // Implementation of UtilityMessageHandler. May only be called on the utility 43 // thread. 44 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 45 46 private: 47 struct Request { 48 Request(); 49 ~Request(); 50 uint8* destination; 51 ReadCB callback; 52 }; 53 54 void ReadOnUtilityThread(int64 position, int size, uint8* data, 55 const ReadCB& read_cb); 56 57 void OnRequestBlobBytesFinished(int64 request_id, 58 const std::string& bytes); 59 60 const int64 total_size_; 61 62 scoped_refptr<base::TaskRunner> utility_task_runner_; 63 std::map<int64, Request> pending_requests_; 64 int64 next_request_id_; 65 66 base::ThreadChecker utility_thread_checker_; 67 68 // Enforces that the DataSource methods are called on one other thread only. 69 base::ThreadChecker data_source_thread_checker_; 70 }; 71 72 } // namespace metadata 73 74 #endif // CHROME_UTILITY_MEDIA_GALLERIES_IPC_DATA_SOURCE_H_ 75