Home | History | Annotate | Download | only in base
      1 /*
      2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef WEBRTC_BASE_TRANSFORMADAPTER_H__
     12 #define WEBRTC_BASE_TRANSFORMADAPTER_H__
     13 
     14 #include "webrtc/base/stream.h"
     15 
     16 namespace rtc {
     17 ///////////////////////////////////////////////////////////////////////////////
     18 
     19 class TransformInterface {
     20 public:
     21   virtual ~TransformInterface() { }
     22 
     23   // Transform should convert the in_len bytes of input into the out_len-sized
     24   // output buffer.  If flush is true, there will be no more data following
     25   // input.
     26   // After the transformation, in_len contains the number of bytes consumed, and
     27   // out_len contains the number of bytes ready in output.
     28   // Note: Transform should not return SR_BLOCK, as there is no asynchronous
     29   // notification available.
     30   virtual StreamResult Transform(const void * input, size_t * in_len,
     31                                  void * output, size_t * out_len,
     32                                  bool flush) = 0;
     33 };
     34 
     35 ///////////////////////////////////////////////////////////////////////////////
     36 
     37 // TransformAdapter causes all data passed through to be transformed by the
     38 // supplied TransformInterface object, which may apply compression, encryption,
     39 // etc.
     40 
     41 class TransformAdapter : public StreamAdapterInterface {
     42 public:
     43   // Note that the transformation is unidirectional, in the direction specified
     44   // by the constructor.  Operations in the opposite direction result in SR_EOS.
     45   TransformAdapter(StreamInterface * stream,
     46                    TransformInterface * transform,
     47                    bool direction_read);
     48   ~TransformAdapter() override;
     49 
     50   StreamResult Read(void* buffer,
     51                     size_t buffer_len,
     52                     size_t* read,
     53                     int* error) override;
     54   StreamResult Write(const void* data,
     55                      size_t data_len,
     56                      size_t* written,
     57                      int* error) override;
     58   void Close() override;
     59 
     60   // Apriori, we can't tell what the transformation does to the stream length.
     61   bool GetAvailable(size_t* size) const override;
     62   bool ReserveSize(size_t size) override;
     63 
     64   // Transformations might not be restartable
     65   virtual bool Rewind();
     66 
     67 private:
     68   enum State { ST_PROCESSING, ST_FLUSHING, ST_COMPLETE, ST_ERROR };
     69   enum { BUFFER_SIZE = 1024 };
     70 
     71   TransformInterface * transform_;
     72   bool direction_read_;
     73   State state_;
     74   int error_;
     75 
     76   char buffer_[BUFFER_SIZE];
     77   size_t len_;
     78 };
     79 
     80 ///////////////////////////////////////////////////////////////////////////////
     81 
     82 } // namespace rtc
     83 
     84 #endif // WEBRTC_BASE_TRANSFORMADAPTER_H__
     85