34 #ifndef DBUS_MESSAGE_HELPER_HPP_
35 #define DBUS_MESSAGE_HELPER_HPP_
42 #include <dbus/dbus.h>
45 #include "common/types.hpp"
54 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const ActiveScanResult &aScanResult);
55 otbrError DBusMessageExtract(DBusMessageIter *aIter, ActiveScanResult &aScanResult);
56 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const EnergyScanResult &aResult);
57 otbrError DBusMessageExtract(DBusMessageIter *aIter, EnergyScanResult &aResult);
58 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const LinkModeConfig &aConfig);
59 otbrError DBusMessageExtract(DBusMessageIter *aIter, LinkModeConfig &aConfig);
60 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const Ip6Prefix &aPrefix);
61 otbrError DBusMessageExtract(DBusMessageIter *aIter, Ip6Prefix &aPrefix);
62 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const ExternalRoute &aRoute);
63 otbrError DBusMessageExtract(DBusMessageIter *aIter, ExternalRoute &aRoute);
64 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const OnMeshPrefix &aPrefix);
65 otbrError DBusMessageExtract(DBusMessageIter *aIter, OnMeshPrefix &aPrefix);
66 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const MacCounters &aCounters);
67 otbrError DBusMessageExtract(DBusMessageIter *aIter, MacCounters &aCounters);
68 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const IpCounters &aCounters);
69 otbrError DBusMessageExtract(DBusMessageIter *aIter, IpCounters &aCounters);
70 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const ChildInfo &aChildInfo);
71 otbrError DBusMessageExtract(DBusMessageIter *aIter, ChildInfo &aChildInfo);
72 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const NeighborInfo &aNeighborInfo);
73 otbrError DBusMessageExtract(DBusMessageIter *aIter, NeighborInfo &aNeighborInfo);
74 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const LeaderData &aLeaderData);
75 otbrError DBusMessageExtract(DBusMessageIter *aIter, LeaderData &aLeaderData);
76 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const ChannelQuality &aQuality);
77 otbrError DBusMessageExtract(DBusMessageIter *aIter, ChannelQuality &aQuality);
78 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const TxtEntry &aTxtEntry);
79 otbrError DBusMessageExtract(DBusMessageIter *aIter, TxtEntry &aTxtEntry);
80 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const SrpServerInfo::Registration &aRegistration);
81 otbrError DBusMessageExtract(DBusMessageIter *aIter, SrpServerInfo::Registration &aRegistration);
82 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const SrpServerInfo::ResponseCounters &aResponseCounters);
83 otbrError DBusMessageExtract(DBusMessageIter *aIter, SrpServerInfo::ResponseCounters &aResponseCounters);
84 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const SrpServerInfo &aSrpServerInfo);
85 otbrError DBusMessageExtract(DBusMessageIter *aIter, SrpServerInfo &aSrpServerInfo);
86 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const MdnsResponseCounters &aMdnsResponseCounters);
87 otbrError DBusMessageExtract(DBusMessageIter *aIter, MdnsResponseCounters &aMdnsResponseCounters);
88 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const MdnsTelemetryInfo &aMdnsTelemetryInfo);
89 otbrError DBusMessageExtract(DBusMessageIter *aIter, MdnsTelemetryInfo &aMdnsTelemetryInfo);
90 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const DnssdCounters &aDnssdCounters);
91 otbrError DBusMessageExtract(DBusMessageIter *aIter, DnssdCounters &aDnssdCounters);
92 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const RadioSpinelMetrics &aRadioSpinelMetrics);
93 otbrError DBusMessageExtract(DBusMessageIter *aIter, RadioSpinelMetrics &RadioSpinelMetrics);
94 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const RcpInterfaceMetrics &aRcpInterfaceMetrics);
95 otbrError DBusMessageExtract(DBusMessageIter *aIter, RcpInterfaceMetrics &aRcpInterfaceMetrics);
96 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const RadioCoexMetrics &aRadioCoexMetrics);
97 otbrError DBusMessageExtract(DBusMessageIter *aIter, RadioCoexMetrics &aRadioCoexMetrics);
98 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const BorderRoutingCounters::PacketsAndBytes &aPacketAndBytes);
99 otbrError DBusMessageExtract(DBusMessageIter *aIter, BorderRoutingCounters::PacketsAndBytes &aPacketAndBytes);
100 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const BorderRoutingCounters &aBorderRoutingCounters);
101 otbrError DBusMessageExtract(DBusMessageIter *aIter, BorderRoutingCounters &aBorderRoutingCounters);
102 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const Nat64ComponentState &aNat64State);
103 otbrError DBusMessageExtract(DBusMessageIter *aIter, Nat64ComponentState &aNat64State);
104 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const Nat64TrafficCounters &aCounters);
105 otbrError DBusMessageExtract(DBusMessageIter *aIter, Nat64TrafficCounters &aCounters);
106 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const Nat64PacketCounters &aCounters);
107 otbrError DBusMessageExtract(DBusMessageIter *aIter, Nat64PacketCounters &aCounters);
108 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const Nat64ProtocolCounters &aCounters);
109 otbrError DBusMessageExtract(DBusMessageIter *aIter, Nat64ProtocolCounters &aCounters);
110 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const Nat64AddressMapping &aMapping);
111 otbrError DBusMessageExtract(DBusMessageIter *aIter, Nat64AddressMapping &aMapping);
112 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const Nat64ErrorCounters &aCounters);
113 otbrError DBusMessageExtract(DBusMessageIter *aIter, Nat64ErrorCounters &aCounters);
120 static constexpr
const char *TYPE_AS_STRING =
"(uuuu)";
126 static constexpr
const char *TYPE_AS_STRING =
"(uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu)";
132 static constexpr
const char *TYPE_AS_STRING =
"(bbb)";
138 static constexpr
const char *TYPE_AS_STRING =
"ay";
144 static constexpr
const char *TYPE_AS_STRING =
"ay";
150 static constexpr
const char *TYPE_AS_STRING =
"(ayy)";
156 static constexpr
const char *TYPE_AS_STRING =
"((ayy)qybb)";
162 static constexpr
const char *TYPE_AS_STRING =
"a((ayy)qybb)";
168 static constexpr
const char *TYPE_AS_STRING =
"((ayy)qybbbbbbbbb)";
174 static constexpr
const char *TYPE_AS_STRING =
"a((ayy)qybbbbbbbbb)";
180 static constexpr
const char *TYPE_AS_STRING =
"(uyyyy)";
186 static constexpr
const char *TYPE_AS_STRING =
"a(yq)";
193 static constexpr
const char *TYPE_AS_STRING =
"(tuquuyyyqqbbbb)";
200 static constexpr
const char *TYPE_AS_STRING =
"a(tuquuyyyqqbbbb)";
207 static constexpr
const char *TYPE_AS_STRING =
"(tuuqqyyyyqqbbbb)";
214 static constexpr
const char *TYPE_AS_STRING =
"(tstayqqyyyybb)";
220 static constexpr
const char *TYPE_AS_STRING =
"(yy)";
226 static constexpr
const char *TYPE_AS_STRING =
"(yq)";
233 static constexpr
const char *TYPE_AS_STRING =
"a(tuuqqyyyyqqbbbb)";
239 static constexpr
const char *TYPE_AS_STRING =
"(say)";
245 static constexpr
const char *TYPE_AS_STRING =
"a(say)";
250 static constexpr
int TYPE = DBUS_TYPE_BYTE;
251 static constexpr
const char *TYPE_AS_STRING = DBUS_TYPE_BYTE_AS_STRING;
256 static constexpr
int TYPE = DBUS_TYPE_BYTE;
257 static constexpr
const char *TYPE_AS_STRING = DBUS_TYPE_BYTE_AS_STRING;
266 static constexpr
const char *TYPE_AS_STRING =
"(yqy(uutttt)(uutttt)(uuuuuu))";
276 static constexpr
const char *TYPE_AS_STRING =
"((uuuuuuuu)(uuuuuuuu)(uuuuuuuu)(uuuuuuuu)uuuu)";
282 static constexpr
const char *TYPE_AS_STRING =
"(uuuuuuu)";
288 static constexpr
const char *TYPE_AS_STRING =
"(uuuu)";
294 static constexpr
const char *TYPE_AS_STRING =
"(yttttttt)";
302 static constexpr
const char *TYPE_AS_STRING =
"(uuuuuuuuuuuuuuuuuub)";
311 static constexpr
const char *TYPE_AS_STRING =
"((tt)(tt)(tt)(tt))";
317 static constexpr
const char *TYPE_AS_STRING =
"(ss)";
323 static constexpr
const char *TYPE_AS_STRING =
"(tttt)";
329 static constexpr
const char *TYPE_AS_STRING =
"(tt)";
338 static constexpr
const char *TYPE_AS_STRING =
"((tttt)(tttt)(tttt)(tttt))";
353 static constexpr
const char *TYPE_AS_STRING =
"(tayayu((tttt)(tttt)(tttt)(tttt)))";
368 static constexpr
const char *TYPE_AS_STRING =
"a(tayayu((tttt)(tttt)(tttt)(tttt)))";
377 static constexpr
const char *TYPE_AS_STRING =
"((tt)(tt)(tt)(tt))";
382 static constexpr
int TYPE = DBUS_TYPE_BYTE;
383 static constexpr
const char *TYPE_AS_STRING = DBUS_TYPE_BYTE_AS_STRING;
388 static constexpr
int TYPE = DBUS_TYPE_BYTE;
389 static constexpr
const char *TYPE_AS_STRING = DBUS_TYPE_BYTE_AS_STRING;
394 static constexpr
int TYPE = DBUS_TYPE_UINT16;
395 static constexpr
const char *TYPE_AS_STRING = DBUS_TYPE_UINT16_AS_STRING;
400 static constexpr
int TYPE = DBUS_TYPE_UINT32;
401 static constexpr
const char *TYPE_AS_STRING = DBUS_TYPE_UINT32_AS_STRING;
406 static constexpr
int TYPE = DBUS_TYPE_UINT64;
407 static constexpr
const char *TYPE_AS_STRING = DBUS_TYPE_UINT64_AS_STRING;
412 static constexpr
int TYPE = DBUS_TYPE_INT16;
413 static constexpr
const char *TYPE_AS_STRING = DBUS_TYPE_INT16_AS_STRING;
418 static constexpr
int TYPE = DBUS_TYPE_INT32;
419 static constexpr
const char *TYPE_AS_STRING = DBUS_TYPE_INT32_AS_STRING;
424 static constexpr
int TYPE = DBUS_TYPE_INT64;
425 static constexpr
const char *TYPE_AS_STRING = DBUS_TYPE_INT64_AS_STRING;
430 static constexpr
int TYPE = DBUS_TYPE_STRING;
431 static constexpr
const char *TYPE_AS_STRING = DBUS_TYPE_STRING_AS_STRING;
434 otbrError DBusMessageEncode(DBusMessageIter *aIter,
bool aValue);
435 otbrError DBusMessageEncode(DBusMessageIter *aIter, int8_t aValue);
436 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const std::string &aValue);
437 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const char *aValue);
438 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const std::vector<uint8_t> &aValue);
439 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const std::vector<uint16_t> &aValue);
440 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const std::vector<uint32_t> &aValue);
441 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const std::vector<uint64_t> &aValue);
442 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const std::vector<int16_t> &aValue);
443 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const std::vector<int32_t> &aValue);
444 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const std::vector<int64_t> &aValue);
445 otbrError DBusMessageExtract(DBusMessageIter *aIter,
bool &aValue);
446 otbrError DBusMessageExtract(DBusMessageIter *aIter, int8_t &aValue);
447 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::string &aValue);
448 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<uint8_t> &aValue);
449 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<uint16_t> &aValue);
450 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<uint32_t> &aValue);
451 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<uint64_t> &aValue);
452 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<int16_t> &aValue);
453 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<int32_t> &aValue);
454 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<int64_t> &aValue);
456 template <
typename T>
otbrError DBusMessageExtract(DBusMessageIter *aIter, T &aValue)
461 dbus_message_iter_get_basic(aIter, &aValue);
462 dbus_message_iter_next(aIter);
469 template <
typename T>
otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<T> &aValue)
472 DBusMessageIter subIter;
475 dbus_message_iter_recurse(aIter, &subIter);
478 while (dbus_message_iter_get_arg_type(&subIter) != DBUS_TYPE_INVALID)
482 aValue.push_back(val);
484 dbus_message_iter_next(aIter);
490 template <
typename T>
otbrError DBusMessageExtractPrimitive(DBusMessageIter *aIter, std::vector<T> &aValue)
492 DBusMessageIter subIter;
499 dbus_message_iter_recurse(aIter, &subIter);
501 subtype = dbus_message_iter_get_arg_type(&subIter);
502 if (subtype != DBUS_TYPE_INVALID)
505 dbus_message_iter_get_fixed_array(&subIter, &val, &n);
509 aValue = std::vector<T>(val, val + n);
512 dbus_message_iter_next(aIter);
518 template <
typename T,
size_t SIZE>
otbrError DBusMessageExtract(DBusMessageIter *aIter, std::array<T, SIZE> &aValue)
520 DBusMessageIter subIter;
527 dbus_message_iter_recurse(aIter, &subIter);
529 subtype = dbus_message_iter_get_arg_type(&subIter);
530 if (subtype != DBUS_TYPE_INVALID)
533 dbus_message_iter_get_fixed_array(&subIter, &val, &n);
538 std::copy(val, val + n, aValue.begin());
541 dbus_message_iter_next(aIter);
547 template <
typename T>
otbrError DBusMessageEncode(DBusMessageIter *aIter, T aValue)
556 template <
typename T>
otbrError DBusMessageEncode(DBusMessageIter *aIter,
const std::vector<T> &aValue)
559 DBusMessageIter subIter;
561 VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_ARRAY, DBusTypeTrait<T>::TYPE_AS_STRING, &subIter),
564 for (
const auto &v : aValue)
574 template <
typename T>
otbrError DBusMessageEncodePrimitive(DBusMessageIter *aIter,
const std::vector<T> &aValue)
576 DBusMessageIter subIter;
579 VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_ARRAY, DBusTypeTrait<T>::TYPE_AS_STRING, &subIter),
584 const T *buf = &aValue.front();
586 VerifyOrExit(dbus_message_iter_append_fixed_array(&subIter, DBusTypeTrait<T>::TYPE, &buf,
587 static_cast<int>(aValue.size())),
595 template <
typename T,
size_t SIZE>
596 otbrError DBusMessageEncode(DBusMessageIter *aIter,
const std::array<T, SIZE> &aValue)
598 DBusMessageIter subIter;
601 VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_ARRAY, DBusTypeTrait<T>::TYPE_AS_STRING, &subIter),
606 const T *buf = &aValue.front();
608 VerifyOrExit(dbus_message_iter_append_fixed_array(&subIter, DBusTypeTrait<T>::TYPE, &buf,
609 static_cast<int>(aValue.size())),
619 using ValueType =
typename std::tuple_element<I, std::tuple<FieldTypes...>>::type;
620 using NonconstValueType =
typename std::remove_cv<ValueType>::type;
621 using RawValueType =
typename std::remove_reference<NonconstValueType>::type;
627 static otbrError ConvertToTuple(DBusMessageIter *aIter, std::tuple<FieldTypes...> &aValues)
629 using RawValueType =
typename ElementType<N - I, FieldTypes...>::RawValueType;
630 RawValueType &val = std::get<N - I>(aValues);
631 otbrError error = DBusMessageExtract(aIter, val);
640 static otbrError ConvertToDBusMessage(DBusMessageIter *aIter,
const std::tuple<FieldTypes...> &aValues)
642 otbrError error = DBusMessageEncode(aIter, std::get<N - I>(aValues));
655 static otbrError ConvertToTuple(DBusMessageIter *aIter, std::tuple<> &aValues)
657 OTBR_UNUSED_VARIABLE(aIter);
658 OTBR_UNUSED_VARIABLE(aValues);
662 static otbrError ConvertToDBusMessage(DBusMessageIter *aIter,
const std::tuple<> &aValues)
664 OTBR_UNUSED_VARIABLE(aIter);
665 OTBR_UNUSED_VARIABLE(aValues);
673 static otbrError ConvertToTuple(DBusMessageIter *aIter, std::tuple<FieldTypes...> &aValues)
675 using RawValueType =
typename ElementType<N - 1, FieldTypes...>::RawValueType;
676 RawValueType &val = std::get<N - 1>(aValues);
677 otbrError error = DBusMessageExtract(aIter, val);
682 static otbrError ConvertToDBusMessage(DBusMessageIter *aIter,
const std::tuple<FieldTypes...> &aValues)
684 otbrError error = DBusMessageEncode(aIter, std::get<N - 1>(aValues));
690 template <
typename... FieldTypes>
691 otbrError ConvertToDBusMessage(DBusMessageIter *aIter,
const std::tuple<FieldTypes...> &aValues)
693 return DBusMessageIterFor<
sizeof...(FieldTypes),
sizeof...(FieldTypes), FieldTypes...>::ConvertToDBusMessage(
697 template <
typename... FieldTypes>
698 constexpr
otbrError ConvertToTuple(DBusMessageIter *aIter, std::tuple<FieldTypes...> &aValues)
700 return DBusMessageIterFor<
sizeof...(FieldTypes),
sizeof...(FieldTypes), FieldTypes...>::ConvertToTuple(aIter,
716 DBusMessageIter subIter;
742 DBusMessageIter subIter;
745 dbus_message_iter_recurse(aIter, &subIter);
762 template <
typename... FieldTypes>
766 DBusMessageIter iter;
770 error = ConvertToTuple(&iter, aValues);
785 template <
typename... FieldTypes>
788 DBusMessageIter iter;
790 dbus_message_iter_init_append(&aMessage, &iter);
791 return ConvertToDBusMessage(&iter, aValues);
803 template <
typename... FieldTypes>
809 bool IsDBusMessageEmpty(DBusMessage &aMessage);
814 #endif // DBUS_MESSAGE_HELPER_HPP_