dbus-private.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. /*
  2. *
  3. * Embedded Linux library
  4. *
  5. * Copyright (C) 2011-2014 Intel Corporation. All rights reserved.
  6. *
  7. * This library is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * This library is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this library; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  20. *
  21. */
  22. #include <endian.h>
  23. enum dbus_message_type {
  24. DBUS_MESSAGE_TYPE_METHOD_CALL = 1,
  25. DBUS_MESSAGE_TYPE_METHOD_RETURN = 2,
  26. DBUS_MESSAGE_TYPE_ERROR = 3,
  27. DBUS_MESSAGE_TYPE_SIGNAL = 4,
  28. };
  29. enum dbus_container_type {
  30. DBUS_CONTAINER_TYPE_ARRAY = 'a',
  31. DBUS_CONTAINER_TYPE_STRUCT = 'r',
  32. DBUS_CONTAINER_TYPE_VARIANT = 'v',
  33. DBUS_CONTAINER_TYPE_DICT_ENTRY = 'e',
  34. };
  35. #if __BYTE_ORDER == __LITTLE_ENDIAN
  36. #define DBUS_NATIVE_ENDIAN 'l'
  37. #elif __BYTE_ORDER == __BIG_ENDIAN
  38. #define DBUS_NATIVE_ENDIAN 'B'
  39. #else
  40. #error "Unknown byte order"
  41. #endif
  42. struct dbus_header {
  43. uint8_t endian;
  44. uint8_t message_type;
  45. uint8_t flags;
  46. uint8_t version;
  47. union {
  48. struct {
  49. uint32_t body_length;
  50. uint32_t serial;
  51. uint32_t field_length;
  52. } __attribute__ ((packed)) dbus1;
  53. };
  54. } __attribute__ ((packed));
  55. #define DBUS_HEADER_SIZE 16
  56. struct dbus_builder;
  57. struct l_string;
  58. struct l_dbus_interface;
  59. struct _dbus_method;
  60. struct _dbus_signal;
  61. struct _dbus_property;
  62. struct l_dbus_message_iter;
  63. struct l_dbus_message;
  64. struct l_dbus;
  65. struct _dbus_filter;
  66. struct _dbus_filter_condition;
  67. struct _dbus_filter_ops;
  68. void _dbus1_iter_init(struct l_dbus_message_iter *iter,
  69. struct l_dbus_message *message,
  70. const char *sig_start, const char *sig_end,
  71. const void *data, size_t len);
  72. bool _dbus1_iter_next_entry_basic(struct l_dbus_message_iter *iter, char type,
  73. void *out);
  74. bool _dbus1_iter_get_fixed_array(struct l_dbus_message_iter *iter,
  75. void *out, uint32_t *n_elem);
  76. bool _dbus1_iter_enter_struct(struct l_dbus_message_iter *iter,
  77. struct l_dbus_message_iter *structure);
  78. bool _dbus1_iter_enter_variant(struct l_dbus_message_iter *iter,
  79. struct l_dbus_message_iter *variant);
  80. bool _dbus1_iter_enter_array(struct l_dbus_message_iter *iter,
  81. struct l_dbus_message_iter *array);
  82. bool _dbus1_iter_skip_entry(struct l_dbus_message_iter *iter);
  83. struct dbus_builder *_dbus1_builder_new(void *body, size_t body_size);
  84. void _dbus1_builder_free(struct dbus_builder *builder);
  85. bool _dbus1_builder_append_basic(struct dbus_builder *builder,
  86. char type, const void *value);
  87. bool _dbus1_builder_enter_struct(struct dbus_builder *builder,
  88. const char *signature);
  89. bool _dbus1_builder_leave_struct(struct dbus_builder *builder);
  90. bool _dbus1_builder_enter_dict(struct dbus_builder *builder,
  91. const char *signature);
  92. bool _dbus1_builder_leave_dict(struct dbus_builder *builder);
  93. bool _dbus1_builder_enter_variant(struct dbus_builder *builder,
  94. const char *signature);
  95. bool _dbus1_builder_leave_variant(struct dbus_builder *builder);
  96. bool _dbus1_builder_enter_array(struct dbus_builder *builder,
  97. const char *signature);
  98. bool _dbus1_builder_leave_array(struct dbus_builder *builder);
  99. char *_dbus1_builder_finish(struct dbus_builder *builder,
  100. void **body, size_t *body_size);
  101. bool _dbus1_builder_mark(struct dbus_builder *builder);
  102. bool _dbus1_builder_rewind(struct dbus_builder *builder);
  103. void *_dbus_message_get_body(struct l_dbus_message *msg, size_t *out_size);
  104. void *_dbus_message_get_header(struct l_dbus_message *msg, size_t *out_size);
  105. void *_dbus_message_get_footer(struct l_dbus_message *msg, size_t *out_size);
  106. int *_dbus_message_get_fds(struct l_dbus_message *msg, uint32_t *num_fds);
  107. void _dbus_message_set_serial(struct l_dbus_message *msg, uint32_t serial);
  108. uint32_t _dbus_message_get_serial(struct l_dbus_message *msg);
  109. uint32_t _dbus_message_get_reply_serial(struct l_dbus_message *message);
  110. void _dbus_message_set_sender(struct l_dbus_message *message,
  111. const char *sender);
  112. void _dbus_message_set_destination(struct l_dbus_message *message,
  113. const char *destination);
  114. enum dbus_message_type _dbus_message_get_type(struct l_dbus_message *message);
  115. const char * _dbus_message_get_type_as_string(struct l_dbus_message *message);
  116. uint8_t _dbus_message_get_version(struct l_dbus_message *message);
  117. uint8_t _dbus_message_get_endian(struct l_dbus_message *message);
  118. const char *_dbus_message_get_nth_string_argument(
  119. struct l_dbus_message *message, int n);
  120. struct l_dbus_message *_dbus_message_new_method_call(uint8_t version,
  121. const char *destination,
  122. const char *path,
  123. const char *interface,
  124. const char *method);
  125. struct l_dbus_message *_dbus_message_new_signal(uint8_t version,
  126. const char *path,
  127. const char *interface,
  128. const char *name);
  129. struct l_dbus_message *_dbus_message_new_error(uint8_t version,
  130. uint32_t reply_serial,
  131. const char *destination,
  132. const char *name,
  133. const char *error);
  134. struct l_dbus_message *dbus_message_from_blob(const void *data, size_t size,
  135. int fds[], uint32_t num_fds);
  136. struct l_dbus_message *dbus_message_build(void *header, size_t header_size,
  137. void *body, size_t body_size,
  138. int fds[], uint32_t num_fds);
  139. bool dbus_message_compare(struct l_dbus_message *message,
  140. const void *data, size_t size);
  141. bool _dbus_message_builder_mark(struct l_dbus_message_builder *builder);
  142. bool _dbus_message_builder_rewind(struct l_dbus_message_builder *builder);
  143. unsigned int _dbus_message_unix_fds_from_header(const void *data, size_t size);
  144. const char *_dbus_signature_end(const char *signature);
  145. bool _dbus_valid_object_path(const char *path);
  146. bool _dbus_valid_signature(const char *sig);
  147. int _dbus_num_children(const char *sig);
  148. bool _dbus_valid_interface(const char *interface);
  149. bool _dbus_valid_method(const char *method);
  150. bool _dbus_parse_unique_name(const char *name, uint64_t *out_id);
  151. bool _dbus_valid_bus_name(const char *bus_name);
  152. bool _dbus1_header_is_valid(void *data, size_t size);
  153. void _dbus_method_introspection(struct _dbus_method *info,
  154. struct l_string *buf);
  155. void _dbus_signal_introspection(struct _dbus_signal *info,
  156. struct l_string *buf);
  157. void _dbus_property_introspection(struct _dbus_property *info,
  158. struct l_string *buf);
  159. void _dbus_interface_introspection(struct l_dbus_interface *interface,
  160. struct l_string *buf);
  161. struct l_dbus_interface *_dbus_interface_new(const char *name);
  162. void _dbus_interface_free(struct l_dbus_interface *interface);
  163. struct _dbus_method *_dbus_interface_find_method(struct l_dbus_interface *i,
  164. const char *method);
  165. struct _dbus_signal *_dbus_interface_find_signal(struct l_dbus_interface *i,
  166. const char *signal);
  167. struct _dbus_property *_dbus_interface_find_property(struct l_dbus_interface *i,
  168. const char *property);
  169. struct _dbus_object_tree *_dbus_object_tree_new(void);
  170. void _dbus_object_tree_free(struct _dbus_object_tree *tree);
  171. struct object_node *_dbus_object_tree_makepath(struct _dbus_object_tree *tree,
  172. const char *path);
  173. struct object_node *_dbus_object_tree_lookup(struct _dbus_object_tree *tree,
  174. const char *path);
  175. void _dbus_object_tree_prune_node(struct object_node *node);
  176. struct object_node *_dbus_object_tree_new_object(struct _dbus_object_tree *tree,
  177. const char *path,
  178. void *user_data,
  179. void (*destroy) (void *));
  180. bool _dbus_object_tree_object_destroy(struct _dbus_object_tree *tree,
  181. const char *path);
  182. bool _dbus_object_tree_register_interface(struct _dbus_object_tree *tree,
  183. const char *interface,
  184. void (*setup_func)(struct l_dbus_interface *),
  185. void (*destroy) (void *),
  186. bool old_style_properties);
  187. bool _dbus_object_tree_unregister_interface(struct _dbus_object_tree *tree,
  188. const char *interface);
  189. bool _dbus_object_tree_add_interface(struct _dbus_object_tree *tree,
  190. const char *path, const char *interface,
  191. void *user_data);
  192. bool _dbus_object_tree_remove_interface(struct _dbus_object_tree *tree,
  193. const char *path,
  194. const char *interface);
  195. void *_dbus_object_tree_get_interface_data(struct _dbus_object_tree *tree,
  196. const char *path,
  197. const char *interface);
  198. void _dbus_object_tree_introspect(struct _dbus_object_tree *tree,
  199. const char *path, struct l_string *buf);
  200. bool _dbus_object_tree_dispatch(struct _dbus_object_tree *tree,
  201. struct l_dbus *dbus,
  202. struct l_dbus_message *message);
  203. struct l_dbus_message *_dbus_object_tree_get_objects(
  204. struct _dbus_object_tree *tree,
  205. struct l_dbus *dbus,
  206. const char *path,
  207. struct l_dbus_message *message);
  208. bool _dbus_object_tree_property_changed(struct l_dbus *dbus,
  209. const char *path,
  210. const char *interface_name,
  211. const char *property_name);
  212. void _dbus_object_tree_signals_flush(struct l_dbus *dbus, const char *path);
  213. typedef void (*_dbus_name_owner_change_func_t)(const char *name,
  214. uint64_t old_owner,
  215. uint64_t new_owner,
  216. void *user_data);
  217. uint8_t _dbus_get_version(struct l_dbus *dbus);
  218. int _dbus_get_fd(struct l_dbus *dbus);
  219. struct _dbus_object_tree *_dbus_get_tree(struct l_dbus *dbus);
  220. struct _dbus_name_ops {
  221. bool (*get_name_owner)(struct l_dbus *bus, const char *name);
  222. };
  223. struct _dbus_name_cache;
  224. struct _dbus_name_cache *_dbus_name_cache_new(struct l_dbus *bus,
  225. const struct _dbus_name_ops *driver);
  226. void _dbus_name_cache_free(struct _dbus_name_cache *cache);
  227. bool _dbus_name_cache_add(struct _dbus_name_cache *cache, const char *name);
  228. bool _dbus_name_cache_remove(struct _dbus_name_cache *cache, const char *name);
  229. const char *_dbus_name_cache_lookup(struct _dbus_name_cache *cache,
  230. const char *name);
  231. void _dbus_name_cache_notify(struct _dbus_name_cache *cache,
  232. const char *name, const char *owner);
  233. unsigned int _dbus_name_cache_add_watch(struct _dbus_name_cache *cache,
  234. const char *name,
  235. l_dbus_watch_func_t connect_func,
  236. l_dbus_watch_func_t disconnect_func,
  237. void *user_data,
  238. l_dbus_destroy_func_t destroy);
  239. bool _dbus_name_cache_remove_watch(struct _dbus_name_cache *cache,
  240. unsigned int id);
  241. struct _dbus_filter_condition {
  242. enum l_dbus_match_type type;
  243. const char *value;
  244. };
  245. struct _dbus_filter_ops {
  246. bool skip_register;
  247. bool (*add_match)(struct l_dbus *bus, unsigned int id,
  248. const struct _dbus_filter_condition *rule,
  249. int rule_len);
  250. bool (*remove_match)(struct l_dbus *bus, unsigned int id);
  251. };
  252. struct _dbus_filter *_dbus_filter_new(struct l_dbus *dbus,
  253. const struct _dbus_filter_ops *driver,
  254. struct _dbus_name_cache *name_cache);
  255. void _dbus_filter_free(struct _dbus_filter *filter);
  256. unsigned int _dbus_filter_add_rule(struct _dbus_filter *filter,
  257. const struct _dbus_filter_condition *rule,
  258. int rule_len,
  259. l_dbus_message_func_t signal_func,
  260. void *user_data);
  261. bool _dbus_filter_remove_rule(struct _dbus_filter *filter, unsigned int id);
  262. char *_dbus_filter_rule_to_str(const struct _dbus_filter_condition *rule,
  263. int rule_len);
  264. void _dbus_filter_dispatch(struct l_dbus_message *message, void *user_data);