/** * (C) 2016 - 2017 KISTLER INSTRUMENTE AG, Winterthur, Switzerland * (C) 2016 - 2019 Stanislav Angelovic * * @file TestAdaptor.cpp * * Created on: May 23, 2020 * Project: sdbus-c++ * Description: High-level D-Bus IPC C++ library based on sd-bus * * This file is part of sdbus-c++. * * sdbus-c++ is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * * sdbus-c++ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with sdbus-c++. If not, see . */ #include "TestAdaptor.h" #include #include #include namespace sdbus { namespace test { TestAdaptor::TestAdaptor(sdbus::IConnection& connection) : AdaptorInterfaces(connection, OBJECT_PATH) { registerAdaptor(); } TestAdaptor::~TestAdaptor() { unregisterAdaptor(); } void TestAdaptor::noArgNoReturn() { } int32_t TestAdaptor::getInt() { return INT32_VALUE; } std::tuple TestAdaptor::getTuple() { return std::make_tuple(UINT32_VALUE, STRING_VALUE); } double TestAdaptor::multiply(const int64_t& a, const double& b) { return a * b; } void TestAdaptor::multiplyWithNoReply(const int64_t& a, const double& b) { m_multiplyResult = a * b; m_wasMultiplyCalled = true; } std::vector TestAdaptor::getInts16FromStruct(const sdbus::Struct>& x) { std::vector res{x.get<1>()}; auto y = std::get>(x); res.insert(res.end(), y.begin(), y.end()); return res; } sdbus::Variant TestAdaptor::processVariant(const sdbus::Variant& v) { sdbus::Variant res = static_cast(v.get()); return res; } std::map TestAdaptor::getMapOfVariants(const std::vector& x, const sdbus::Struct& y) { std::map res; for (auto item : x) { res[item] = (item <= 0) ? std::get<0>(y) : std::get<1>(y); } return res; } sdbus::Struct>> TestAdaptor::getStructInStruct() { return sdbus::make_struct(STRING_VALUE, sdbus::make_struct(std::map{{INT32_VALUE, INT32_VALUE}})); } int32_t TestAdaptor::sumStructItems(const sdbus::Struct& a, const sdbus::Struct& b) { int32_t res{0}; res += std::get<0>(a) + std::get<1>(a); res += std::get<0>(b) + std::get<1>(b); return res; } uint32_t TestAdaptor::sumVectorItems(const std::vector& a, const std::vector& b) { uint32_t res{0}; for (auto x : a) { res += x; } for (auto x : b) { res += x; } return res; } uint32_t TestAdaptor::doOperation(const uint32_t& param) { std::this_thread::sleep_for(std::chrono::milliseconds(param)); return param; } void TestAdaptor::doOperationAsync(sdbus::Result&& result, uint32_t param) { if (param == 0) { // Don't sleep and return the result from this thread result.returnResults(param); } else { // Process asynchronously in another thread and return the result from there std::thread([param, result = std::move(result)]() { std::this_thread::sleep_for(std::chrono::milliseconds(param)); result.returnResults(param); }).detach(); } } sdbus::Signature TestAdaptor::getSignature() { return SIGNATURE_VALUE; } sdbus::ObjectPath TestAdaptor::getObjectPath() { return OBJECT_PATH_VALUE; } sdbus::UnixFd TestAdaptor::getUnixFd() { return sdbus::UnixFd{UNIX_FD_VALUE}; } std::map>>>, sdbus::Signature, std::string>> TestAdaptor::getComplex() { return { // map { 0, // uint_64_t { // struct { // map { 23, // uint8_t { // vector { // struct "/object/path", // object path false, Variant{3.14}, { // map {0, "zero"} } } } } }, "a{t(a{ya(obva{is})}gs)}", // signature std::string{} } } }; } void TestAdaptor::throwError() { m_wasThrowErrorCalled = true; throw sdbus::createError(1, "A test error occurred"); } void TestAdaptor::throwErrorWithNoReply() { TestAdaptor::throwError(); } void TestAdaptor::doPrivilegedStuff() { // Intentionally left blank } void TestAdaptor::emitTwoSimpleSignals() { emitSimpleSignal(); emitSignalWithMap({}); } std::string TestAdaptor::state() { return m_state; } uint32_t TestAdaptor::action() { return m_action; } void TestAdaptor::action(const uint32_t& value) { m_action = value; } bool TestAdaptor::blocking() { return m_blocking; } void TestAdaptor::blocking(const bool& value) { m_blocking = value; } void TestAdaptor::emitSignalWithoutRegistration(const sdbus::Struct>& s) { getObject().emitSignal("signalWithoutRegistration").onInterface(sdbus::test::INTERFACE_NAME).withArguments(s); } std::string TestAdaptor::getExpectedXmlApiDescription() const { return R"delimiter( )delimiter" #if LIBSYSTEMD_VERSION>=242 R"delimiter( )delimiter" #else R"delimiter( )delimiter" #endif R"delimiter( )delimiter" #if LIBSYSTEMD_VERSION>=242 R"delimiter( )delimiter" #else R"delimiter( )delimiter" #endif R"delimiter( )delimiter" #if LIBSYSTEMD_VERSION>=242 R"delimiter( )delimiter" #else R"delimiter( )delimiter" #endif R"delimiter( )delimiter"; } }}