/* * 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 RTC_BASE_TRANSFORMADAPTER_H_ #define RTC_BASE_TRANSFORMADAPTER_H_ #include "rtc_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); ~TransformAdapter() override; StreamResult Read(void* buffer, size_t buffer_len, size_t* read, int* error) override; StreamResult Write(const void* data, size_t data_len, size_t* written, int* error) override; void Close() override; // Apriori, we can't tell what the transformation does to the stream length. bool GetAvailable(size_t* size) const override; bool ReserveSize(size_t size) override; // Transformations might not be restartable virtual bool Rewind(); 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 // RTC_BASE_TRANSFORMADAPTER_H_