Home | History | Annotate | Download | only in media_galleries
      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(const base::Closure& callback) 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