55
66#include " BaseBufferedRemoteTransport.h"
77
8- using namespace tcremote ;
8+ namespace tcremote {
99
10- BaseBufferedRemoteTransport::BaseBufferedRemoteTransport (BufferingMode bufferMode, uint8_t readBufferSize, uint8_t writeBufferSize)
11- : TagValueTransport(TVAL_BUFFERED), writeBufferSize(writeBufferSize), writeBufferPos(0 ),
12- readBufferSize(readBufferSize), readBufferPos(0 ), readBufferAvail(0 ), mode(bufferMode), ticksSinceWrite(0 ) {
13- readBuffer = new uint8_t [readBufferSize];
14- writeBuffer = new uint8_t [writeBufferSize];
15- }
16-
17- BaseBufferedRemoteTransport::~BaseBufferedRemoteTransport () {
18- delete[] readBuffer;
19- delete[] writeBuffer;
20- }
10+ BaseBufferedRemoteTransport::BaseBufferedRemoteTransport (BufferingMode bufferMode, uint8_t readBufferSize,
11+ uint8_t writeBufferSize, EncryptionHandler* encHandler)
12+ : TagValueTransport(TVAL_BUFFERED), writeBufferSize(writeBufferSize),
13+ readBufferSize (readBufferSize), writeBufferPos(0 ), readBufferPos(0 ), encryptionBufferPos(0 ), readBufferAvail(0 ),
14+ encryptionHandler(encHandler), mode(bufferMode),
15+ ticksSinceWrite(0 ) {
16+ if (mode != BUFFER_ONE_MESSAGE && encHandler != nullptr ) {
17+ serlogF (SER_ERROR, " EncHandler requires mode=BUFFER_ONE_MESSAGE" );
18+ encHandler = nullptr ; // turn off encryption, will not work in any other mode
19+ }
20+ readBuffer = new uint8_t [readBufferSize];
21+ writeBuffer = new uint8_t [writeBufferSize];
22+ encryptionBuffer = new uint8_t [readBufferSize];
23+ }
2124
22- void BaseBufferedRemoteTransport::endMsg () {
23- TagValueTransport::endMsg () ;
24- if (mode == BUFFER_ONE_MESSAGE) flush () ;
25- }
25+ BaseBufferedRemoteTransport::~BaseBufferedRemoteTransport () {
26+ delete[] readBuffer ;
27+ delete[] writeBuffer ;
28+ }
2629
27- uint8_t BaseBufferedRemoteTransport::readByte () {
28- if (!readAvailable ()) return -1 ;
29- auto ch = readBuffer[readBufferPos];
30- readBufferPos += 1 ;
31- // only uncomment the below for worst case debugging.
32- // serlogF2(SER_DEBUG, "readByte ", ch);
33- return ch;
34- }
30+ void BaseBufferedRemoteTransport::endMsg () {
31+ TagValueTransport::endMsg ();
32+ if (mode == BUFFER_ONE_MESSAGE) flushInternal ();
33+ }
3534
36- bool BaseBufferedRemoteTransport::readAvailable () {
37- if (readBufferAvail && readBufferPos < readBufferAvail) {
38- return true ;
35+ uint8_t BaseBufferedRemoteTransport::readByte () {
36+ if (!readAvailable ()) return -1 ;
37+ auto ch = readBuffer[readBufferPos];
38+ readBufferPos += 1 ;
39+ // only uncomment the below for worst case debugging.
40+ // serlogF2(SER_DEBUG, "readByte ", ch);
41+ return ch;
3942 }
4043
41- readBufferAvail = ( int8_t ) fillReadBuffer (readBuffer, readBufferSize);
42- readBufferPos = 0 ;
43- return readBufferPos < readBufferAvail ;
44- }
44+ bool BaseBufferedRemoteTransport::readAvailable () {
45+ if (readBufferAvail && readBufferPos < readBufferAvail) {
46+ return true ;
47+ }
4548
46- int BaseBufferedRemoteTransport::writeChar (char data) {
47- if (writeBufferPos >= writeBufferSize) {
48- // we've exceeded the buffer size so we must flush, and then ensure
49- // that flush actually did something and there is now capacity.
50- flush ();
51- if (writeBufferPos >= writeBufferSize) return 0 ;// we did not write so return an error condition.
49+ if (encryptionHandler != nullptr && encryptionBuffer != nullptr ) {
50+ readBufferAvail = readBufferPos = 0 ;
51+ if (encryptionBufferPos < 2 ) {
52+ encryptionBufferPos = (uint16_t ) fillReadBuffer (encryptionBuffer, readBufferSize);
53+ }
54+ if (encryptionBufferPos >= 2 ) {
55+ int encryptionSize = (encryptionBuffer[0 ] << 8 ) + encryptionBuffer[1 ];
56+ if (encryptionBufferPos >= encryptionSize) {
57+ int len = encryptionHandler->decryptData (&encryptionBuffer[2 ], encryptionBufferPos - 2 , readBuffer, readBufferSize);
58+ readBufferAvail = len;
59+ readBufferPos = 0 ;
60+ encryptionBufferPos = 0 ;
61+ return len > 0 ;
62+ }
63+ }
64+ } else {
65+ readBufferAvail = (uint16_t ) fillReadBuffer (readBuffer, readBufferSize);
66+ readBufferPos = 0 ;
67+ }
68+ return readBufferPos < readBufferAvail;
5269 }
53- writeBuffer[writeBufferPos++] = data;
54- ticksSinceWrite = 0 ;
55- return 1 ;
56- }
5770
58- int BaseBufferedRemoteTransport::writeStr (const char *data) {
59- // only uncomment below for worst case debugging..
60- // serlogF2(SER_NETWORK_DEBUG, "writing ", data);
71+ int BaseBufferedRemoteTransport::writeChar (char data) {
72+ if (writeBufferPos >= writeBufferSize) {
73+ // we've exceeded the buffer size so we must flush, and then ensure
74+ // that flush actually did something and there is now capacity.
75+ flushInternal ();
76+ if (writeBufferPos >= writeBufferSize) return 0 ;// we did not write so return an error condition.
77+ }
78+ writeBuffer[writeBufferPos++] = data;
79+ ticksSinceWrite = 0 ;
80+ return 1 ;
81+ }
82+
83+ int BaseBufferedRemoteTransport::writeStr (const char *data) {
84+ // only uncomment below for worst case debugging..
85+ // serlogF2(SER_NETWORK_DEBUG, "writing ", data);
6186
62- size_t len = strlen (data);
63- for (size_t i = 0 ; i < len; ++i) {
64- if (writeChar (data[i]) == 0 ) {
65- return 0 ;
87+ size_t len = strlen (data);
88+ for (size_t i = 0 ; i < len; ++i) {
89+ if (writeChar (data[i]) == 0 ) {
90+ return 0 ;
91+ }
6692 }
93+ return (int ) len;
6794 }
68- return (int )len;
69- }
7095
71- void BaseBufferedRemoteTransport::flushIfRequired () {
72- if (!connected () || writeBufferPos == 0 || mode == BUFFER_ONE_MESSAGE) return ;
96+ void BaseBufferedRemoteTransport::flushIfRequired () {
97+ if (!connected () || writeBufferPos == 0 || mode == BUFFER_ONE_MESSAGE) return ;
7398
74- if (ticksSinceWrite < TICKS_TO_FLUSH_WRITE) ++ticksSinceWrite;
75- if (ticksSinceWrite == TICKS_TO_FLUSH_WRITE) {
76- ticksSinceWrite = 0xff ;
77- flush ();
99+ if (ticksSinceWrite < TICKS_TO_FLUSH_WRITE) ++ticksSinceWrite;
100+ if (ticksSinceWrite == TICKS_TO_FLUSH_WRITE) {
101+ ticksSinceWrite = 0xff ;
102+ flush ();
103+ }
78104 }
79- }
80105
81- void BaseBufferedRemoteTransport::close () {
82- flush ();
83- writeBufferPos = 0 ;
84- readBufferPos = 0 ;
85- readBufferAvail = 0 ;
86- currentField.msgType = UNKNOWN_MSG_TYPE;
87- currentField.fieldType = FVAL_PROCESSING_AWAITINGMSG;
88- }
106+ void BaseBufferedRemoteTransport::close () {
107+ writeBufferPos = 0 ;
108+ readBufferPos = 0 ;
109+ readBufferAvail = 0 ;
110+ currentField.msgType = UNKNOWN_MSG_TYPE;
111+ currentField.fieldType = FVAL_PROCESSING_AWAITINGMSG;
112+ }
113+
114+ void BaseBufferedRemoteTransport::flushInternal () {
115+ if (encryptionHandler != nullptr && encryptionBuffer != nullptr ) {
116+ int written = encryptionHandler->encryptData (writeBuffer, writeBufferPos, encryptionBuffer, writeBufferSize);
117+ if (written == 0 ) {
118+ serlogF (SER_ERROR, " Net encrypt fail" );
119+ close ();
120+ } else {
121+ memcpy (writeBuffer, encryptionBuffer, written);
122+ writeBufferPos = written;
123+ flush ();
124+ }
125+ } else {
126+ flush ();
127+ }
128+ }
129+ }
0 commit comments