Home | History | Annotate | Download | only in streams
      1 // Copyright (c) 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 CONTENT_BROWSER_STREAMS_STREAM_H_
      6 #define CONTENT_BROWSER_STREAMS_STREAM_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/memory/ref_counted.h"
     10 #include "base/memory/weak_ptr.h"
     11 #include "content/browser/byte_stream.h"
     12 #include "content/common/content_export.h"
     13 #include "url/gurl.h"
     14 
     15 namespace net {
     16 class IOBuffer;
     17 }
     18 
     19 namespace content {
     20 
     21 class StreamHandle;
     22 class StreamHandleImpl;
     23 class StreamReadObserver;
     24 class StreamRegistry;
     25 class StreamWriteObserver;
     26 
     27 // A stream that sends data from an arbitrary source to an internal URL
     28 // that can be read by an internal consumer.  It will continue to pull from the
     29 // original URL as long as there is data available.  It can be read from
     30 // multiple clients, but only one can be reading at a time. This allows a
     31 // reader to consume part of the stream, then pass it along to another client
     32 // to continue processing the stream.
     33 class CONTENT_EXPORT Stream : public base::RefCountedThreadSafe<Stream> {
     34  public:
     35   enum StreamState {
     36     STREAM_HAS_DATA,
     37     STREAM_COMPLETE,
     38     STREAM_EMPTY,
     39   };
     40 
     41   // Creates a stream.
     42   //
     43   // Security origin of Streams is checked in Blink (See BlobRegistry,
     44   // BlobURL and SecurityOrigin to understand how it works). There's no security
     45   // origin check in Chromium side for now.
     46   Stream(StreamRegistry* registry,
     47          StreamWriteObserver* write_observer,
     48          const GURL& url);
     49 
     50   // Sets the reader of this stream. Returns true on success, or false if there
     51   // is already a reader.
     52   bool SetReadObserver(StreamReadObserver* observer);
     53 
     54   // Removes the read observer.  |observer| must be the current observer.
     55   void RemoveReadObserver(StreamReadObserver* observer);
     56 
     57   // Removes the write observer.  |observer| must be the current observer.
     58   void RemoveWriteObserver(StreamWriteObserver* observer);
     59 
     60   // Adds the data in |buffer| to the stream.  Takes ownership of |buffer|.
     61   void AddData(scoped_refptr<net::IOBuffer> buffer, size_t size);
     62   // Adds data of |size| at |data| to the stream. This method creates a copy
     63   // of the data, and then passes it to |writer_|.
     64   void AddData(const char* data, size_t size);
     65 
     66   // Notifies this stream that it will not be receiving any more data.
     67   void Finalize();
     68 
     69   // Reads a maximum of |buf_size| from the stream into |buf|.  Sets
     70   // |*bytes_read| to the number of bytes actually read.
     71   // Returns STREAM_HAS_DATA if data was read, STREAM_EMPTY if no data was read,
     72   // and STREAM_COMPLETE if the stream is finalized and all data has been read.
     73   StreamState ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read);
     74 
     75   scoped_ptr<StreamHandle> CreateHandle(const GURL& original_url,
     76                                         const std::string& mime_type);
     77   void CloseHandle();
     78 
     79   // Indicates whether there is space in the buffer to add more data.
     80   bool can_add_data() const { return can_add_data_; }
     81 
     82   const GURL& url() const { return url_; }
     83 
     84  private:
     85   friend class base::RefCountedThreadSafe<Stream>;
     86 
     87   virtual ~Stream();
     88 
     89   void OnSpaceAvailable();
     90   void OnDataAvailable();
     91 
     92   size_t data_bytes_read_;
     93   bool can_add_data_;
     94 
     95   GURL url_;
     96 
     97   scoped_refptr<net::IOBuffer> data_;
     98   size_t data_length_;
     99 
    100   scoped_ptr<ByteStreamWriter> writer_;
    101   scoped_ptr<ByteStreamReader> reader_;
    102 
    103   StreamRegistry* registry_;
    104   StreamReadObserver* read_observer_;
    105   StreamWriteObserver* write_observer_;
    106 
    107   StreamHandleImpl* stream_handle_;
    108 
    109   base::WeakPtrFactory<Stream> weak_ptr_factory_;
    110   DISALLOW_COPY_AND_ASSIGN(Stream);
    111 };
    112 
    113 }  // namespace content
    114 
    115 #endif  // CONTENT_BROWSER_STREAMS_STREAM_H_
    116