#include "ActivityFactory.hpp"
#include "UniversalSwitch.hpp"
#include "localization.hpp"
-#include "eldbus.hpp"
#include "CompositeSwitchProvider.hpp"
#include "Switch.hpp"
#include "ConditionAll.hpp"
#include "Window.hpp"
+#include "DBus.hpp"
#define BUS "org.tizen.UniversalSwitch"
#define PATH "/org/tizen/UniversalSwitch"
class DBusInterfaceImpl: public DBusInterface
{
-public:
- DBusInterfaceImpl(): eldbusInit(), connection(efl::eldbus::session), iface(connection, PATH, ifaceDescription)
- {
- eldbus_name_request(connection.native_handle(), BUS, ELDBUS_NAME_REQUEST_FLAG_DO_NOT_QUEUE, onNameRequest, iface.native_handle());
- }
static void onNameRequest(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
{
}
}
- static Eldbus_Message *getAllSwitchConfigurationItems(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+ DBus::ValueOrError<std::vector<std::tuple<std::string, std::string, std::string, int32_t>>> getAllSwitchConfigurationItems(void)
{
DEBUG(IFACE ".getAllSwitchConfigurationItems called");
- auto reply = eldbus_message_method_return_new(msg);
- auto iter = eldbus_message_iter_get(reply);
- Eldbus_Message_Iter *array;
- eldbus_message_iter_arguments_append(iter, "a(sssi)", &array);
-
- auto configuration = Singleton<UniversalSwitch>::instance().getConfiguration();
- if (configuration) {
+ std::vector<std::tuple<std::string, std::string, std::string, int32_t>> result;
+ if (auto configuration = Singleton<UniversalSwitch>::instance().getConfiguration()) {
auto configurationItems = configuration->findAll();
for (auto &item : configurationItems) {
- Eldbus_Message_Iter *structure;
- DEBUG("configurationItem: id=%s userName=%s activityType=%s changeType=%d", item->getSwitchId().c_str(), item->getUserName().c_str(), item->getActivityType().c_str(), static_cast<int>(item->getChangeType()));
- eldbus_message_iter_arguments_append(array, "(sssi)", &structure);
- eldbus_message_iter_arguments_append(structure, "sssi", item->getSwitchId().c_str(), item->getUserName().c_str(), item->getActivityType().c_str(), static_cast<int>(item->getChangeType()));
- eldbus_message_iter_container_close(array, structure);
+ result.push_back({ item->getSwitchId(), item->getUserName(), item->getActivityType(), static_cast<int>(item->getChangeType()) });
}
+ return move(result);
} else {
ERROR("configuration not defined");
+ return DBus::Error{ "configuration not defined" };
}
-
- eldbus_message_iter_container_close(iter, array);
- return reply;
}
-
template<class LocalizationClass>
- static Eldbus_Message *sendStringsWithLocalizedNamesAndDescriptions(const Eldbus_Message *msg, const std::vector<std::string> &strings, bool descriptionAllowEmptyTranslation = false)
+ DBus::ValueOrError<std::vector<std::tuple<std::string, std::string, std::string>>>
+ sendStringsWithLocalizedNamesAndDescriptions(const std::vector<std::string> &strings, bool descriptionAllowEmptyTranslation = false)
{
- auto reply = eldbus_message_method_return_new(msg);
-
- auto iter = eldbus_message_iter_get(reply);
- Eldbus_Message_Iter *array;
- eldbus_message_iter_arguments_append(iter, "a(sss)", &array);
-
+ std::vector<std::tuple<std::string, std::string, std::string>> result;
for (auto &s : strings) {
- Eldbus_Message_Iter *structure;
- eldbus_message_iter_arguments_append(array, "(sss)", &structure);
- eldbus_message_iter_arguments_append(structure, "sss", s.c_str(), localization::get<LocalizationClass, localization::Name>(s).c_str(), localization::get<LocalizationClass, localization::Description>(s, descriptionAllowEmptyTranslation).c_str());
- eldbus_message_iter_container_close(array, structure);
+ result.push_back({
+ s,
+ localization::get<LocalizationClass, localization::Name>(s),
+ localization::get<LocalizationClass, localization::Description>(s, descriptionAllowEmptyTranslation)
+ });
}
-
- eldbus_message_iter_container_close(iter, array);
- return reply;
+ return result;
}
- static Eldbus_Message *getAllActivityTypes(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+ auto getAllActivityTypes(void)
{
DEBUG(IFACE ".getAllActivityTypes called");
auto activityTypes = ActivityFactory::getInstance()->getAllActivityTypes();
- return sendStringsWithLocalizedNamesAndDescriptions<Activity>(msg, activityTypes);
+ return sendStringsWithLocalizedNamesAndDescriptions<Activity>(activityTypes);
}
- static Eldbus_Message *getBindableActivityTypes(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+ auto getBindableActivityTypes(void)
{
DEBUG(IFACE ".getBindableActivityTypes called");
auto activityTypes = ActivityFactory::getInstance()->getBindableActivityTypes();
- return sendStringsWithLocalizedNamesAndDescriptions<Activity>(msg, activityTypes);
+ return sendStringsWithLocalizedNamesAndDescriptions<Activity>(activityTypes);
}
- static Eldbus_Message *getAllSwitchProviders(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+ auto getAllSwitchProviders(void)
{
DEBUG(IFACE ".getAllSwitchProviders called");
std::vector<std::string> providerIds;
ERROR("compositeSwitchProvider not defined");
}
- return sendStringsWithLocalizedNamesAndDescriptions<SwitchProvider>(msg, providerIds);
- }
-
- static std::string receivedString(const Eldbus_Message *msg)
- {
- const char *txt;
- if (!eldbus_message_arguments_get(msg, "s", &txt)) {
- ERROR("Error on eldbus_message_arguments_get()");
- return std::string();
- }
- return txt;
+ return sendStringsWithLocalizedNamesAndDescriptions<SwitchProvider>(providerIds);
}
- static Eldbus_Message *getAllSwitchesByProviderId(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+ auto getAllSwitchesByProviderId(std::string providerId)
{
std::vector<std::string> switchesId;
DEBUG(IFACE ".getAllSwitchesByProviderId called");
- auto providerId = receivedString(msg);
auto compositeSwitchProvider = Singleton<UniversalSwitch>::instance().getCompositeSwitchProvider();
if (!compositeSwitchProvider) {
ERROR("compositeSwitchProvider not defined");
- return sendStringsWithLocalizedNamesAndDescriptions<Switch>(msg, switchesId);
+ return sendStringsWithLocalizedNamesAndDescriptions<Switch>(switchesId);
}
auto provider = compositeSwitchProvider->getProviderById(providerId);
ERROR("Provider with id: %s not found", providerId.c_str());
}
- return sendStringsWithLocalizedNamesAndDescriptions<Switch>(msg, switchesId, true);
+ return sendStringsWithLocalizedNamesAndDescriptions<Switch>(switchesId, true);
}
- static Eldbus_Message *addSwitchConfigurationItem(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+ DBus::ValueOrError<void> addSwitchConfigurationItem(std::string switchId, std::string userName, std::string activityType)
{
DEBUG(IFACE ".addSwitchConfigurationItem called");
- auto reply = eldbus_message_method_return_new(msg);
- const char *switchId, *activityType, *userName;
auto configuration = Singleton<UniversalSwitch>::instance().getConfiguration();
if (!configuration) {
ERROR("configuration not defined");
- return reply;
+ return DBus::Error{ "configuration not defined" };
}
- if (eldbus_message_arguments_get(msg, "sss", &switchId, &userName, &activityType)) {
- DEBUG("adding SwitchConfigurationItem switchId: %s, userName: %s, activityType: %s", switchId, userName, activityType);
- auto configurationItem = std::make_shared<SwitchConfigurationItem>(switchId, activityType);
- configurationItem->setUserName(userName);
- configuration->add(configurationItem);
- } else {
- ERROR("Error on eldbus_message_arguments_get()");
- }
- return reply;
+ DEBUG("adding SwitchConfigurationItem switchId: %s, userName: %s, activityType: %s", switchId.c_str(), userName.c_str(), activityType.c_str());
+ auto configurationItem = std::make_shared<SwitchConfigurationItem>(switchId, activityType);
+ configurationItem->setUserName(userName);
+ configuration->add(configurationItem);
+ return DBus::Success{};
}
- static Eldbus_Message *updateSwitchConfigurationItem(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+ DBus::ValueOrError<void> updateSwitchConfigurationItem(std::string switchId, std::string userName, std::string activityType)
{
DEBUG(IFACE ".addSwitchConfigurationItem called");
- auto reply = eldbus_message_method_return_new(msg);
- const char *switchId, *activityType, *userName;
auto configuration = Singleton<UniversalSwitch>::instance().getConfiguration();
if (!configuration) {
ERROR("configuration not defined");
- return reply;
+ return DBus::Error{ "configuration not defined" };
}
- if (eldbus_message_arguments_get(msg, "sss", &switchId, &userName, &activityType)) {
- DEBUG("updating SwitchConfigurationItem switchId: %s, userName: %s, activityType: %s", switchId, userName, activityType);
- auto configurationItem = configuration->findBySwitchId(switchId);
- if (configurationItem) {
- configurationItem->setActivityType(activityType);
- configurationItem->setUserName(userName);
- configuration->update(configurationItem);
- } else {
- ERROR("configurationItem switchId: %s not found", switchId);
- }
+ DEBUG("updating SwitchConfigurationItem switchId: %s, userName: %s, activityType: %s", switchId.c_str(), userName.c_str(), activityType.c_str());
+ auto configurationItem = configuration->findBySwitchId(switchId);
+ if (configurationItem) {
+ configurationItem->setActivityType(activityType);
+ configurationItem->setUserName(userName);
+ configuration->update(configurationItem);
+ return DBus::Success{};
} else {
- ERROR("Error on eldbus_message_arguments_get()");
+ ERROR("configurationItem switchId: %s not found", switchId.c_str());
+ return DBus::Error{ "configurationItem switchId: " + switchId + " not found" };
}
- return reply;
}
-
- static Eldbus_Message *removeSwitchConfigurationItem(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+ DBus::ValueOrError<void> removeSwitchConfigurationItem(std::string switchId)
{
DEBUG(IFACE ".addSwitchConfigurationItem called");
- auto reply = eldbus_message_method_return_new(msg);
- const char *switchId;
auto configuration = Singleton<UniversalSwitch>::instance().getConfiguration();
if (!configuration) {
ERROR("configuration not defined");
- return reply;
+ return DBus::Error{ "configuration not defined" };
}
- if (eldbus_message_arguments_get(msg, "s", &switchId)) {
- DEBUG("removing SwitchConfigurationItem switchId: %s", switchId);
- configuration->remove(switchId);
- } else {
- ERROR("Error on eldbus_message_arguments_get()");
- }
- return reply;
+ DEBUG("removing SwitchConfigurationItem switchId: %s", switchId.c_str());
+ configuration->remove(switchId);
+ return DBus::Success{};
}
class DBusSwitchObserver : public Observer<Switch>, public std::enable_shared_from_this<DBusSwitchObserver>
{
public:
- DBusSwitchObserver(Eldbus_Message *reply, Eldbus_Connection *connection)
- : reply(reply), connection(connection) {};
+ DBusSwitchObserver(std::function<void(DBus::ValueOrError<std::string>)> doneCb) : doneCb(std::move(doneCb)) {}
~DBusSwitchObserver()
{
provider->detach(this, nullptr);
provider.reset();
}
- if (reply) {
- DEBUG("DBusSwitchObserver releasing reply message");
- eldbus_message_unref(reply);
- reply = NULL;
- }
+ doneCb = {};
}
void replyMessage(const std::string &msg)
{
- if (!reply)
- return;
-
- DEBUG("DBusSwitchObserver message reply: %s", msg.c_str());
- eldbus_message_arguments_append(reply, "s", msg.c_str());
- eldbus_connection_send(connection, reply, NULL, NULL, -1);
- reply = NULL;
+ if (doneCb) {
+ DEBUG("DBusSwitchObserver message reply: %s", msg.c_str());
+ doneCb({ msg });
+ doneCb = {};
+ }
}
void update(const std::shared_ptr<Switch> &item) override
detach();
}
- Eldbus_Message *reply;
- Eldbus_Connection *connection;
+ std::function<void(DBus::ValueOrError<std::string>)> doneCb;
std::shared_ptr<SwitchProvider> provider;
};
- static Eldbus_Message *captureSwitch(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+ void captureSwitch(std::function<void(DBus::ValueOrError<std::string>)> doneCb, std::string providerId)
{
- DEBUG(IFACE ".captureSwitch called");
- auto reply = eldbus_message_method_return_new(msg);
-
auto compositeSwitchProvider = Singleton<UniversalSwitch>::instance().getCompositeSwitchProvider();
if (!compositeSwitchProvider) {
ERROR("compositeSwitchProvider not defined");
- return reply;
+ doneCb(DBus::Error{ "compositeSwitchProvider not defined" });
+ return;
}
- auto providerId = receivedString(msg);
auto provider = compositeSwitchProvider->getProviderById(providerId);
if (!provider) {
ERROR("Provider with id: %s not found", providerId.c_str());
- return reply;
- }
-
- auto dbusImpl = std::static_pointer_cast<DBusInterfaceImpl>(Singleton<UniversalSwitch>::instance().getDBusInterface());
- if (!dbusImpl) {
- ERROR("DBusInterfaceImpl not found");
- return reply;
+ doneCb(DBus::Error{ "Provider with id: " + providerId + " not found" });
+ return;
}
- auto connection = eldbus_service_connection_get(iface);
- dbusImpl->releaseSwitchObserver();
-
- auto observer = std::make_shared<DBusSwitchObserver>(reply, connection);
+ releaseSwitchObserver();
+ auto observer = std::make_shared<DBusSwitchObserver>(std::move(doneCb));
observer->attach(provider);
- dbusImpl->switchObserver = observer;
-
- //response to this request will be send asynchronous by
- //DBusSwitchObserver when we obtain a switch, that is why we return NULL for now.
- return NULL;
+ switchObserver = observer;
}
- static Eldbus_Message *cancelCaptureSwitch(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+ DBus::ValueOrError<void> cancelCaptureSwitch(void)
{
DEBUG(IFACE ".cancelCaptureSwitch called");
- auto reply = eldbus_message_method_return_new(msg);
- auto dbusImpl = std::static_pointer_cast<DBusInterfaceImpl>(Singleton<UniversalSwitch>::instance().getDBusInterface());
- if (!dbusImpl) {
- ERROR("DBusInterfaceImpl not found");
- } else {
- dbusImpl->releaseSwitchObserver();
- }
+ releaseSwitchObserver();
+ return DBus::Success{};
+ }
+public:
+ DBusInterfaceImpl() : dbusServer(DBus::ConnectionType::SESSION)
+ {
+ DBus::DBusInterfaceDescription desc{ IFACE };
+ add(desc, "getAllSwitchConfigurationItems", &DBusInterfaceImpl::getAllSwitchConfigurationItems);
+ add(desc, "captureSwitch", &DBusInterfaceImpl::captureSwitch);
+ add(desc, "cancelCaptureSwitch", &DBusInterfaceImpl::cancelCaptureSwitch);
+ add(desc, "getAllActivityTypes", &DBusInterfaceImpl::getAllActivityTypes);
+ add(desc, "getBindableActivityTypes", &DBusInterfaceImpl::getBindableActivityTypes);
+ add(desc, "getAllSwitchProviders", &DBusInterfaceImpl::getAllSwitchProviders);
+ add(desc, "getAllSwitchesByProviderId", &DBusInterfaceImpl::getAllSwitchesByProviderId);
+ add(desc, "addSwitchConfigurationItem", &DBusInterfaceImpl::addSwitchConfigurationItem);
+ add(desc, "updateSwitchConfigurationItem", &DBusInterfaceImpl::updateSwitchConfigurationItem);
+ add(desc, "removeSwitchConfigurationItem", &DBusInterfaceImpl::removeSwitchConfigurationItem);
+ dbusServer.addInterface(PATH, desc);
+
+ eldbus_name_request(dbusServer.getConnection().get(), BUS, ELDBUS_NAME_REQUEST_FLAG_DO_NOT_QUEUE, onNameRequest, nullptr);
+ }
+private:
+ DBus::DBusServer dbusServer;
+ std::shared_ptr<DBusSwitchObserver> switchObserver;
+
+ template <typename ... RET, typename ... ARGS> void add(DBus::DBusInterfaceDescription &desc, const std::string &funcName,
+ DBus::ValueOrError<RET...>(DBusInterfaceImpl::*funcPtr)(ARGS...))
+ {
+ desc.addMethod<DBus::ValueOrError<RET...>(ARGS...)>(funcName,
+ [ = ](ARGS ... args) -> DBus::ValueOrError<RET...> {
+ return (this->*funcPtr)(std::move(args)...);
+ });
+ }
- return reply;
+ template <typename ... RET, typename ... ARGS> void add(DBus::DBusInterfaceDescription &desc, const std::string &funcName,
+ void (DBusInterfaceImpl::*funcPtr)(std::function<void(DBus::ValueOrError<RET...>)> callback, ARGS...))
+ {
+ DEBUG("%s", DBus::detail::signature<DBus::ValueOrError<RET...>>::name().c_str());
+ DEBUG("%s", DBus::detail::signature<DBus::ValueOrError<ARGS...>>::name().c_str());
+ desc.addAsyncMethod<DBus::ValueOrError<RET...>(ARGS...)>(funcName,
+ [ = ](std::function<void(DBus::ValueOrError<RET...>)> callback, ARGS ... args) {
+ (this->*funcPtr)(std::move(callback), std::move(args)...);
+ });
}
void releaseSwitchObserver()
switchObserver.reset();
}
}
-
-private:
- static const Eldbus_Method methods[];
- static const Eldbus_Service_Interface_Desc ifaceDescription;
-
- std::shared_ptr<DBusSwitchObserver> switchObserver;
-
- efl::eldbus::eldbus_init eldbusInit;
- efl::eldbus::connection connection;
- efl::eldbus::service_interface iface;
-
-};
-
-const Eldbus_Method DBusInterfaceImpl::methods[] = {
- {
- "getAllSwitchConfigurationItems", NULL, ELDBUS_ARGS({"a(sssi)", "array_configuration_item"}),
- getAllSwitchConfigurationItems, 0
- },
- {
- "captureSwitch", ELDBUS_ARGS({"s", "providerId"}), ELDBUS_ARGS({"s", "switchId"}),
- captureSwitch, 0
- },
- {
- "cancelCaptureSwitch", NULL, NULL,
- cancelCaptureSwitch, 0
- },
- {
- "getAllActivityTypes", NULL, ELDBUS_ARGS({"a(sss)", "array_activityTypes"}),
- getAllActivityTypes, 0
- },
- {
- "getBindableActivityTypes", NULL, ELDBUS_ARGS({"a(sss)", "array_activityTypes"}),
- getBindableActivityTypes, 0
- },
- {
- "getAllSwitchProviders", NULL, ELDBUS_ARGS({"a(sss)", "array_providers"}),
- getAllSwitchProviders, 0
- },
- {
- "getAllSwitchesByProviderId", ELDBUS_ARGS({"s", "providerId"}), ELDBUS_ARGS({"a(sss)", "array_switches"}),
- getAllSwitchesByProviderId, 0
- },
- {
- "addSwitchConfigurationItem", ELDBUS_ARGS({"sss", "switchConfigurationItem"}), NULL,
- addSwitchConfigurationItem, 0
- },
- {
- "updateSwitchConfigurationItem", ELDBUS_ARGS({"sss", "switchConfigurationItem"}), NULL,
- updateSwitchConfigurationItem, 0
- },
- {
- "removeSwitchConfigurationItem", ELDBUS_ARGS({"s", "switchId"}), NULL,
- removeSwitchConfigurationItem, 0
- },
- { }
-};
-
-const Eldbus_Service_Interface_Desc DBusInterfaceImpl::ifaceDescription = {
- IFACE, methods, nullptr, nullptr, nullptr, nullptr
};
-
std::shared_ptr<DBusInterface> DBusInterface::create()
{
return std::make_shared<DBusInterfaceImpl>();