blob: 5d50408a060c285b65303ce61efa6d249e5d9024 [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_PROXY_H
#define NIH_DBUS_PROXY_H
#include <nih/macros.h>
#include <limits.h>
#include <dbus/dbus.h>
#include <nih-dbus/dbus_interface.h>
/**
* NIH_DBUS_TIMEOUT_DEFAULT:
*
* This macro expands to the timeout value used by D-Bus to mean the
* default timeout (25s).
**/
#define NIH_DBUS_TIMEOUT_DEFAULT -1
/**
* NIH_DBUS_TIMEOUT_NEVER:
*
* This macro expands to the timeout value used by D-Bus to mean that
* the call should never timeout.
**/
#define NIH_DBUS_TIMEOUT_NEVER INT_MAX
/**
* NihDBusLostHandler:
* @data: data pointer passed to nih_dbus_proxy_new(),
* @proxy: proxy object.
*
* The D-Bus Lost Handler function is called when a proxied remote object
* is no longer available, due to the owner of the name being changed or
* leaving the bus.
*
* A common activity is to free the proxy.
**/
typedef void (*NihDBusLostHandler) (void *data, NihDBusProxy *proxy);
/**
* NihDBusSignalHandler:
* @data: data pointer passed to nih_dbus_proxy_new(),
* @message: NihDBusMessage context for signal arguments.
*
* A D-Bus Signal Handler is called when the expected signal is emitted
* and caught by the signal filter function, generally they will be called
* with additional arguments representing the demarshalled data from the
* signal itself.
**/
typedef void (*NihDBusSignalHandler) (void *data, NihDBusMessage *message,
...);
/**
* NihDBusProxy:
* @connection: associated connection,
* @name: D-Bus name of object owner,
* @owner: actual unique D-Bus owner,
* @path: path of object,
* @auto_start: whether method calls should auto-start the service,
* @lost_handler: handler to call when the proxied object is lost,
* @data: data to pass to handler functions.
*
* Proxy objects represent a remote D-Bus object accessible over the bus.
* The primary purpose of this object is to combine the three elements
* of data that uniquely identify that remote object: the connection,
* the bus name (either well known or unique) and the path.
*
* @name may be NULL for peer-to-peer D-Bus connections.
*
* @auto_start is an advisory flag for method calls only, it is used by
* nih-dbus-tool generated method calls.
*
* Proxies are not generally bound to the life-time of the connection or
* the remote object, thus there may be periods when functions will fail
* or signal filter functions left dormant due to unavailability of the
* remote object or even cease permanently when the bus connection is
* disconnected.
*
* Passing a @lost_handler function means that @name will be tracked on
* the bus. Should the owner of @name change @lost_handler will be called
* to allow clean-up of the proxy.
**/
struct nih_dbus_proxy {
DBusConnection * connection;
char * name;
char * owner;
char * path;
int auto_start;
NihDBusLostHandler lost_handler;
void * data;
};
/**
* NihDBusProxySignal:
* @proxy: proxy structure,
* @interface: signal interface definition,
* @signal: signal definition,
* @handler: signal handler function,
* @data: data to pass to @handler function.
*
* This structure represents a connected signal handler @handler which
* should be run when a matching signal @signal on interface @interface
* is emitted by a proxied object @proxied.
*
* @name may be NULL for peer-to-peer D-Bus connections.
*
* Proxied signals are bound to the life cycle of @proxy.
**/
struct nih_dbus_proxy_signal {
NihDBusProxy * proxy;
const NihDBusInterface *interface;
const NihDBusSignal * signal;
NihDBusSignalHandler handler;
void * data;
};
NIH_BEGIN_EXTERN
NihDBusProxy * nih_dbus_proxy_new (const void *parent,
DBusConnection *connection,
const char *name, const char *path,
NihDBusLostHandler lost_handler,
void *data)
__attribute__ ((warn_unused_result, malloc));
NihDBusProxySignal *nih_dbus_proxy_connect (NihDBusProxy *proxy,
const NihDBusInterface *interface,
const char *name,
NihDBusSignalHandler handler,
void *data)
__attribute__ ((warn_unused_result, malloc));
NIH_END_EXTERN
#endif /* NIH_DBUS_PROXY_H */