/* * Copyright (c) 2019, The OpenThread Authors. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holder nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "dbus/common/dbus_message_helper.hpp" #include "dbus/server/dbus_object.hpp" using otbr::DBus::DBusMessageEncodeToVariant; using otbr::DBus::DBusMessageExtractFromVariant; using otbr::DBus::DBusMessageToTuple; using otbr::DBus::DBusObject; using otbr::DBus::DBusRequest; using std::placeholders::_1; class TestObject : public DBusObject { public: TestObject(DBusConnection *aConnection) : DBusObject(aConnection, "/io/openthread/testobj") , mEnded(false) , mCount(0) { RegisterMethod("io.openthread", "Ping", std::bind(&TestObject::PingHandler, this, _1)); RegisterGetPropertyHandler("io.openthread", "Count", std::bind(&TestObject::CountGetHandler, this, _1)); RegisterSetPropertyHandler("io.openthread", "Count", std::bind(&TestObject::CountSetHandler, this, _1)); } bool IsEnded(void) const { return mEnded; } private: otError CountGetHandler(DBusMessageIter &aIter) { DBusMessageEncodeToVariant(&aIter, mCount); return OT_ERROR_NONE; } otError CountSetHandler(DBusMessageIter &aIter) { int32_t cnt = 0; DBusMessageExtractFromVariant(&aIter, cnt); mCount = cnt; return OT_ERROR_NONE; } void PingHandler(DBusRequest &aRequest) { uint32_t id; std::string pingMessage; auto args = std::tie(id, pingMessage); if (DBusMessageToTuple(*aRequest.GetMessage(), args) == OTBR_ERROR_NONE) { aRequest.Reply(std::make_tuple(id, pingMessage + "Pong")); } else { aRequest.Reply(std::make_tuple("hello")); mEnded = true; } } bool mEnded; int32_t mCount; }; int main() { int ret = EXIT_SUCCESS; int requestReply; DBusError dbusErr; dbus_error_init(&dbusErr); DBusConnection *connection = dbus_bus_get(DBUS_BUS_SYSTEM, &dbusErr); VerifyOrExit(connection != nullptr); dbus_bus_register(connection, &dbusErr); requestReply = dbus_bus_request_name(connection, "io.openthread.TestServer", DBUS_NAME_FLAG_REPLACE_EXISTING, &dbusErr); VerifyOrExit(requestReply == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER || requestReply == DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER, ret = EXIT_FAILURE); { TestObject s(connection); s.Init(); while (!s.IsEnded()) { dbus_connection_read_write_dispatch(connection, -1); } } exit: dbus_error_free(&dbusErr); dbus_connection_unref(connection); return ret; }