34 #ifndef OTBR_DBUS_DBUS_OBJECT_HPP_
35 #define OTBR_DBUS_DBUS_OBJECT_HPP_
38 #define OTBR_LOG_TAG "DBUS"
44 #include <unordered_map>
46 #include <dbus/dbus.h>
49 #include "common/types.hpp"
66 using MethodHandlerType = std::function<void(
DBusRequest &)>;
68 using PropertyHandlerType = std::function<otError(DBusMessageIter &)>;
77 DBusObject(DBusConnection *aConnection,
const std::string &aObjectPath);
99 const std::string & aMethodName,
100 const MethodHandlerType &aHandler);
111 const std::string & aPropertyName,
112 const PropertyHandlerType &aHandler);
123 const std::string & aPropertyName,
124 const PropertyHandlerType &aHandler);
137 template <
typename... FieldTypes>
139 const std::string & aSignalName,
140 const std::tuple<FieldTypes...> &aArgs)
142 UniqueDBusMessage signalMsg = NewSignalMessage(aInterfaceName, aSignalName);
165 template <
typename ValueType>
167 const std::string &aPropertyName,
168 const ValueType & aValue)
170 UniqueDBusMessage signalMsg = NewSignalMessage(DBUS_INTERFACE_PROPERTIES, DBUS_PROPERTIES_CHANGED_SIGNAL);
171 DBusMessageIter iter, subIter, dictEntryIter;
175 dbus_message_iter_init_append(signalMsg.get(), &iter);
181 VerifyOrExit(dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
182 "{" DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
"}",
185 VerifyOrExit(dbus_message_iter_open_container(&subIter, DBUS_TYPE_DICT_ENTRY,
nullptr, &dictEntryIter),
188 SuccessOrExit(error = DBusMessageEncode(&dictEntryIter, aPropertyName));
195 SuccessOrExit(error = DBusMessageEncode(&iter, std::vector<std::string>()));
199 otbrLogDebug(
"Signal %s.%s", aInterfaceName.c_str(), aPropertyName.c_str());
222 void GetAllPropertiesMethodHandler(
DBusRequest &aRequest);
223 void GetPropertyMethodHandler(
DBusRequest &aRequest);
224 void SetPropertyMethodHandler(
DBusRequest &aRequest);
226 static DBusHandlerResult sMessageHandler(DBusConnection *aConnection, DBusMessage *aMessage,
void *aData);
227 DBusHandlerResult MessageHandler(DBusConnection *aConnection, DBusMessage *aMessage);
229 UniqueDBusMessage NewSignalMessage(
const std::string &aInterfaceName,
const std::string &aSignalName);
231 std::unordered_map<std::string, MethodHandlerType> mMethodHandlers;
232 std::unordered_map<std::string, std::unordered_map<std::string, PropertyHandlerType>> mGetPropertyHandlers;
233 std::unordered_map<std::string, PropertyHandlerType> mSetPropertyHandlers;
234 DBusConnection * mConnection;
235 std::string mObjectPath;
241 #endif // OTBR_DBUS_DBUS_SERVER_HPP_