27 #ifndef SDBUS_CXX_MESSAGE_H_ 28 #define SDBUS_CXX_MESSAGE_H_ 46 template <
typename... _ValueTypes>
class Struct;
78 Message& operator<<(int16_t item);
79 Message& operator<<(int32_t item);
80 Message& operator<<(int64_t item);
81 Message& operator<<(uint8_t item);
82 Message& operator<<(uint16_t item);
83 Message& operator<<(uint32_t item);
84 Message& operator<<(uint64_t item);
85 Message& operator<<(
double item);
86 Message& operator<<(
const char *item);
87 Message& operator<<(
const std::string &item);
93 Message& operator>>(
bool& item);
94 Message& operator>>(int16_t& item);
95 Message& operator>>(int32_t& item);
96 Message& operator>>(int64_t& item);
97 Message& operator>>(uint8_t& item);
98 Message& operator>>(uint16_t& item);
99 Message& operator>>(uint32_t& item);
100 Message& operator>>(uint64_t& item);
101 Message& operator>>(
double& item);
102 Message& operator>>(
char*& item);
103 Message& operator>>(std::string &item);
109 Message& openContainer(
const std::string& signature);
111 Message& openDictEntry(
const std::string& signature);
113 Message& openVariant(
const std::string& signature);
115 Message& openStruct(
const std::string& signature);
118 Message& enterContainer(
const std::string& signature);
120 Message& enterDictEntry(
const std::string& signature);
122 Message& enterVariant(
const std::string& signature);
124 Message& enterStruct(
const std::string& signature);
127 explicit operator bool()
const;
130 std::string getInterfaceName()
const;
131 std::string getMemberName()
const;
132 std::string getSender()
const;
133 void peekType(std::string& type, std::string& contents)
const;
134 bool isValid()
const;
135 bool isEmpty()
const;
137 void copyTo(
Message& destination,
bool complete)
const;
139 void rewind(
bool complete);
145 explicit Message(internal::ISdBus* sdbus) noexcept;
146 Message(
void *msg, internal::ISdBus* sdbus) noexcept;
160 internal::ISdBus* sdbus_{};
161 mutable bool ok_{
true};
169 using Message::Message;
173 using Slot = std::unique_ptr<void, std::function<void(
void*)>>;
179 [[nodiscard]] Slot send(
void* callback,
void* userData, uint64_t timeout)
const;
184 void dontExpectReply();
185 bool doesntExpectReply()
const;
188 MethodReply sendWithReply(uint64_t timeout = 0)
const;
194 using Message::Message;
204 using Message::Message;
214 using Message::Message;
223 using Message::Message;
232 using Message::Message;
239 template <
typename _Element>
240 inline Message& operator<<(
Message& msg,
const std::vector<_Element>& items)
244 for (
const auto& item : items)
247 msg.closeContainer();
252 template <
typename _Key,
typename _Value>
253 inline Message& operator<<(Message& msg,
const std::map<_Key, _Value>& items)
255 const std::string dictEntrySignature = signature_of<_Key>::str() + signature_of<_Value>::str();
256 const std::string arraySignature =
"{" + dictEntrySignature +
"}";
258 msg.openContainer(arraySignature);
260 for (
const auto& item : items)
262 msg.openDictEntry(dictEntrySignature);
265 msg.closeDictEntry();
268 msg.closeContainer();
275 template <
typename... _Args>
276 void serialize_pack(Message& msg, _Args&&... args)
278 (void)(msg << ... << args);
281 template <
class _Tuple, std::size_t... _Is>
282 void serialize_tuple( Message& msg
284 , std::index_sequence<_Is...>)
286 serialize_pack(msg, std::get<_Is>(t)...);
290 template <
typename... _ValueTypes>
291 inline Message& operator<<(Message& msg,
const Struct<_ValueTypes...>& item)
293 auto structSignature = signature_of<Struct<_ValueTypes...>>::str();
294 assert(structSignature.size() > 2);
296 auto structContentSignature = structSignature.substr(1, structSignature.size()-2);
298 msg.openStruct(structContentSignature);
299 detail::serialize_tuple(msg, item, std::index_sequence_for<_ValueTypes...>{});
305 template <
typename... _ValueTypes>
306 inline Message& operator<<(Message& msg,
const std::tuple<_ValueTypes...>& item)
308 detail::serialize_tuple(msg, item, std::index_sequence_for<_ValueTypes...>{});
313 template <
typename _Element>
314 inline Message& operator>>(Message& msg, std::vector<_Element>& items)
316 if(!msg.enterContainer(signature_of<_Element>::str()))
323 items.emplace_back(std::move(elem));
335 template <
typename _Key,
typename _Value>
336 inline Message& operator>>(Message& msg, std::map<_Key, _Value>& items)
338 const std::string dictEntrySignature = signature_of<_Key>::str() + signature_of<_Value>::str();
339 const std::string arraySignature =
"{" + dictEntrySignature +
"}";
341 if (!msg.enterContainer(arraySignature))
346 if (!msg.enterDictEntry(dictEntrySignature))
353 items.emplace(std::move(key), std::move(value));
367 template <
typename... _Args>
368 void deserialize_pack(Message& msg, _Args&... args)
370 (void)(msg >> ... >> args);
373 template <
class _Tuple, std::size_t... _Is>
374 void deserialize_tuple( Message& msg
376 , std::index_sequence<_Is...> )
378 deserialize_pack(msg, std::get<_Is>(t)...);
382 template <
typename... _ValueTypes>
383 inline Message& operator>>(Message& msg, Struct<_ValueTypes...>& item)
385 auto structSignature = signature_of<Struct<_ValueTypes...>>::str();
387 auto structContentSignature = structSignature.substr(1, structSignature.size()-2);
389 if (!msg.enterStruct(structContentSignature))
392 detail::deserialize_tuple(msg, item, std::index_sequence_for<_ValueTypes...>{});
399 template <
typename... _ValueTypes>
400 inline Message& operator>>(Message& msg, std::tuple<_ValueTypes...>& item)
402 detail::deserialize_tuple(msg, item, std::index_sequence_for<_ValueTypes...>{});
Definition: Message.h:192
Definition: TypeTraits.h:63
Definition: Message.h:164
Definition: Message.h:202
Definition: Message.h:221
Definition: Message.h:212
Definition: Message.h:230
Definition: Message.h:167