|  | /* | 
|  | *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #ifndef WEBRTC_BASE_TRANSFORMADAPTER_H__ | 
|  | #define WEBRTC_BASE_TRANSFORMADAPTER_H__ | 
|  |  | 
|  | #include "webrtc/base/stream.h" | 
|  |  | 
|  | namespace rtc { | 
|  | /////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | class TransformInterface { | 
|  | public: | 
|  | virtual ~TransformInterface() { } | 
|  |  | 
|  | // Transform should convert the in_len bytes of input into the out_len-sized | 
|  | // output buffer.  If flush is true, there will be no more data following | 
|  | // input. | 
|  | // After the transformation, in_len contains the number of bytes consumed, and | 
|  | // out_len contains the number of bytes ready in output. | 
|  | // Note: Transform should not return SR_BLOCK, as there is no asynchronous | 
|  | // notification available. | 
|  | virtual StreamResult Transform(const void * input, size_t * in_len, | 
|  | void * output, size_t * out_len, | 
|  | bool flush) = 0; | 
|  | }; | 
|  |  | 
|  | /////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | // TransformAdapter causes all data passed through to be transformed by the | 
|  | // supplied TransformInterface object, which may apply compression, encryption, | 
|  | // etc. | 
|  |  | 
|  | class TransformAdapter : public StreamAdapterInterface { | 
|  | public: | 
|  | // Note that the transformation is unidirectional, in the direction specified | 
|  | // by the constructor.  Operations in the opposite direction result in SR_EOS. | 
|  | TransformAdapter(StreamInterface * stream, | 
|  | TransformInterface * transform, | 
|  | bool direction_read); | 
|  | virtual ~TransformAdapter(); | 
|  |  | 
|  | virtual StreamResult Read(void * buffer, size_t buffer_len, | 
|  | size_t * read, int * error); | 
|  | virtual StreamResult Write(const void * data, size_t data_len, | 
|  | size_t * written, int * error); | 
|  | virtual void Close(); | 
|  |  | 
|  | // Apriori, we can't tell what the transformation does to the stream length. | 
|  | virtual bool GetAvailable(size_t* size) const { return false; } | 
|  | virtual bool ReserveSize(size_t size) { return true; } | 
|  |  | 
|  | // Transformations might not be restartable | 
|  | virtual bool Rewind() { return false; } | 
|  |  | 
|  | private: | 
|  | enum State { ST_PROCESSING, ST_FLUSHING, ST_COMPLETE, ST_ERROR }; | 
|  | enum { BUFFER_SIZE = 1024 }; | 
|  |  | 
|  | TransformInterface * transform_; | 
|  | bool direction_read_; | 
|  | State state_; | 
|  | int error_; | 
|  |  | 
|  | char buffer_[BUFFER_SIZE]; | 
|  | size_t len_; | 
|  | }; | 
|  |  | 
|  | /////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | } // namespace rtc | 
|  |  | 
|  | #endif // WEBRTC_BASE_TRANSFORMADAPTER_H__ |