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 16namespace base { 17class TaskRunner; 18} 19 20namespace 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. 26class 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