// Copyright 2017 Paul Nettle.
//
// This file is part of Gobbledegook.
//
// Gobbledegook is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Gobbledegook 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Gobbledegook. If not, see .
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// >>
// >>> INSIDE THIS FILE
// >>
//
// This is a representation of a D-Bus interface method.
//
// >>
// >>> DISCUSSION
// >>
//
// See the discussion at the top of DBusMethod.cpp
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// This file contains a representation of a D-Bus interface method.
//
// Methods are identified by their name (such as "Get" or "Set"). They have argument definitions (defined as part of their
// interface) that describe the type of arguments passed into the method and returned from the method.
//
// In addition to the method itself, we also store a callback that can be called whenever the method is invoked.
#pragma once
#include
#include
#include
#include "Globals.h"
#include "DBusObjectPath.h"
#include "Logger.h"
#include "Server.h"
namespace ggk {
struct DBusInterface;
struct DBusMethod
{
// A method callback delegate
typedef void (*Callback)(const DBusInterface &self, GDBusConnection *pConnection, const std::string &methodName, GVariant *pParameters, GDBusMethodInvocation *pInvocation, void *pUserData);
// Instantiate a named method on a given interface (pOwner) with a given set of arguments and a callback delegate
DBusMethod(const DBusInterface *pOwner, const std::string &name, const char *pInArgs[], const char *pOutArgs, Callback callback);
//
// Accessors
//
// Returns the name of the method
const std::string &getName() const { return name; }
// Sets the name of the method
//
// This method should generally not be called directly. Rather, the name should be set by the constructor
DBusMethod &setName(const std::string &name) { this->name = name; return *this; }
// Get the input argument type string (a GVariant type string format)
const std::vector &getInArgs() const { return inArgs; }
// Get the output argument type string (a GVariant type string format)
const std::string &getOutArgs() const { return outArgs; }
// Set the argument types for this method
//
// This method should generally not be called directly. Rather, the arguments should be set by the constructor
DBusMethod &setArgs(const std::vector &inArgs, const std::string &outArgs)
{
this->inArgs = inArgs;
this->outArgs = outArgs;
return *this;
}
//
// Call the method
//
// Calls the method
//
// If a callback delegate has been set, then this method will call that delegate, otherwise this method will do nothing
template
void call(GDBusConnection *pConnection, const DBusObjectPath &path, const std::string &interfaceName, const std::string &methodName, GVariant *pParameters, GDBusMethodInvocation *pInvocation, void *pUserData) const
{
// This should never happen, but technically possible if instantiated with a nullptr for `callback`
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(pOwner), pConnection, methodName, pParameters, pInvocation, pUserData);
}
// Internal method used to generate introspection XML used to describe our services on D-Bus
std::string generateIntrospectionXML(int depth) const;
private:
const DBusInterface *pOwner;
std::string name;
std::vector inArgs;
std::string outArgs;
Callback callback;
};
}; // namespace ggk