A client for the SmartREST protocol from Cumulocity.
Fork of MbedSmartRest by
Revision 2:1038411466a6, committed 2014-01-24
- Comitter:
- vwochnik
- Date:
- Fri Jan 24 11:39:32 2014 +0000
- Parent:
- 1:ea43d8ee05fd
- Child:
- 3:ce2f116369bd
- Commit message:
- added abstraction
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HTTPBuffer.cpp Fri Jan 24 11:39:32 2014 +0000 @@ -0,0 +1,77 @@ +#include "HTTPBuffer.h" +#include <stdlib.h> + +HTTPBuffer::HTTPBuffer() +{ + _rptr = _wptr = _buf = NULL; + bufferSize(HTTPBUFFER_INITIAL_SIZE); +} + +HTTPBuffer::~HTTPBuffer() +{ + if (_buf != NULL) + free(_buf); +} + +char HTTPBuffer::read() +{ + if (_rptr == _wptr) + return 0; + return *_rptr++; +} + +uint8_t HTTPBuffer::status() +{ + if (_rptr == _wptr) + return DS_STATUS_CLOSED; + return DS_STATUS_OK; +} + +void HTTPBuffer::writeReset() +{ + _rptr = _wptr = _buf; + bufferSize(HTTPBUFFER_INITIAL_SIZE); +} + +int HTTPBuffer::write(const char* buf, size_t len) +{ + if (_wptr - _buf + len > _len) { + size_t newLen = _len; + while (_wptr - _buf + len > newLen) + newLen += HTTPBUFFER_INCREMENT; + bufferSize(newLen); + } + memcpy(_wbuf, buf, len); + _wbuf += len; +} + +void HTTPBuffer::setDataType(const char* type) +{ +} + +void HTTPBuffer::setIsChunked(bool chunked) +{ +} + +void HTTPBuffer::setDataLen(size_t len) +{ + bufferSize(len); +} + + +void HTTPBuffer::bufferSize(size_t length) +{ + if (_len == length) + return; + + char *buf = (char*)realloc(_buf, length); + if (buf == NULL) + return; + + // set pointers + _wptr = buf + (_wptr - _buf); + _rptr = buf + (_rptr - _buf); + _buf = buf; + + _len = len; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HTTPBuffer.h Fri Jan 24 11:39:32 2014 +0000 @@ -0,0 +1,33 @@ +#ifndef HTTPBUFFER_H +#define HTTPBUFFER_H + +#include <stddef.h> +#include "IHTTPData.h" +#include "AbstractDataSource.h" + +#define HTTPBUFFER_INITIAL_SIZE 128 +#define HTTPBUFFER_INCREMENT 64 + +class HTTPBuffer : public HTTPDataIn, public AbstractDataSource { +public: + HTTPBuffer(); + ~HTTPBuffer(); + + char read(); + uint8_t status(); + +protected: + void writeReset(); + int write(const char* buf, size_t len); + void setDataType(const char* type); + void setIsChunked(bool chunked); + void setDataLen(size_t len); + void bufferSize(size_t length); + +private: + // buffer, write and read pointers + char *_buf, *_wptr, *_rptr; + size_t _len; +}; + +#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HTTPGeneratorWrapper.cpp Fri Jan 24 11:39:32 2014 +0000 @@ -0,0 +1,42 @@ +#include "HTTPGeneratorWrapper.h" +#include <stdlib.h> +#include <string.h> + +HTTPGeneratorWrapper::HTTPGeneratorWrapper(DataGenerator& generator) : _sink(generator.writtenLength()) +{ + generator.writeTo(_sink); + _len = _sink.length(); + _pos = 0; +} + +void HTTPGeneratorWrapper::readReset() +{ + _pos = 0; +} + +int HTTPGeneratorWrapper::read(char* buf, size_t len, size_t* pReadLen) +{ + *pReadLen = len; + if (len > _len - _pos) + *pReadLen = _len - _pos; + else + *pReadLen = len; + memcpy(buf, _sink.buffer()+_pos, *pReadLen); + _pos += *pReadLen; + return OK; +} + +int HTTPGeneratorWrapper::getDataType(char* type, size_t maxTypeLen) +{ + return 1; +} + +bool HTTPGeneratorWrapper::getIsChunked() +{ + return false; +} + +size_t HTTPGeneratorWrapper::getDataLen() +{ + return _len; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HTTPGeneratorWrapper.h Fri Jan 24 11:39:32 2014 +0000 @@ -0,0 +1,25 @@ +#ifndef HTTPGENERATORWRAPPER_H +#define HTTPGENERATORWRAPPER_H + +#include "DataGenerator.h" +#include "MbedDataSink.h" +#include "IHTTPData.h" + +class HTTPGeneratorWrapper, public HTTPDataOut { +public: + HTTPGeneratorWrapper(DataGenerator& generator); + +protected: + void readReset(); + int read(char* buf, size_t len, size_t* pReadLen); + int getDataType(char* type, size_t maxTypeLen); + bool getIsChunked(); + size_t getDataLen(); + +private: + MbedDataSink _sink; + size_t _len; + size_t _pos; +}; + +#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MbedDataSink.cpp Fri Jan 24 11:39:32 2014 +0000 @@ -0,0 +1,65 @@ +#include "MbedDataSink.h" +#include <stdlib.h> +#include <stdio.h> + +MbedDataSink::MbedDataSink(size_t length) +{ + _len = length; + _ptr = _buf = (char*)malloc(length); +} + +MbedDataSink::~MbedDataSink() +{ + free(_buf); +} + +size_t MbedDataSink::write(char c) +{ + if (_ptr - _buf == _len) + return 0; + *_ptr++ = c; + return 1; +} + +size_t MbedDataSink::write(void *buf, size_t length) +{ + size_t written = 0; + char *b = (char*)buf; + + while ((length-- > 0) && (write(*b++))) + written++; + + return written; +} + +size_t MbedDataSink::write(const char *str) +{ + size_t written = 0; + + for (char c, *p = (char*)str; (c = *p) > 0; ++p) { + if (!write(c)) + break; + written++; + } + return written; +} + +size_t MbedDataSink::write(unsigned long number) +{ + size_t left, len; + + left = _len - (_ptr - _buf); + len = snprintf(_ptr, left, "%ld", number); + _ptr += len; + return len; +} + +const char * MbedDataSink::buffer() +{ + return _buf; +} + +size_t MbedDataSink::length() +{ + return _ptr - _buf; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MbedDataSink.h Fri Jan 24 11:39:32 2014 +0000 @@ -0,0 +1,31 @@ +#ifndef MBEDDATASINK_H +#define MBEDDATASINK_H + +#include <stddef.h> +#include "AbstractDataSink.h" + +class HTTPGeneratorWrapper; + +class MbedDataSink : public AbstractDataSink +{ +public: + MbedDataSink(size_t length); + ~MbedDataSink(); + + size_t write(char c); + size_t write(void *buf, size_t length); + size_t write(const char *str); + size_t write(unsigned long number); + +protected: + const char * buffer(); + size_t length(); + +private: + char *_buf, *_ptr; + size_t _len; + +friend class HTTPGeneratorWrapper; +}; + +#endif \ No newline at end of file