/*
* 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__