• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
~TransformInterface()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   virtual ~TransformAdapter();
49 
50   virtual StreamResult Read(void * buffer, size_t buffer_len,
51                             size_t * read, int * error);
52   virtual StreamResult Write(const void * data, size_t data_len,
53                              size_t * written, int * error);
54   virtual void Close();
55 
56   // Apriori, we can't tell what the transformation does to the stream length.
GetAvailable(size_t * size)57   virtual bool GetAvailable(size_t* size) const { return false; }
ReserveSize(size_t size)58   virtual bool ReserveSize(size_t size) { return true; }
59 
60   // Transformations might not be restartable
Rewind()61   virtual bool Rewind() { return false; }
62 
63 private:
64   enum State { ST_PROCESSING, ST_FLUSHING, ST_COMPLETE, ST_ERROR };
65   enum { BUFFER_SIZE = 1024 };
66 
67   TransformInterface * transform_;
68   bool direction_read_;
69   State state_;
70   int error_;
71 
72   char buffer_[BUFFER_SIZE];
73   size_t len_;
74 };
75 
76 ///////////////////////////////////////////////////////////////////////////////
77 
78 } // namespace rtc
79 
80 #endif // WEBRTC_BASE_TRANSFORMADAPTER_H__
81