jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

325 lines
12KB

  1. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  2. /*
  3. Copyright (C) 2007,2008 Nedko Arnaudov
  4. Copyright (C) 2007-2008 Juuso Alasuutari
  5. Copyright (C) 2008 Marc-Olivier Barre
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. */
  17. #ifndef DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED
  18. #define DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED
  19. #include <stdbool.h>
  20. #define JACK_DBUS_DEBUG
  21. //#define DISABLE_SIGNAL_MAGIC
  22. #define DEFAULT_XDG_CONFIG "/.config"
  23. #define DEFAULT_XDG_LOG "/.log"
  24. #define JACKDBUS_DIR "/jack"
  25. #define JACKDBUS_LOG "/jackdbus.log"
  26. #define JACKDBUS_CONF "/conf.xml"
  27. extern char *g_jackdbus_config_dir;
  28. extern size_t g_jackdbus_config_dir_len; /* without terminating '\0' char */
  29. extern int g_exit_command;
  30. bool
  31. jack_controller_settings_init();
  32. void
  33. jack_controller_settings_uninit();
  34. #define JACK_DBUS_ERROR_UNKNOWN_METHOD "org.jackaudio.Error.UnknownMethod"
  35. #define JACK_DBUS_ERROR_SERVER_NOT_RUNNING "org.jackaudio.Error.ServerNotRunning"
  36. #define JACK_DBUS_ERROR_UNKNOWN_DRIVER "org.jackaudio.Error.UnknownDriver"
  37. #define JACK_DBUS_ERROR_UNKNOWN_INTERNAL "org.jackaudio.Error.UnknownInternal"
  38. #define JACK_DBUS_ERROR_UNKNOWN_PARAMETER "org.jackaudio.Error.UnknownParameter"
  39. #define JACK_DBUS_ERROR_INVALID_ARGS "org.jackaudio.Error.InvalidArgs"
  40. #define JACK_DBUS_ERROR_GENERIC "org.jackaudio.Error.Generic"
  41. #define JACK_DBUS_ERROR_FATAL "org.jackaudio.Error.Fatal"
  42. struct jack_dbus_method_call
  43. {
  44. void *context;
  45. DBusConnection *connection;
  46. const char *method_name;
  47. DBusMessage *message;
  48. DBusMessage *reply;
  49. };
  50. struct jack_dbus_interface_method_argument_descriptor
  51. {
  52. const char * name;
  53. const char * type;
  54. bool direction_out; /* true - out, false - in */
  55. };
  56. struct jack_dbus_interface_method_descriptor
  57. {
  58. const char * name;
  59. const struct jack_dbus_interface_method_argument_descriptor * arguments;
  60. void (* handler)(struct jack_dbus_method_call * call);
  61. };
  62. struct jack_dbus_interface_signal_argument_descriptor
  63. {
  64. const char * name;
  65. const char * type;
  66. };
  67. struct jack_dbus_interface_signal_descriptor
  68. {
  69. const char * name;
  70. const struct jack_dbus_interface_signal_argument_descriptor * arguments;
  71. };
  72. struct jack_dbus_interface_descriptor
  73. {
  74. const char * name;
  75. bool
  76. (* handler)(
  77. struct jack_dbus_method_call * call,
  78. const struct jack_dbus_interface_method_descriptor * methods);
  79. const struct jack_dbus_interface_method_descriptor * methods;
  80. const struct jack_dbus_interface_signal_descriptor * signals;
  81. };
  82. struct jack_dbus_object_descriptor
  83. {
  84. struct jack_dbus_interface_descriptor ** interfaces;
  85. void * context;
  86. };
  87. typedef union
  88. {
  89. unsigned char byte;
  90. dbus_bool_t boolean;
  91. dbus_int16_t int16;
  92. dbus_uint16_t uint16;
  93. dbus_int32_t int32;
  94. dbus_uint32_t uint32;
  95. dbus_int64_t int64;
  96. dbus_uint64_t uint64;
  97. double doubl;
  98. const char *string;
  99. } message_arg_t;
  100. #define JACK_DBUS_METHOD_ARGUMENTS_BEGIN(method_name) \
  101. static const \
  102. struct jack_dbus_interface_method_argument_descriptor method_name ## _arguments[] = \
  103. {
  104. #define JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(method_name, descr) \
  105. static const \
  106. struct jack_dbus_interface_method_argument_descriptor method_name ## _arguments[] = \
  107. {
  108. #define JACK_DBUS_METHOD_ARGUMENT(argument_name, argument_type, argument_direction_out) \
  109. { \
  110. .name = argument_name, \
  111. .type = argument_type, \
  112. .direction_out = argument_direction_out \
  113. },
  114. #define JACK_DBUS_METHOD_ARGUMENT_IN(argument_name, argument_type, descr) \
  115. { \
  116. .name = argument_name, \
  117. .type = argument_type, \
  118. .direction_out = false \
  119. },
  120. #define JACK_DBUS_METHOD_ARGUMENT_OUT(argument_name, argument_type, descr) \
  121. { \
  122. .name = argument_name, \
  123. .type = argument_type, \
  124. .direction_out = true \
  125. },
  126. #define JACK_DBUS_METHOD_ARGUMENT(argument_name, argument_type, argument_direction_out) \
  127. { \
  128. .name = argument_name, \
  129. .type = argument_type, \
  130. .direction_out = argument_direction_out \
  131. },
  132. #define JACK_DBUS_METHOD_ARGUMENTS_END \
  133. JACK_DBUS_METHOD_ARGUMENT(NULL, NULL, false) \
  134. };
  135. #define JACK_DBUS_METHODS_BEGIN \
  136. static const \
  137. struct jack_dbus_interface_method_descriptor methods_dtor[] = \
  138. {
  139. #define JACK_DBUS_METHOD_DESCRIBE(method_name, handler_name) \
  140. { \
  141. .name = # method_name, \
  142. .arguments = method_name ## _arguments, \
  143. .handler = handler_name \
  144. },
  145. #define JACK_DBUS_METHODS_END \
  146. { \
  147. .name = NULL, \
  148. .arguments = NULL, \
  149. .handler = NULL \
  150. } \
  151. };
  152. #define JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(signal_name) \
  153. static const \
  154. struct jack_dbus_interface_signal_argument_descriptor signal_name ## _arguments[] = \
  155. {
  156. #define JACK_DBUS_SIGNAL_ARGUMENT(argument_name, argument_type) \
  157. { \
  158. .name = argument_name, \
  159. .type = argument_type \
  160. },
  161. #define JACK_DBUS_SIGNAL_ARGUMENTS_END \
  162. JACK_DBUS_SIGNAL_ARGUMENT(NULL, NULL) \
  163. };
  164. #define JACK_DBUS_SIGNALS_BEGIN \
  165. static const \
  166. struct jack_dbus_interface_signal_descriptor signals_dtor[] = \
  167. {
  168. #define JACK_DBUS_SIGNAL_DESCRIBE(signal_name) \
  169. { \
  170. .name = # signal_name, \
  171. .arguments = signal_name ## _arguments \
  172. },
  173. #define JACK_DBUS_SIGNALS_END \
  174. { \
  175. .name = NULL, \
  176. .arguments = NULL, \
  177. } \
  178. };
  179. #define JACK_DBUS_IFACE_BEGIN(iface_var, iface_name) \
  180. struct jack_dbus_interface_descriptor iface_var = \
  181. { \
  182. .name = iface_name, \
  183. .handler = jack_dbus_run_method,
  184. #define JACK_DBUS_IFACE_HANDLER(handler_func) \
  185. .handler = handler_func,
  186. #define JACK_DBUS_IFACE_EXPOSE_METHODS \
  187. .methods = methods_dtor,
  188. #define JACK_DBUS_IFACE_EXPOSE_SIGNALS \
  189. .signals = signals_dtor,
  190. #define JACK_DBUS_IFACE_END \
  191. };
  192. DBusHandlerResult
  193. jack_dbus_message_handler(
  194. DBusConnection *connection,
  195. DBusMessage *message,
  196. void *data);
  197. void
  198. jack_dbus_message_handler_unregister(
  199. DBusConnection *connection,
  200. void *data);
  201. bool
  202. jack_dbus_run_method(
  203. struct jack_dbus_method_call * call,
  204. const struct jack_dbus_interface_method_descriptor * methods);
  205. void
  206. jack_dbus_error(
  207. void *dbus_call_context_ptr,
  208. const char *error_name,
  209. const char *format,
  210. ...);
  211. void
  212. jack_dbus_only_error(
  213. void *dbus_call_context_ptr,
  214. const char *error_name,
  215. const char *format,
  216. ...);
  217. bool
  218. jack_dbus_get_method_args(
  219. struct jack_dbus_method_call *call,
  220. int type,
  221. ...);
  222. bool
  223. jack_dbus_get_method_args_string_and_variant(
  224. struct jack_dbus_method_call *call,
  225. const char **arg1,
  226. message_arg_t *arg2,
  227. int *type_ptr);
  228. bool
  229. jack_dbus_get_method_args_two_strings_and_variant(
  230. struct jack_dbus_method_call *call,
  231. const char **arg1,
  232. const char **arg2,
  233. message_arg_t *arg3,
  234. int *type_ptr);
  235. bool
  236. jack_dbus_message_append_variant(
  237. DBusMessageIter *iter,
  238. int type,
  239. const char *signature,
  240. message_arg_t *arg);
  241. void
  242. jack_dbus_construct_method_return_empty(
  243. struct jack_dbus_method_call * call);
  244. void
  245. jack_dbus_construct_method_return_single(
  246. struct jack_dbus_method_call *call,
  247. int type,
  248. message_arg_t arg);
  249. void
  250. jack_dbus_construct_method_return_array_of_strings(
  251. struct jack_dbus_method_call *call,
  252. unsigned int num_members,
  253. const char **array);
  254. void
  255. jack_dbus_send_signal(
  256. const char *sender_object_path,
  257. const char *iface,
  258. const char *signal_name,
  259. int first_arg_type,
  260. ...);
  261. #define JACK_CONTROLLER_OBJECT_PATH "/org/jackaudio/Controller"
  262. extern struct jack_dbus_interface_descriptor * g_jackcontroller_interfaces[];
  263. extern DBusConnection * g_connection;
  264. #endif /* #ifndef DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED */