27#ifndef SDBUS_CXX_MESSAGE_H_
28#define SDBUS_CXX_MESSAGE_H_
47 template <
typename... _ValueTypes>
class Struct;
80 Message& operator<<(int16_t item);
81 Message& operator<<(int32_t item);
82 Message& operator<<(int64_t item);
83 Message& operator<<(uint8_t item);
84 Message& operator<<(uint16_t item);
85 Message& operator<<(uint32_t item);
86 Message& operator<<(uint64_t item);
87 Message& operator<<(
double item);
88 Message& operator<<(
const char *item);
89 Message& operator<<(
const std::string &item);
95 Message& operator>>(
bool& item);
96 Message& operator>>(int16_t& item);
97 Message& operator>>(int32_t& item);
98 Message& operator>>(int64_t& item);
99 Message& operator>>(uint8_t& item);
100 Message& operator>>(uint16_t& item);
101 Message& operator>>(uint32_t& item);
102 Message& operator>>(uint64_t& item);
103 Message& operator>>(
double& item);
104 Message& operator>>(
char*& item);
105 Message& operator>>(std::string &item);
111 Message& openContainer(
const std::string& signature);
113 Message& openDictEntry(
const std::string& signature);
115 Message& openVariant(
const std::string& signature);
117 Message& openStruct(
const std::string& signature);
120 Message& enterContainer(
const std::string& signature);
122 Message& enterDictEntry(
const std::string& signature);
124 Message& enterVariant(
const std::string& signature);
126 Message& enterStruct(
const std::string& signature);
129 explicit operator bool()
const;
132 std::string getInterfaceName()
const;
133 std::string getMemberName()
const;
134 std::string getSender()
const;
135 std::string getPath()
const;
136 std::string getDestination()
const;
137 void peekType(std::string& type, std::string& contents)
const;
138 bool isValid()
const;
139 bool isEmpty()
const;
141 void copyTo(
Message& destination,
bool complete)
const;
143 void rewind(
bool complete);
145 pid_t getCredsPid()
const;
146 uid_t getCredsUid()
const;
147 uid_t getCredsEuid()
const;
148 gid_t getCredsGid()
const;
149 gid_t getCredsEgid()
const;
150 std::vector<gid_t> getCredsSupplementaryGids()
const;
151 std::string getSELinuxContext()
const;
157 explicit Message(internal::ISdBus* sdbus)
noexcept;
158 Message(
void *msg, internal::ISdBus* sdbus)
noexcept;
172 internal::ISdBus* sdbus_{};
173 mutable bool ok_{
true};
181 using Message::Message;
185 using Slot = std::unique_ptr<void, std::function<void(
void*)>>;
191 [[nodiscard]] Slot send(
void* callback,
void* userData, uint64_t timeout)
const;
196 void dontExpectReply();
197 bool doesntExpectReply()
const;
203 MethodReply sendWithReply(uint64_t timeout = 0)
const;
205 const internal::IConnection* connection_{};
210 using Message::Message;
220 using Message::Message;
225 void setDestination(
const std::string& destination);
231 using Message::Message;
240 using Message::Message;
249 using Message::Message;
256 template <
typename _Element>
257 inline Message& operator<<(
Message& msg,
const std::vector<_Element>& items)
261 for (
const auto& item : items)
264 msg.closeContainer();
269 template <
typename _Key,
typename _Value>
270 inline Message& operator<<(Message& msg,
const std::map<_Key, _Value>& items)
272 const std::string dictEntrySignature = signature_of<_Key>::str() + signature_of<_Value>::str();
273 const std::string arraySignature =
"{" + dictEntrySignature +
"}";
275 msg.openContainer(arraySignature);
277 for (
const auto& item : items)
279 msg.openDictEntry(dictEntrySignature);
282 msg.closeDictEntry();
285 msg.closeContainer();
292 template <
typename... _Args>
293 void serialize_pack(Message& msg, _Args&&... args)
295 (void)(msg << ... << args);
298 template <
class _Tuple, std::size_t... _Is>
299 void serialize_tuple( Message& msg
301 , std::index_sequence<_Is...>)
303 serialize_pack(msg, std::get<_Is>(t)...);
307 template <
typename... _ValueTypes>
308 inline Message& operator<<(Message& msg,
const Struct<_ValueTypes...>& item)
310 auto structSignature = signature_of<Struct<_ValueTypes...>>::str();
311 assert(structSignature.size() > 2);
313 auto structContentSignature = structSignature.substr(1, structSignature.size()-2);
315 msg.openStruct(structContentSignature);
316 detail::serialize_tuple(msg, item, std::index_sequence_for<_ValueTypes...>{});
322 template <
typename... _ValueTypes>
323 inline Message& operator<<(Message& msg,
const std::tuple<_ValueTypes...>& item)
325 detail::serialize_tuple(msg, item, std::index_sequence_for<_ValueTypes...>{});
330 template <
typename _Element>
331 inline Message& operator>>(Message& msg, std::vector<_Element>& items)
333 if(!msg.enterContainer(signature_of<_Element>::str()))
340 items.emplace_back(std::move(elem));
352 template <
typename _Key,
typename _Value>
353 inline Message& operator>>(Message& msg, std::map<_Key, _Value>& items)
355 const std::string dictEntrySignature = signature_of<_Key>::str() + signature_of<_Value>::str();
356 const std::string arraySignature =
"{" + dictEntrySignature +
"}";
358 if (!msg.enterContainer(arraySignature))
363 if (!msg.enterDictEntry(dictEntrySignature))
370 items.emplace(std::move(key), std::move(value));
384 template <
typename... _Args>
385 void deserialize_pack(Message& msg, _Args&... args)
387 (void)(msg >> ... >> args);
390 template <
class _Tuple, std::size_t... _Is>
391 void deserialize_tuple( Message& msg
393 , std::index_sequence<_Is...> )
395 deserialize_pack(msg, std::get<_Is>(t)...);
399 template <
typename... _ValueTypes>
400 inline Message& operator>>(Message& msg, Struct<_ValueTypes...>& item)
402 auto structSignature = signature_of<Struct<_ValueTypes...>>::str();
404 auto structContentSignature = structSignature.substr(1, structSignature.size()-2);
406 if (!msg.enterStruct(structContentSignature))
409 detail::deserialize_tuple(msg, item, std::index_sequence_for<_ValueTypes...>{});
416 template <
typename... _ValueTypes>
417 inline Message& operator>>(Message& msg, std::tuple<_ValueTypes...>& item)
419 detail::deserialize_tuple(msg, item, std::index_sequence_for<_ValueTypes...>{});
Definition: Message.h:180
Definition: Message.h:209
Definition: Message.h:248
Definition: Message.h:239
Definition: Message.h:230
Definition: Message.h:219
Definition: Message.h:176
Definition: TypeTraits.h:64