blob: 9b9b24e3819bcbb2e53b3dc515aa6d9edfb01629 [file] [log] [blame]
/* libnih
*
* Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
* Copyright © 2009 Canonical Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2, as
* published by the Free Software Foundation.
*
* This program 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 this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef NIH_DBUS_INTERFACE_H
#define NIH_DBUS_INTERFACE_H
#include <nih/macros.h>
#include <nih-dbus/dbus_message.h>
#include <dbus/dbus.h>
/* Structures declared elsewhere */
typedef struct nih_dbus_object NihDBusObject;
typedef struct nih_dbus_proxy NihDBusProxy;
typedef struct nih_dbus_proxy_signal NihDBusProxySignal;
/**
* NihDBusMethodHandler:
* @object: D-Bus object being handled,
* @message: information about method call message to handle.
*
* A method handler function is called for a specific D-Bus method call
* on @object, available as the @message parameter. The handler should
* examine the arguments and send the method reply or an error.
*
* While method handlers can be written by hand, it's far more efficient
* to have them generated automatically. nih-dbus-tool will generate
* method handlers that call C functions of appropriate names with
* ordinary arguments matching the expected types based on the message,
* and that generate the reply message based on the return arguments.
*
* Returns: DBUS_HANDLER_RESULT_HANDLED when the message has been handled
* and a reply or error sent, DBUS_HANDLER_RESULT_NOT_YET_HANDLED if the
* handler has declined to handle the message or
* DBUS_HANDLER_RESULT_NEED_MEMORY if insufficient memory to handle the
* message.
**/
typedef DBusHandlerResult (*NihDBusMethodHandler) (NihDBusObject *object,
NihDBusMessage *message);
/**
* NihDBusSignalFilter:
* @connection: D-Bus connection that received the message,
* @signal: D-Bus message containing the message received,
* @proxied: proxied signal connection information.
*
* A signal filter is hooked up to a D-Bus connection @connection and called
* for all messages received on that connection, it is expected to check
* that the @message matches the @proxied signal and if so, call the signal
* handler function with the expected arguments.
*
* While signal filter functions can be written by hand, it's far more
* efficient to have them generated automatically. nih-dbus-tool will
* generate signal filters that call C functions of appropriate names with
* ordinary arguments matching the expected types based on the message,
* and that generate the reply message based on the return arguments.
*
* Returns: usually DBUS_HANDLER_RESULT_NOT_YET_HANDLED even if the message
* has been handled to allow other signal filter functions to process the
* message or DBUS_HANDLER_RESULT_NEED_MEMORY if insufficient memory to
* handle the message.
**/
typedef DBusHandlerResult (*NihDBusSignalFilter) (DBusConnection *connection,
DBusMessage *signal,
NihDBusProxySignal *proxied);
/**
* NihDBusPropertyGetter:
* @object: D-Bus object being handled,
* @message: information about property get message,
* @iter: iterator to append value to.
*
* A property getter function is called when generating a reply to a
* D-Bus properties Get or GetAll method, available as the @message
* parameter. The getter should append a variant onto @iter containing
* the property value.
*
* Unlike method handlers, the Get and GetAll methods are implemented
* internally to libnih-dbus, with a reply being generated and sent as
* part of that handling. It's only necessary to provide the actual
* property value wrapped up in a variant.
*
* While property getters can be written by hand, it's far more efficient
* to have them generated automatically. nih-dbus-tool will generate
* property getters that call C functions of appropriate names with an
* ordinary pointer argument matching the expected type that the function
* can place the property value into.
*
* Returns: zero on success, negative value if insufficient memory.
**/
typedef int (*NihDBusPropertyGetter) (NihDBusObject *object,
NihDBusMessage *message,
DBusMessageIter *iter);
/**
* NihDBusPropertySetter:
* @object: D-Bus object being handled,
* @message: information about property get message,
* @iter: iterator to obtain value from.
*
* A property setter function is called when a handling the D-Bus
* properties Set method, available as the @message parameter. The
* setter should obtain the new value from the variant pointed to by
* @iter and return either an empty reply message or an error message.
*
* Unlike method handlers, the Set method is implemented internally to
* libnih-dbus, with a reply being generated and sent as part of that
* handling. It's only necessary to take the property value from the
* variant and set it.
*
* While property setters can be written by hand, it's far more efficient
* to have them generated automatically. nih-dbus-tool will generate
* property getters that call C functions of appropriate names with an
* ordinary argument matching the expected type that the function
* can obtain the property value from.
*
* Returns: zero on success, negative value on raised error.
**/
typedef int (*NihDBusPropertySetter) (NihDBusObject *object,
NihDBusMessage *message,
DBusMessageIter *iter);
/**
* NihDBusArgDir:
*
* Whether an argument is for the method call (in) or method reply (out).
**/
typedef enum nih_dbus_arg_dir {
NIH_DBUS_ARG_IN,
NIH_DBUS_ARG_OUT
} NihDBusArgDir;
/**
* NihDBusArg:
* @type: D-Bus type signature,
* @name: name of argument,
* @dir: whether argument is for method call or reply.
*
* This structure defines an argument to a D-Bus method or signal and is used
* to provide introspection of that method.
*
* It's unusual to use this directly, instead methods are pre-defined as
* members of const arrays by nih-dbus-tool and referenced by the interfaces
* it also defines.
**/
typedef struct nih_dbus_arg {
const char * name;
const char * type;
NihDBusArgDir dir;
} NihDBusArg;
/**
* NihDBusMethod:
* @name: name of the method,
* @args: NULL-terminated array of arguments,
* @handler: handler function.
*
* This structure defines a method associated with a D-Bus interface.
*
* It's unusual to use this directly, instead methods are pre-defined as
* members of const arrays by nih-dbus-tool and referenced by the interfaces
* it also defines.
*
* When the method is invoked, the @handler function will be called and
* is expected to reply with a method return or error message. Method
* handler functions are also normally generated by nih-dbus-tool.
*
* @args is used to provide introspection of the method.
**/
typedef struct nih_dbus_method {
const char * name;
const NihDBusArg * args;
NihDBusMethodHandler handler;
} NihDBusMethod;
/**
* NihDBusSignal:
* @name: name of the signal,
* @args: NULL-terminated array of arguments,
* @filter: filter function.
*
* This structure defines a signal that can be emitted by a D-Bus interface
* and is used to provide introspection of that signal.
*
* It's unusual to use this directly, instead signals are pre-defined as
* const arrays by nih-dbus-tool and referenced by the interfaces it also
* defines.
*
* The signal itself is normally emitted by a function generated by
* nih-dbus-tool that accepts C arguments matching @args. The @filter
* function is intended to be hooked up to the D-Bus connection to
* handle the incoming signal.
**/
typedef struct nih_dbus_signal {
const char * name;
const NihDBusArg * args;
NihDBusSignalFilter filter;
} NihDBusSignal;
/**
* NihDBusAccess:
*
* Access restrictions for a property.
**/
typedef enum nih_dbus_access {
NIH_DBUS_READ,
NIH_DBUS_WRITE,
NIH_DBUS_READWRITE
} NihDBusAccess;
/**
* NihDBusProperty:
* @name: name of the property,
* @type: type signature of value,
* @access: access restrictions,
* @getter: getter function,
* @setter: setter function.
*
* This structure defines a property associated with a D-Bus interface.
*
* It's unusual to use this directly, instead properties are pre-defined as
* members of const arrays by nih-dbus-tool and referenced by the interfaces
* it also defines.
*
* When the D-Bus properties Get or GetAll methods are invoked, the
* @getter function will be called and is expected to add a variant to a
* message being generated. When the D-Bus properties Set method is invoked,
* the @setter function will be called and is expected to return an empty
* reply or an error. Both getter and setter functions are also normally
* generated by nih-dbus-tool.
*
* @access is used to provide introspection of the property.
**/
typedef struct nih_dbus_property {
const char * name;
const char * type;
NihDBusAccess access;
NihDBusPropertyGetter getter;
NihDBusPropertySetter setter;
} NihDBusProperty;
/**
* NihDBusInterface:
* @name: name of the interface,
* @methods: NULL-terminated array of methods,
* @signals: NULL-terminated array of signals,
* @properties: NULL-terminated array of properties.
*
* This structure defines an interface that may be implemented by a D-Bus
* object. It's unusual to use this in any form other than a const array
* for each type of object, and even then the individual members of that
* array are normally taken from macros defined by nih-dbus-tool that expand
* to interfaces it defines.
**/
typedef struct nih_dbus_interface {
const char * name;
const NihDBusMethod * methods;
const NihDBusSignal * signals;
const NihDBusProperty *properties;
} NihDBusInterface;
#endif /* NIH_DBUS_INTERFACE_H */