mbed.org implementation of the abstract SmartREST library for the Cumulocity Platform SmartREST protocol.

Dependents:   MbedSmartRestMain MbedSmartRestMain

Revision:
4:059b8b90e0d9
Parent:
0:099f76422485
Child:
5:2b74510900da
--- a/ParsedRecord.cpp	Mon Jul 07 17:12:59 2014 +0200
+++ b/ParsedRecord.cpp	Wed Jul 09 15:37:19 2014 +0200
@@ -33,12 +33,14 @@
 #include <stdlib.h>
 #include <string.h>
 
-ParsedRecord::ParsedRecord()
+ParsedRecord::ParsedRecord(bool copy) :
+    _copy(copy)
 {
     _count = 0;
 #ifdef SMARTREST_PARSED_DYNAMIC_ALLOC
     _values = NULL;
 #endif
+    _buffer = NULL;
 }
 
 ParsedRecord::~ParsedRecord()
@@ -63,11 +65,10 @@
     return *_values[index];
 }
 
-DataGenerator* ParsedRecord::copy() const
+ParsedRecord* ParsedRecord::copy() const
 {
-    ComposedRecord *copy = new ComposedRecord(true);
-    for (size_t n = 0; n < _count; n++)
-        copy->add(*_values[n]);
+    ParsedRecord *copy = new ParsedRecord(true);
+    copy->set(_buffer, _count);
     return copy;
 }
 
@@ -84,32 +85,48 @@
     return ptr;
 }
 
-void ParsedRecord::set(const char *buffer, size_t count)
+bool ParsedRecord::set(const char *buffer, size_t count)
 {
     clear();
-    
+
 #ifdef SMARTREST_PARSED_DYNAMIC_ALLOC
     const Value **values = (const Value**)realloc(_values, count*sizeof(Value*));
     if (values == NULL)
-        return;
+        return false;
     _values = values;
 #else
     if (count > SMARTREST_PARSED_FIXED_SIZE)
         count = SMARTREST_PARSED_FIXED_SIZE;
 #endif
 
-    const char *ptr = buffer;
+    if (_copy) {
+        const char *ptr = buffer;
+        for (size_t n = 0; n < count; n++)
+            ptr += strlen(ptr) + 1;
+        _buffer = (const char*)malloc(ptr-buffer);
+        if (_buffer == NULL)
+            return false;
+        memcpy((char*)_buffer, buffer, ptr-buffer);
+    } else {
+        _buffer = buffer;
+    }
+    _count = count;
+
+    const char *ptr = _buffer;
     for (size_t n = 0; n < count; n++) {
         _values[n] = new ParsedValue(ptr, false);
         ptr += strlen(ptr) + 1;
     }
 
-    _count = count;
-    _buffer = buffer;
+    return true;
 }
 
 void ParsedRecord::clear()
 {
     for (size_t n = 0; n < _count; n++)
         delete _values[n];
+    if ((_copy) && (_buffer != NULL))
+        free((char*)_buffer);
+    _buffer = NULL;
+    _count = 0;
 }