jackdbus/dbus/jackdbus.h

326 lines
12 KiB
C

/* -*- Mode: C ; c-basic-offset: 4 -*- */
/*
Copyright (C) 2007,2008 Nedko Arnaudov
Copyright (C) 2007-2008 Juuso Alasuutari
Copyright (C) 2008 Marc-Olivier Barre
This program 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 2 of the License.
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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED
#define DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED
#include <stdbool.h>
#define JACK_DBUS_DEBUG
//#define DISABLE_SIGNAL_MAGIC
#define DEFAULT_XDG_CONFIG "/.config"
#define DEFAULT_XDG_LOG "/.log"
#define JACKDBUS_DIR "/jack"
#define JACKDBUS_LOG "/jackdbus.log"
#define JACKDBUS_CONF "/conf.xml"
extern char *g_jackdbus_config_dir;
extern size_t g_jackdbus_config_dir_len; /* without terminating '\0' char */
extern int g_exit_command;
bool
jack_controller_settings_init(void);
void
jack_controller_settings_uninit(void);
#define JACK_DBUS_ERROR_UNKNOWN_METHOD "org.jackaudio.Error.UnknownMethod"
#define JACK_DBUS_ERROR_SERVER_NOT_RUNNING "org.jackaudio.Error.ServerNotRunning"
#define JACK_DBUS_ERROR_SERVER_RUNNING "org.jackaudio.Error.ServerRunning"
#define JACK_DBUS_ERROR_UNKNOWN_DRIVER "org.jackaudio.Error.UnknownDriver"
#define JACK_DBUS_ERROR_UNKNOWN_INTERNAL "org.jackaudio.Error.UnknownInternal"
#define JACK_DBUS_ERROR_UNKNOWN_PARAMETER "org.jackaudio.Error.UnknownParameter"
#define JACK_DBUS_ERROR_INVALID_ARGS "org.jackaudio.Error.InvalidArgs"
#define JACK_DBUS_ERROR_GENERIC "org.jackaudio.Error.Generic"
#define JACK_DBUS_ERROR_FATAL "org.jackaudio.Error.Fatal"
struct jack_dbus_method_call
{
void *context;
DBusConnection *connection;
const char *method_name;
DBusMessage *message;
DBusMessage *reply;
};
struct jack_dbus_interface_method_argument_descriptor
{
const char * name;
const char * type;
bool direction_out; /* true - out, false - in */
};
struct jack_dbus_interface_method_descriptor
{
const char * name;
const struct jack_dbus_interface_method_argument_descriptor * arguments;
void (* handler)(struct jack_dbus_method_call * call);
};
struct jack_dbus_interface_signal_argument_descriptor
{
const char * name;
const char * type;
};
struct jack_dbus_interface_signal_descriptor
{
const char * name;
const struct jack_dbus_interface_signal_argument_descriptor * arguments;
};
struct jack_dbus_interface_descriptor
{
const char * name;
bool
(* handler)(
struct jack_dbus_method_call * call,
const struct jack_dbus_interface_method_descriptor * methods);
const struct jack_dbus_interface_method_descriptor * methods;
const struct jack_dbus_interface_signal_descriptor * signals;
};
struct jack_dbus_object_descriptor
{
struct jack_dbus_interface_descriptor ** interfaces;
void * context;
};
typedef union
{
unsigned char byte;
dbus_bool_t boolean;
dbus_int16_t int16;
dbus_uint16_t uint16;
dbus_int32_t int32;
dbus_uint32_t uint32;
dbus_int64_t int64;
dbus_uint64_t uint64;
double doubl;
const char *string;
} message_arg_t;
#define JACK_DBUS_METHOD_ARGUMENTS_BEGIN(method_name) \
static const \
struct jack_dbus_interface_method_argument_descriptor method_name ## _arguments[] = \
{
#define JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(method_name, descr) \
static const \
struct jack_dbus_interface_method_argument_descriptor method_name ## _arguments[] = \
{
#define JACK_DBUS_METHOD_ARGUMENT(argument_name, argument_type, argument_direction_out) \
{ \
.name = argument_name, \
.type = argument_type, \
.direction_out = argument_direction_out \
},
#define JACK_DBUS_METHOD_ARGUMENT_IN(argument_name, argument_type, descr) \
{ \
.name = argument_name, \
.type = argument_type, \
.direction_out = false \
},
#define JACK_DBUS_METHOD_ARGUMENT_OUT(argument_name, argument_type, descr) \
{ \
.name = argument_name, \
.type = argument_type, \
.direction_out = true \
},
#define JACK_DBUS_METHOD_ARGUMENT(argument_name, argument_type, argument_direction_out) \
{ \
.name = argument_name, \
.type = argument_type, \
.direction_out = argument_direction_out \
},
#define JACK_DBUS_METHOD_ARGUMENTS_END \
JACK_DBUS_METHOD_ARGUMENT(NULL, NULL, false) \
};
#define JACK_DBUS_METHODS_BEGIN \
static const \
struct jack_dbus_interface_method_descriptor methods_dtor[] = \
{
#define JACK_DBUS_METHOD_DESCRIBE(method_name, handler_name) \
{ \
.name = # method_name, \
.arguments = method_name ## _arguments, \
.handler = handler_name \
},
#define JACK_DBUS_METHODS_END \
{ \
.name = NULL, \
.arguments = NULL, \
.handler = NULL \
} \
};
#define JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(signal_name) \
static const \
struct jack_dbus_interface_signal_argument_descriptor signal_name ## _arguments[] = \
{
#define JACK_DBUS_SIGNAL_ARGUMENT(argument_name, argument_type) \
{ \
.name = argument_name, \
.type = argument_type \
},
#define JACK_DBUS_SIGNAL_ARGUMENTS_END \
JACK_DBUS_SIGNAL_ARGUMENT(NULL, NULL) \
};
#define JACK_DBUS_SIGNALS_BEGIN \
static const \
struct jack_dbus_interface_signal_descriptor signals_dtor[] = \
{
#define JACK_DBUS_SIGNAL_DESCRIBE(signal_name) \
{ \
.name = # signal_name, \
.arguments = signal_name ## _arguments \
},
#define JACK_DBUS_SIGNALS_END \
{ \
.name = NULL, \
.arguments = NULL, \
} \
};
#define JACK_DBUS_IFACE_BEGIN(iface_var, iface_name) \
struct jack_dbus_interface_descriptor iface_var = \
{ \
.name = iface_name, \
.handler = jack_dbus_run_method,
#define JACK_DBUS_IFACE_HANDLER(handler_func) \
.handler = handler_func,
#define JACK_DBUS_IFACE_EXPOSE_METHODS \
.methods = methods_dtor,
#define JACK_DBUS_IFACE_EXPOSE_SIGNALS \
.signals = signals_dtor,
#define JACK_DBUS_IFACE_END \
};
DBusHandlerResult
jack_dbus_message_handler(
DBusConnection *connection,
DBusMessage *message,
void *data);
void
jack_dbus_message_handler_unregister(
DBusConnection *connection,
void *data);
bool
jack_dbus_run_method(
struct jack_dbus_method_call * call,
const struct jack_dbus_interface_method_descriptor * methods);
void
jack_dbus_error(
void *dbus_call_context_ptr,
const char *error_name,
const char *format,
...);
void
jack_dbus_only_error(
void *dbus_call_context_ptr,
const char *error_name,
const char *format,
...);
bool
jack_dbus_get_method_args(
struct jack_dbus_method_call *call,
int type,
...);
bool
jack_dbus_get_method_args_string_and_variant(
struct jack_dbus_method_call *call,
const char **arg1,
message_arg_t *arg2,
int *type_ptr);
bool
jack_dbus_get_method_args_two_strings_and_variant(
struct jack_dbus_method_call *call,
const char **arg1,
const char **arg2,
message_arg_t *arg3,
int *type_ptr);
bool
jack_dbus_message_append_variant(
DBusMessageIter *iter,
int type,
const char *signature,
message_arg_t *arg);
void
jack_dbus_construct_method_return_empty(
struct jack_dbus_method_call * call);
void
jack_dbus_construct_method_return_single(
struct jack_dbus_method_call *call,
int type,
message_arg_t arg);
void
jack_dbus_construct_method_return_array_of_strings(
struct jack_dbus_method_call *call,
unsigned int num_members,
const char **array);
void
jack_dbus_send_signal(
const char *sender_object_path,
const char *iface,
const char *signal_name,
int first_arg_type,
...);
#define JACK_CONTROLLER_OBJECT_PATH "/org/jackaudio/Controller"
extern struct jack_dbus_interface_descriptor * g_jackcontroller_interfaces[];
extern DBusConnection * g_connection;
#endif /* #ifndef DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED */