diff options
Diffstat (limited to 'src/CommonAPI/DBus/DBusOutputStream.cpp')
-rw-r--r-- | src/CommonAPI/DBus/DBusOutputStream.cpp | 374 |
1 files changed, 52 insertions, 322 deletions
diff --git a/src/CommonAPI/DBus/DBusOutputStream.cpp b/src/CommonAPI/DBus/DBusOutputStream.cpp index 4dfc9fa..7d59360 100644 --- a/src/CommonAPI/DBus/DBusOutputStream.cpp +++ b/src/CommonAPI/DBus/DBusOutputStream.cpp @@ -1,297 +1,53 @@ -/* Copyright (C) 2013 BMW Group - * Author: Manfred Bathelt (manfred.bathelt@bmw.de) - * Author: Juergen Gehring (juergen.gehring@bmw.de) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "DBusOutputStream.h" +// Copyright (C) 2013-2015 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. -namespace CommonAPI { -namespace DBus { +//#define COMMONAPI_DBUS_DEBUG_SERIALIZATION -DBusOutputStream::DBusOutputStream(DBusMessage dbusMessage) : - dbusMessage_(dbusMessage) { -} +#ifdef COMMONAPI_DBUS_DEBUG_SERIALIZATION +#include <iomanip> +#include <sstream> +#endif -DBusOutputStream::~DBusOutputStream() {} +#include <CommonAPI/DBus/DBusOutputStream.hpp> -OutputStream& DBusOutputStream::writeValue(const bool& boolValue) { - alignToBoundary(4); - writeBasicTypeValue(boolValue); - alignToBoundary(4); - return *this; -} - -OutputStream& DBusOutputStream::writeValue(const int8_t& int8Value) { - return writeBasicTypeValue(int8Value); -} -OutputStream& DBusOutputStream::writeValue(const int16_t& int16Value) { - return writeBasicTypeValue(int16Value); -} -OutputStream& DBusOutputStream::writeValue(const int32_t& int32Value) { - return writeBasicTypeValue(int32Value); -} -OutputStream& DBusOutputStream::writeValue(const int64_t& int64Value) { - return writeBasicTypeValue(int64Value); -} - -OutputStream& DBusOutputStream::writeValue(const uint8_t& uint8Value) { - return writeBasicTypeValue(uint8Value); -} -OutputStream& DBusOutputStream::writeValue(const uint16_t& uint16Value) { - return writeBasicTypeValue(uint16Value); -} -OutputStream& DBusOutputStream::writeValue(const uint32_t& uint32Value) { - return writeBasicTypeValue(uint32Value); -} -OutputStream& DBusOutputStream::writeValue(const uint64_t& uint64Value) { - return writeBasicTypeValue(uint64Value); -} - -OutputStream& DBusOutputStream::writeValue(const float& floatValue) { - return writeBasicTypeValue((double) floatValue); -} -OutputStream& DBusOutputStream::writeValue(const double& doubleValue) { - return writeBasicTypeValue(doubleValue); -} - -OutputStream& DBusOutputStream::writeValue(const std::string& stringValue) { - return writeString(stringValue.c_str(), stringValue.length()); -} - -OutputStream& DBusOutputStream::writeValue(const ByteBuffer& byteBufferValue) { - return *this; -} - -OutputStream& DBusOutputStream::writeEnumValue(const int8_t& int8BackingTypeValue) { - return writeValue(int8BackingTypeValue); -} -OutputStream& DBusOutputStream::writeEnumValue(const int16_t& int16BackingTypeValue) { - return writeValue(int16BackingTypeValue); -} -OutputStream& DBusOutputStream::writeEnumValue(const int32_t& int32BackingTypeValue) { - return writeValue(int32BackingTypeValue); -} -OutputStream& DBusOutputStream::writeEnumValue(const int64_t& int64BackingTypeValue) { - return writeValue(int64BackingTypeValue); -} -OutputStream& DBusOutputStream::writeEnumValue(const uint8_t& uint8BackingTypeValue) { - return writeValue(uint8BackingTypeValue); -} -OutputStream& DBusOutputStream::writeEnumValue(const uint16_t& uint16BackingTypeValue) { - return writeValue(uint16BackingTypeValue); -} -OutputStream& DBusOutputStream::writeEnumValue(const uint32_t& uint32BackingTypeValue) { - return writeValue(uint32BackingTypeValue); -} -OutputStream& DBusOutputStream::writeEnumValue(const uint64_t& uint64BackingTypeValue) { - return writeValue(uint64BackingTypeValue); -} - -void DBusOutputStream::beginWriteBoolVector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteInt8Vector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteInt16Vector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteInt32Vector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteInt64Vector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - alignToBoundary(8); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteUInt8Vector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteUInt16Vector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteUInt32Vector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteUInt64Vector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - alignToBoundary(8); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteFloatVector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - alignToBoundary(8); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteDoubleVector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - alignToBoundary(8); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteStringVector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteByteBufferVector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteVersionVector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - alignToBoundary(8); - rememberCurrentStreamPosition(); -} - -void DBusOutputStream::beginWriteInt8EnumVector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteInt16EnumVector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteInt32EnumVector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteInt64EnumVector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - alignToBoundary(8); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteUInt8EnumVector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteUInt16EnumVector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteUInt32EnumVector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteUInt64EnumVector(uint32_t sizeOfVector) { - beginWriteGenericVector(); - alignToBoundary(8); - rememberCurrentStreamPosition(); -} - -void DBusOutputStream::beginWriteVectorOfSerializableStructs(uint32_t sizeOfVector) { - beginWriteGenericVector(); - alignToBoundary(8); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteVectorOfSerializableVariants(uint32_t sizeOfVector) { - beginWriteGenericVector(); - alignToBoundary(8); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteVectorOfVectors(uint32_t sizeOfVector) { - beginWriteGenericVector(); - rememberCurrentStreamPosition(); -} -void DBusOutputStream::beginWriteVectorOfMaps(uint32_t sizeOfVector) { - beginWriteGenericVector(); - alignToBoundary(4); - rememberCurrentStreamPosition(); -} - -void DBusOutputStream::beginWriteVectorOfSerializablePolymorphicStructs(uint32_t sizeOfVector) { - beginWriteGenericVector(); - alignToBoundary(8); - rememberCurrentStreamPosition(); -} - -void DBusOutputStream::endWriteVector() { - uint32_t numOfWrittenBytes = getCurrentStreamPosition() - popRememberedStreamPosition(); - writeBasicTypeValueAtPosition(popRememberedStreamPosition(), numOfWrittenBytes); -} - -OutputStream& DBusOutputStream::writeVersionValue(const Version& versionValue) { - alignToBoundary(8); - writeValue(versionValue.Major); - writeValue(versionValue.Minor); - return *this; -} - -void DBusOutputStream::beginWriteSerializableStruct(const SerializableStruct& serializableStruct) { - alignToBoundary(8); -} -void DBusOutputStream::endWriteSerializableStruct(const SerializableStruct& serializableStruct) { -} - -void DBusOutputStream::beginWriteSerializablePolymorphicStruct(const std::shared_ptr<SerializablePolymorphicStruct>& serializableStruct) { - alignToBoundary(8); - writeValue(serializableStruct->getSerialId()); - - DBusTypeOutputStream typeOutputStream; - typeOutputStream.beginWriteStructType(); - serializableStruct->createTypeSignature(typeOutputStream); - typeOutputStream.endWriteStructType(); - - writeSignature(std::move(typeOutputStream.retrieveSignature())); - - beginWriteSerializableStruct(*serializableStruct); -} - -void DBusOutputStream::endWriteSerializablePolymorphicStruct(const std::shared_ptr<SerializablePolymorphicStruct>& serializableStruct) { - endWriteSerializableStruct(*serializableStruct); -} - -void DBusOutputStream::beginWriteMap(size_t elementCount) { - alignToBoundary(sizeof(uint32_t)); - rememberCurrentStreamPosition(); - writeBasicTypeValue((uint32_t) 0); - alignToBoundary(8); - rememberCurrentStreamPosition(); -} +namespace CommonAPI { +namespace DBus { -void DBusOutputStream::endWriteMap() { - uint32_t numOfWrittenBytes = getCurrentStreamPosition() - popRememberedStreamPosition(); - writeBasicTypeValueAtPosition(popRememberedStreamPosition(), numOfWrittenBytes); +DBusOutputStream::DBusOutputStream(DBusMessage dbusMessage) + : dbusMessage_(dbusMessage) { } -void DBusOutputStream::beginWriteMapElement() { - alignToBoundary(8); +// Internal +size_t DBusOutputStream::getPosition() { + return payload_.size(); } -void DBusOutputStream::endWriteMapElement() { -} - -void DBusOutputStream::beginWriteSerializableVariant(const SerializableVariant& serializableVariant) { - alignToBoundary(8); - writeValue(serializableVariant.getValueType()); - DBusTypeOutputStream typeOutputStream; - serializableVariant.writeToTypeOutputStream(typeOutputStream); - writeSignature(std::move(typeOutputStream.retrieveSignature())); +void DBusOutputStream::pushPosition() { + positions_.push(payload_.size()); } -void DBusOutputStream::endWriteSerializableVariant(const SerializableVariant& serializableVariant) { +size_t DBusOutputStream::popPosition() { + size_t itsPosition = positions_.top(); + positions_.pop(); + return itsPosition; } +// TODO Check where dbusError_ is set bool DBusOutputStream::hasError() const { return dbusError_; } -/** - * Writes the data that was buffered within this #DBusOutputMessageStream to the #DBusMessage that was given to the constructor. Each call to flush() - * will completely override the data that currently is contained in the #DBusMessage. The data that is buffered in this #DBusOutputMessageStream is - * not deleted by calling flush(). - */ +// Writes the data that was buffered within this #DBusOutputMessageStream to +// the #DBusMessage that was given to the constructor. Each call to flush() +// will completely override the data that currently is contained in the +// #DBusMessage. The data that is buffered in this #DBusOutputMessageStream +// is not deleted by calling flush(). void DBusOutputStream::flush() { const int toWrite = payload_.size(); dbusMessage_.setBodyLength(toWrite); char* destinationDataPtr = dbusMessage_.getBodyData(); - memcpy(destinationDataPtr, payload_.c_str(), toWrite); } @@ -299,8 +55,10 @@ void DBusOutputStream::setError() { } /** - * Reserves the given number of bytes for writing, thereby negating the need to dynamically allocate memory while writing. - * Use this method for optimization: If possible, reserve as many bytes as you need for your data before doing any writing. + * Reserves the given number of bytes for writing, thereby negating the need to + * dynamically allocate memory while writing. Use this method for optimization: + * If possible, reserve as many bytes as you need for your data before doing + * any writing. * * @param numOfBytes The number of bytes that should be reserved for writing. */ @@ -309,49 +67,35 @@ void DBusOutputStream::reserveMemory(size_t numOfBytes) { payload_.reserve(numOfBytes); } -DBusOutputStream& DBusOutputStream::writeString(const char* cString, const uint32_t& length) { - assert(cString != NULL); - assert(cString[length] == '\0'); - - *this << length; +DBusOutputStream& DBusOutputStream::writeString(const char *_value, const uint32_t &_length) { + assert(_value != NULL); + assert(_value[_length] == '\0'); - writeRawData(cString, length + 1); + _writeValue(_length); + _writeRaw(_value, _length + 1); - return *this; + return (*this); } -//Additional 0-termination, so this is 8 byte of \0 +// Additional 0-termination, so this is 8 byte of \0 static const char eightByteZeroString[] = "\0\0\0\0\0\0\0"; -void DBusOutputStream::alignToBoundary(const size_t alignBoundary) { - assert(alignBoundary > 0 && alignBoundary <= 8 && (alignBoundary % 2 == 0 || alignBoundary == 1)); +void DBusOutputStream::align(const size_t _boundary) { + assert(_boundary > 0 && _boundary <= 8 && + (_boundary % 2 == 0 || _boundary == 1)); - size_t alignMask = alignBoundary - 1; - size_t necessaryAlignment = ((alignMask - (payload_.size() & alignMask)) + 1) & alignMask; + size_t mask = _boundary - 1; + size_t necessary = ((mask - (payload_.size() & mask)) + 1) & mask; - writeRawData(eightByteZeroString, necessaryAlignment); + _writeRaw(eightByteZeroString, necessary); } -bool DBusOutputStream::writeRawData(const char* rawDataPtr, const size_t sizeInByte) { - assert(sizeInByte >= 0); - - payload_.append(rawDataPtr, sizeInByte); - - return true; -} - -bool DBusOutputStream::writeRawDataAtPosition(size_t position, const char* rawDataPtr, const size_t sizeInByte) { - assert(sizeInByte >= 0); - - payload_ = payload_.replace(position, sizeInByte, rawDataPtr, sizeInByte); - - return true; +void DBusOutputStream::_writeRaw(const char *_data, const size_t _size) { + payload_.append(_data, _size); } -void DBusOutputStream::beginWriteGenericVector() { - alignToBoundary(sizeof(uint32_t)); - rememberCurrentStreamPosition(); - writeBasicTypeValue((uint32_t) 0); +void DBusOutputStream::_writeRawAt(const char *_data, const size_t _size, size_t _position) { + payload_ = payload_.replace(_position, _size, _data, _size); } void DBusOutputStream::writeSignature(const std::string& signature) { @@ -359,22 +103,8 @@ void DBusOutputStream::writeSignature(const std::string& signature) { assert(signatureLength > 0 && signatureLength < 256); const uint8_t wireLength = (uint8_t) signatureLength; - *this << wireLength; - writeRawData(signature.c_str(), wireLength + 1); -} - -void DBusOutputStream::rememberCurrentStreamPosition() { - savedStreamPositions_.push(payload_.size()); -} - -size_t DBusOutputStream::popRememberedStreamPosition() { - size_t val = savedStreamPositions_.top(); - savedStreamPositions_.pop(); - return val; -} - -size_t DBusOutputStream::getCurrentStreamPosition() { - return payload_.size(); + (*this) << wireLength; + _writeRaw(signature.c_str(), wireLength + 1); } } // namespace DBus |