XorOutputStream.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  * XorOutputStream.h
8  *
9  * @author Slavey Karadzhov <slaff@attachix.com>
10  *
11  ****/
12 
13 #pragma once
14 
16 
22 {
23 public:
30  XorOutputStream(IDataSourceStream* stream, uint8_t* mask, size_t maskLength)
31  : stream(stream), mask(mask), maskLength(maskLength)
32  {
33  }
34 
35  StreamType getStreamType() const override
36  {
37  return eSST_Transform;
38  }
39 
40  int available() override
41  {
42  return stream->available();
43  }
44 
45  uint16_t readMemoryBlock(char* data, int bufSize) override
46  {
47  uint16_t max = stream->readMemoryBlock(data, bufSize);
48  size_t pos = maskPos;
49  for(unsigned i = 0; i < max; i++) {
50  pos = pos % maskLength;
51  data[i] = (data[i] ^ mask[pos]);
52  pos++;
53  }
54 
55  return max;
56  }
57 
58  bool seek(int len) override
59  {
60  if(!stream->seek(len)) {
61  return false;
62  }
63 
64  maskPos = (maskPos + len) % maskLength;
65  return true;
66  }
67 
68  bool isFinished() override
69  {
70  return stream->isFinished();
71  }
72 
73 private:
74  std::unique_ptr<IDataSourceStream> stream;
75  uint8_t* mask;
76  size_t maskLength;
77  size_t maskPos = 0;
78 };
Base class for read-only stream.
Definition: DataSourceStream.h:45
@ eSST_Transform
A stream that is transforming the data.
Definition: DataSourceStream.h:35
XorOutputStream(IDataSourceStream *stream, uint8_t *mask, size_t maskLength)
Constructor.
Definition: XorOutputStream.h:40
bool seek(int len) override
Move read cursor.
Definition: XorOutputStream.h:68
virtual uint16_t readMemoryBlock(char *data, int bufSize)=0
Read a block of memory.
virtual bool isFinished()=0
Check if all data has been read.
StreamType
Data stream type.
Definition: DataSourceStream.h:25
bool isFinished() override
Check if all data has been read.
Definition: XorOutputStream.h:78
virtual bool seek(int len)
Move read cursor.
Definition: DataSourceStream.h:106
Xors original stream content with the specified mask.
Definition: XorOutputStream.h:21
uint16_t readMemoryBlock(char *data, int bufSize) override
Read a block of memory.
Definition: XorOutputStream.h:55
int available() override
Return the total length of the stream.
Definition: XorOutputStream.h:50
StreamType getStreamType() const override
Get the stream type.
Definition: XorOutputStream.h:45
virtual int available()
Return the total length of the stream.
Definition: DataSourceStream.h:120