1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 #include "DBusInputStream.h"
9 DBusInputStream::DBusInputStream(const CommonAPI::DBus::DBusMessage& message) :
11 dataBegin_(message.getBodyData()),
12 currentDataPosition_(0),
13 dataLength_(message.getBodyLength()),
17 DBusInputStream::~DBusInputStream() {
20 const CommonAPI::DBus::DBusError& DBusInputStream::getError() const {
24 bool DBusInputStream::isErrorSet() const {
25 return exception_ != nullptr;
28 void DBusInputStream::clearError() {
32 void DBusInputStream::alignToBoundary(const size_t alignBoundary) {
33 const unsigned int alignMask = alignBoundary - 1;
34 currentDataPosition_ = (currentDataPosition_ + alignMask) & (~alignMask);
37 char* DBusInputStream::readRawData(const size_t numBytesToRead) {
38 assert((currentDataPosition_ + numBytesToRead) <= dataLength_);
40 char* dataPtr = (char*) (dataBegin_ + currentDataPosition_);
41 currentDataPosition_ += numBytesToRead;
46 DBusInputStream& DBusInputStream::readBasicTypeValue<float>(float& val) {
48 alignToBoundary(sizeof(double));
50 val = (float)(*(reinterpret_cast<double*>(readRawData(sizeof(double)))));
54 InputStream& DBusInputStream::readValue(bool& boolValue) {
56 return readBasicTypeValue(boolValue);
59 InputStream& DBusInputStream::readValue(int8_t& int8Value) { return readBasicTypeValue(int8Value); }
60 InputStream& DBusInputStream::readValue(int16_t& int16Value) { return readBasicTypeValue(int16Value); }
61 InputStream& DBusInputStream::readValue(int32_t& int32Value) { return readBasicTypeValue(int32Value); }
62 InputStream& DBusInputStream::readValue(int64_t& int64Value) { return readBasicTypeValue(int64Value); }
64 InputStream& DBusInputStream::readValue(uint8_t& uint8Value) { return readBasicTypeValue(uint8Value); }
65 InputStream& DBusInputStream::readValue(uint16_t& uint16Value) { return readBasicTypeValue(uint16Value); }
66 InputStream& DBusInputStream::readValue(uint32_t& uint32Value) { return readBasicTypeValue(uint32Value); }
67 InputStream& DBusInputStream::readValue(uint64_t& uint64Value) { return readBasicTypeValue(uint64Value); }
69 InputStream& DBusInputStream::readValue(float& floatValue) { return readBasicTypeValue(floatValue); }
70 InputStream& DBusInputStream::readValue(double& doubleValue) { return readBasicTypeValue(doubleValue); }
72 InputStream& DBusInputStream::readValue(std::string& stringValue) {
73 uint32_t lengthOfString;
74 readValue(lengthOfString);
76 // length field does not include terminating 0-byte, therefore length of data to read is +1
77 char* dataPtr = readRawData(lengthOfString + 1);
79 // The string contained in a DBus-message is required to be 0-terminated, therefore the following line works
80 stringValue = dataPtr;
85 InputStream& DBusInputStream::readValue(ByteBuffer& byteBufferValue) {
86 *this >> byteBufferValue;
90 InputStream& DBusInputStream::readEnumValue(int8_t& int8BackingTypeValue) { return readValue(int8BackingTypeValue); }
91 InputStream& DBusInputStream::readEnumValue(int16_t& int16BackingTypeValue) { return readValue(int16BackingTypeValue); }
92 InputStream& DBusInputStream::readEnumValue(int32_t& int32BackingTypeValue) { return readValue(int32BackingTypeValue); }
93 InputStream& DBusInputStream::readEnumValue(int64_t& int64BackingTypeValue) { return readValue(int64BackingTypeValue); }
94 InputStream& DBusInputStream::readEnumValue(uint8_t& uint8BackingTypeValue) { return readValue(uint8BackingTypeValue); }
95 InputStream& DBusInputStream::readEnumValue(uint16_t& uint16BackingTypeValue) { return readValue(uint16BackingTypeValue); }
96 InputStream& DBusInputStream::readEnumValue(uint32_t& uint32BackingTypeValue) { return readValue(uint32BackingTypeValue); }
97 InputStream& DBusInputStream::readEnumValue(uint64_t& uint64BackingTypeValue) { return readValue(uint64BackingTypeValue); }
99 InputStream& DBusInputStream::readVersionValue(Version& versionValue) {
101 readValue(versionValue.Major);
102 readValue(versionValue.Minor);
106 void DBusInputStream::beginReadSerializableStruct(const SerializableStruct& serializableStruct) {
110 void DBusInputStream::endReadSerializableStruct(const SerializableStruct& serializableStruct) { }
113 void DBusInputStream::beginReadBoolVector() {
114 beginReadGenericVector();
115 savedStreamPositions_.push(currentDataPosition_);
118 void DBusInputStream::beginReadInt8Vector() {
119 beginReadGenericVector();
120 savedStreamPositions_.push(currentDataPosition_);
123 void DBusInputStream::beginReadInt16Vector() {
124 beginReadGenericVector();
125 savedStreamPositions_.push(currentDataPosition_);
128 void DBusInputStream::beginReadInt32Vector() {
129 beginReadGenericVector();
130 savedStreamPositions_.push(currentDataPosition_);
133 void DBusInputStream::beginReadInt64Vector() {
134 beginReadGenericVector();
136 savedStreamPositions_.push(currentDataPosition_);
139 void DBusInputStream::beginReadUInt8Vector() {
140 beginReadGenericVector();
141 savedStreamPositions_.push(currentDataPosition_);
144 void DBusInputStream::beginReadUInt16Vector() {
145 beginReadGenericVector();
146 savedStreamPositions_.push(currentDataPosition_);
149 void DBusInputStream::beginReadUInt32Vector() {
150 beginReadGenericVector();
151 savedStreamPositions_.push(currentDataPosition_);
154 void DBusInputStream::beginReadUInt64Vector() {
155 beginReadGenericVector();
157 savedStreamPositions_.push(currentDataPosition_);
160 void DBusInputStream::beginReadFloatVector() {
161 beginReadGenericVector();
163 savedStreamPositions_.push(currentDataPosition_);
166 void DBusInputStream::beginReadDoubleVector() {
167 beginReadGenericVector();
169 savedStreamPositions_.push(currentDataPosition_);
172 void DBusInputStream::beginReadStringVector() {
173 beginReadGenericVector();
174 savedStreamPositions_.push(currentDataPosition_);
177 void DBusInputStream::beginReadByteBufferVector() {
178 beginReadGenericVector();
179 savedStreamPositions_.push(currentDataPosition_);
182 void DBusInputStream::beginReadVersionVector() {
183 beginReadGenericVector();
185 savedStreamPositions_.push(currentDataPosition_);
188 void DBusInputStream::beginReadVectorOfSerializableStructs() {
189 beginReadGenericVector();
191 savedStreamPositions_.push(currentDataPosition_);
194 void DBusInputStream::beginReadVectorOfVectors() {
195 beginReadGenericVector();
196 savedStreamPositions_.push(currentDataPosition_);
199 void DBusInputStream::beginReadVectorOfMaps() {
200 beginReadGenericVector();
202 savedStreamPositions_.push(currentDataPosition_);
205 bool DBusInputStream::hasMoreVectorElements() {
206 return bytesToRead_.top() > currentDataPosition_ - savedStreamPositions_.top();
209 void DBusInputStream::endReadVector() {
211 savedStreamPositions_.pop();
214 void DBusInputStream::beginReadMap() {
215 uint32_t vectorByteSize;
216 readBasicTypeValue(vectorByteSize);
217 bytesToRead_.push(vectorByteSize);
219 savedStreamPositions_.push(currentDataPosition_);
222 bool DBusInputStream::hasMoreMapElements() {
223 return bytesToRead_.top() > currentDataPosition_ - savedStreamPositions_.top();
226 void DBusInputStream::endReadMap() {
228 savedStreamPositions_.pop();
233 } // namespace CommonAPI