#include #include #include template SerialBufferAdapter::SerialBufferAdapter(const uint8_t* buffer, T bufferLength, bool serializeLength) : currentBufferType(bufferType::CONST), serializeLength(serializeLength), constBuffer(buffer), buffer(NULL), bufferLength(bufferLength) { } template SerialBufferAdapter::SerialBufferAdapter(uint8_t* buffer, T bufferLength, bool serializeLength) : currentBufferType(bufferType::NORMAL),serializeLength(serializeLength), constBuffer(NULL), buffer(buffer), bufferLength(bufferLength) { } template SerialBufferAdapter::SerialBufferAdapter(uint32_t* buffer, T bufferLength, bool serializeLength) : currentBufferType(bufferType::NORMAL),serializeLength(serializeLength), constBuffer(NULL), buffer(reinterpret_cast(buffer)), bufferLength(bufferLength*4) { } template SerialBufferAdapter::~SerialBufferAdapter() { } template ReturnValue_t SerialBufferAdapter::serialize(uint8_t** buffer, uint32_t* size, const uint32_t max_size, bool bigEndian) const { uint32_t serializedLength = bufferLength; if (serializeLength) { serializedLength += AutoSerializeAdapter::getSerializedSize( &bufferLength); } if (*size + serializedLength > max_size) { return BUFFER_TOO_SHORT; } else { if (serializeLength) { AutoSerializeAdapter::serialize(&bufferLength, buffer, size, max_size, bigEndian); } if (this->constBuffer != NULL) { memcpy(*buffer, this->constBuffer, bufferLength); } else if (this->buffer != NULL) { memcpy(*buffer, this->buffer, bufferLength); } else { return HasReturnvaluesIF::RETURN_FAILED; } *size += bufferLength; (*buffer) += bufferLength; return HasReturnvaluesIF::RETURN_OK; } } template uint32_t SerialBufferAdapter::getSerializedSize() const { if (serializeLength) { return bufferLength + AutoSerializeAdapter::getSerializedSize(&bufferLength); } else { return bufferLength; } } template ReturnValue_t SerialBufferAdapter::deSerialize(const uint8_t** buffer, int32_t* size, bool bigEndian) { //TODO Ignores Endian flag! if (buffer != NULL) { if(serializeLength){ T serializedSize = AutoSerializeAdapter::getSerializedSize( &bufferLength); if((*size - bufferLength - serializedSize) >= 0){ *buffer += serializedSize; *size -= serializedSize; }else{ return STREAM_TOO_SHORT; } } //No Else If, go on with buffer if (*size - bufferLength >= 0) { *size -= bufferLength; memcpy(this->buffer, *buffer, bufferLength); (*buffer) += bufferLength; return HasReturnvaluesIF::RETURN_OK; } else { return STREAM_TOO_SHORT; } } else { return HasReturnvaluesIF::RETURN_FAILED; } } template uint8_t * SerialBufferAdapter::getBuffer() { if(currentBufferType != NORMAL) { warning << "Wrong access function for stored type ! Use getConstBuffer()" << std::endl; return 0; } return buffer; } template const uint8_t * SerialBufferAdapter::getConstBuffer() { if(currentBufferType != CONST) { warning << "Wrong access function for stored type ! Use getBuffer()" << std::endl; return 0; } return constBuffer; } template void SerialBufferAdapter::setBuffer(uint8_t * buffer_) { buffer = buffer_; } //forward Template declaration for linker template class SerialBufferAdapter; template class SerialBufferAdapter; template class SerialBufferAdapter;