A client for the SmartREST protocol from Cumulocity.

Dependencies:   SmartRest

Fork of MbedSmartRest by Vincent Wochnik

Files at this revision

API Documentation at this revision

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

HTTPBuffer.cpp Show annotated file Show diff for this revision Revisions of this file
HTTPBuffer.h Show annotated file Show diff for this revision Revisions of this file
HTTPGeneratorWrapper.cpp Show annotated file Show diff for this revision Revisions of this file
HTTPGeneratorWrapper.h Show annotated file Show diff for this revision Revisions of this file
MbedDataSink.cpp Show annotated file Show diff for this revision Revisions of this file
MbedDataSink.h Show annotated file Show diff for this revision Revisions of this file
--- /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