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
16namespace rtc {
17///////////////////////////////////////////////////////////////////////////////
18
19class TransformInterface {
20public:
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
41class TransformAdapter : public StreamAdapterInterface {
42public:
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.
57  virtual bool GetAvailable(size_t* size) const { return false; }
58  virtual bool ReserveSize(size_t size) { return true; }
59
60  // Transformations might not be restartable
61  virtual bool Rewind() { return false; }
62
63private:
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