| /* | 
 |  * Copyright 2012 Google Inc. All Rights Reserved. | 
 |  * | 
 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 |  * you may not use this file except in compliance with the License. | 
 |  * You may obtain a copy of the License at | 
 |  * | 
 |  *     http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, software | 
 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |  * See the License for the specific language governing permissions and | 
 |  * limitations under the License. | 
 |  */ | 
 |  | 
 | #ifndef MEDIA_BASE_SHELL_DATA_SOURCE_READER_H_ | 
 | #define MEDIA_BASE_SHELL_DATA_SOURCE_READER_H_ | 
 |  | 
 | #include "base/bind.h" | 
 | #include "base/callback.h" | 
 | #include "base/message_loop.h" | 
 | #include "base/memory/ref_counted.h" | 
 | #include "base/memory/scoped_ptr.h" | 
 | #include "base/synchronization/waitable_event.h" | 
 | #include "media/base/data_source.h" | 
 |  | 
 | namespace media { | 
 |  | 
 | // Allows sharing of a DataSource object between multiple objects on a single | 
 | // thread, and exposes a simple BlockingRead() method to block the thread until | 
 | // data is available or error. To avoid circular smart pointer references this | 
 | // object is also the sole owner of a pointer to DataSource.  If we want to add | 
 | // asynchronous reading to this object it will need its own thread and a | 
 | // callback queue. | 
 | class ShellDataSourceReader | 
 |     : public base::RefCountedThreadSafe<ShellDataSourceReader> { | 
 |  public: | 
 |   static const int kReadError; | 
 |  | 
 |   ShellDataSourceReader(); | 
 |   virtual void SetDataSource(scoped_refptr<DataSource> data_source); | 
 |  | 
 |   // Block the calling thread's message loop until read is complete. | 
 |   // returns number of bytes read or kReadError on error. | 
 |   // Currently only single-threaded support. | 
 |   virtual int BlockingRead(int64 position, int size, uint8* data); | 
 |  | 
 |   // returns size of file in bytes, or -1 if file size not known. If error will | 
 |   // retry getting file size on subsequent calls to FileSize(). | 
 |   virtual int64 FileSize(); | 
 |  | 
 |   // abort any pending read, then stop the data source | 
 |   virtual void Stop(const base::Closure& callback); | 
 |  | 
 |  protected: | 
 |   friend class base::RefCountedThreadSafe<ShellDataSourceReader>; | 
 |   virtual ~ShellDataSourceReader(); | 
 |   // blocking read callback | 
 |   virtual void BlockingReadCompleted(int bytes_read); | 
 |  | 
 |   scoped_refptr<DataSource> data_source_; | 
 |   base::WaitableEvent blocking_read_event_; | 
 |   int64 file_size_; | 
 |   bool read_has_failed_; | 
 |   int last_bytes_read_;  // protected implicitly by blocking_read_event_ | 
 | }; | 
 |  | 
 | }  // namespace media | 
 |  | 
 | #endif  // MEDIA_BASE_SHELL_DATA_SOURCE_READER_H_ |