#pragma once
#include <gio/gio.h>
#include <string>
#include <vector>
#include "Globals.h"
#include "DBusObjectPath.h"
#include "Logger.h"
struct DBusInterface;
struct DBusMethod
{
typedef void (*Callback)(const DBusInterface &self, GDBusConnection *pConnection, const std::string &methodName, GVariant *pParameters, GDBusMethodInvocation *pInvocation, void *pUserData);
DBusMethod(const DBusInterface *pOwner, const std::string &name, const char *pInArgs[], const char *pOutArgs, Callback callback);
const std::string &getName() const { return name; }
DBusMethod &setName(const std::string &name) { this->name = name; return *this; }
const std::vector<std::string> &getInArgs() const { return inArgs; }
const std::string &getOutArgs() const { return outArgs; }
DBusMethod &setArgs(const std::vector<std::string> &inArgs, const std::string &outArgs)
{
this->inArgs = inArgs;
this->outArgs = outArgs;
return *this;
}
template<typename T>
void call(GDBusConnection *pConnection, const DBusObjectPath &path, const std::string &interfaceName, const std::string &methodName, GVariant *pParameters, GDBusMethodInvocation *pInvocation, void *pUserData) const
{
if (!callback)
{
Logger::error(SSTR << "DBusMethod contains no callback: [" << path << "]:[" << interfaceName << "]:[" << methodName << "]");
g_dbus_method_invocation_return_dbus_error(pInvocation, kErrorNotImplemented.c_str(), "This method is not implemented");
return;
}
Logger::info(SSTR << "Calling method: [" << path << "]:[" << interfaceName << "]:[" << methodName << "]");
callback(*static_cast<const T *>(pOwner), pConnection, methodName, pParameters, pInvocation, pUserData);
}
std::string generateIntrospectionXML(int depth) const;
private:
const DBusInterface *pOwner;
std::string name;
std::vector<std::string> inArgs;
std::string outArgs;
Callback callback;
};