diff --git a/src/HomeSpan.h b/src/HomeSpan.h index e3be0a6..14d5fe5 100644 --- a/src/HomeSpan.h +++ b/src/HomeSpan.h @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -67,6 +68,27 @@ enum { GET_VALUE=128 }; +/////////////////////////////// + +class StreamBuffer : public std::streambuf { + + private: + + char *buffer; + WiFiClient *client; + + int flushBuffer() ; + int_type overflow(int_type c) override; + int sync() override; + + public: + + StreamBuffer(WiFiClient *client, size_t bufSize=1024); + ~StreamBuffer(); + +}; + + /////////////////////////////// template diff --git a/src/Streamer.cpp b/src/Streamer.cpp new file mode 100644 index 0000000..3e1646f --- /dev/null +++ b/src/Streamer.cpp @@ -0,0 +1,81 @@ +/********************************************************************************* + * MIT License + * + * Copyright (c) 2020-2023 Gregg E. Berman + * + * https://github.com/HomeSpan/HomeSpan + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + ********************************************************************************/ + +#include "HomeSpan.h" + +StreamBuffer::StreamBuffer(WiFiClient *client, size_t bufSize){ + + this->client=client; + buffer=(char *)HS_MALLOC(bufSize); + setp (buffer, buffer+bufSize-1); +} + +////////////////////////////////////// + +StreamBuffer::~StreamBuffer(){ + + free(buffer); + sync(); +} + +////////////////////////////////////// + +int StreamBuffer::flushBuffer(){ + int num=pptr()-pbase(); + + write(1,buffer,num); + client->write(buffer,num); + delay(1); + + pbump(-num); + return num; +} + +////////////////////////////////////// + +StreamBuffer::int_type StreamBuffer::overflow(StreamBuffer::int_type c){ + + if(c!=EOF){ + *pptr() = c; + pbump(1); + } + + if(flushBuffer()==EOF) + return EOF; + return c; +} + +////////////////////////////////////// + +int StreamBuffer::sync(){ + + if(flushBuffer()==EOF) + return -1; + return 0; +} + +////////////////////////////////////// diff --git a/src/Utils.h b/src/Utils.h index 7b0149d..756511d 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -27,11 +27,7 @@ #pragma once -#include -#include - #include -#include #if defined(BOARD_HAS_PSRAM) #define HS_MALLOC ps_malloc @@ -52,65 +48,6 @@ String mask(char *c, int n); // simply utility that creates a String fr } -///////////////////////////////////////////////// - -class StreamBuffer : public std::streambuf { - - protected: - - char *buffer; - WiFiClient *client; - - public: - - StreamBuffer(WiFiClient *client, size_t bufSize=1024){ - this->client=client; - buffer=(char *)HS_MALLOC(bufSize); - setp (buffer, buffer+bufSize-1); - } - - virtual ~StreamBuffer() { - free(buffer); - sync(); - } - - protected: - - int flushBuffer(){ - int num=pptr()-pbase(); - -// if(write(1,buffer,num)!=num) -// return EOF; - - write(1,buffer,num); - client->write(buffer,num); - delay(1); - - pbump(-num); - return num; - } - - virtual int_type overflow(int_type c){ // buffer is full - if(c!=EOF){ - *pptr() = c; - pbump(1); - } - - if(flushBuffer()==EOF) - return EOF; - - return c; - } - - virtual int sync(){ - if(flushBuffer()==EOF) - return -1; - - return 0; - } - -}; - ///////////////////////////////////////////////// // Creates a temporary buffer that is freed after // going out of scope