StreamTransformer.h
Go to the documentation of this file.
1 /****
2  * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development.
3  * Created 2015 by Skurydin Alexey
4  * http://github.com/SmingHub/Sming
5  * All files of the Sming Core are provided under the LGPL v3 license.
6  *
7  * StreamTransformer.h
8  *
9  * @author Slavey Karadzhov <slaff@attachix.com>
10  *
11  ****/
12 
13 #pragma once
14 
15 #include "Buffer/CircularBuffer.h"
16 #include <memory>
17 
22 {
23 public:
24  StreamTransformer(IDataSourceStream* stream, size_t resultSize = 256, size_t blockSize = 64)
25  : resultSize(resultSize), blockSize(blockSize)
26  {
27  sourceStream.reset(stream);
28  result.reset(new uint8_t[resultSize]);
29  }
30 
31  //Use base class documentation
32  StreamType getStreamType() const override
33  {
34  return sourceStream->getStreamType();
35  }
36 
41  int available() override
42  {
43  return -1;
44  }
45 
46  bool isValid() const
47  {
48  return sourceStream && sourceStream->isValid();
49  }
50 
51  uint16_t readMemoryBlock(char* data, int bufSize) override;
52 
53  bool seek(int len) override;
54 
55  bool isFinished() override;
56 
57  String getName() const override
58  {
59  return sourceStream ? sourceStream->getName() : String::nullstr;
60  }
61 
66  virtual void saveState(){};
67 
71  virtual void restoreState(){};
72 
73 protected:
83  virtual size_t transform(const uint8_t* in, size_t inLength, uint8_t* out, size_t outLength) = 0;
84 
85 private:
86  void fillTempStream(char* buffer, size_t bufSize);
87 
88  std::unique_ptr<IDataSourceStream> sourceStream;
89  std::unique_ptr<CircularBuffer> tempStream;
90  std::unique_ptr<uint8_t[]> result;
91  size_t resultSize;
92  size_t blockSize;
93 };
Base class for read-only stream.
Definition: DataSourceStream.h:46
Class that can be used to transform streams of data on the fly.
Definition: StreamTransformer.h:22
bool seek(int len) override
Move read cursor.
bool isValid() const
Determine if the stream object contains valid data.
Definition: StreamTransformer.h:46
uint16_t readMemoryBlock(char *data, int bufSize) override
Read a block of memory.
bool isFinished() override
Check if all data has been read.
virtual void restoreState()
A method that restores the last backed up state.
Definition: StreamTransformer.h:71
int available() override
Return the total length of the stream.
Definition: StreamTransformer.h:41
virtual void saveState()
A method that backs up the current state.
Definition: StreamTransformer.h:66
String getName() const override
Returns name of the resource.
Definition: StreamTransformer.h:57
StreamType getStreamType() const override
Get the stream type.
Definition: StreamTransformer.h:32
StreamTransformer(IDataSourceStream *stream, size_t resultSize=256, size_t blockSize=64)
Definition: StreamTransformer.h:24
virtual size_t transform(const uint8_t *in, size_t inLength, uint8_t *out, size_t outLength)=0
Inherited class implements this method to transform a block of data.
The String class.
Definition: WString.h:137
static const String nullstr
A null string evaluates to false.
Definition: WString.h:148
StreamType
Data stream type.
Definition: DataSourceStream.h:25