T-Box Basic dev
Loading...
Searching...
No Matches
dbus.h
Go to the documentation of this file.
1
10
11#ifndef __TBOX_DBUS_H__
12#define __TBOX_DBUS_H__
13
14#include <dbus/dbus.h>
15#include <pthread.h>
16#include <stdbool.h>
17#include <stdint.h>
18
19#include <tbox/error.h>
20#include <tbox/log.h>
21
22#ifdef __cplusplus
23extern "C"
24{
25#endif
26
32
34#define TBOX_DBUS_METHOD_RETURN_TIMEOUT_SEC 2U
35
39typedef enum
40{
41 TBOX_DBUS_TYPE_STRING = DBUS_TYPE_STRING,
42 TBOX_DBUS_TYPE_UINT32 = DBUS_TYPE_UINT32,
43 TBOX_DBUS_TYPE_INT32 = DBUS_TYPE_INT32,
44 TBOX_DBUS_TYPE_UINT16 = DBUS_TYPE_UINT16,
45 TBOX_DBUS_TYPE_INT16 = DBUS_TYPE_INT16,
46 TBOX_DBUS_TYPE_UINT8 = DBUS_TYPE_BYTE,
47 TBOX_DBUS_TYPE_BOOL = DBUS_TYPE_BOOLEAN,
48 TBOX_DBUS_TYPE_ARRAY = DBUS_TYPE_ARRAY,
49 TBOX_DBUS_TYPE_INVALID = DBUS_TYPE_INVALID,
51
55typedef struct
56{
59 uint32_t array_len;
60 union
61 {
62 uint32_t u32;
63 int32_t i32;
64 uint16_t u16;
65 int16_t i16;
66 uint8_t u8;
67 bool b;
68 char* str;
69 void* array;
70 } type_info;
72
79typedef void (*tbox_dbus_handler_t)(tbox_dbus_param_t* msg_param, tbox_dbus_param_t* return_param);
80
84typedef struct
85{
86 const char* module;
87 const char* action;
90
94typedef struct
95{
96 bool is_signal;
97 const char* dest;
98 const char* module;
99 const char* action;
102
106typedef struct
107{
108 const char* module;
109 const char* action;
112
119int tbox_dbus_connect(const char* app_name);
120
127
134
142int tbox_dbus_set_message(DBusMessageIter* iter, const tbox_dbus_param_t* param);
143
152int tbox_dbus_send_message_begin(const tbox_dbus_send_info_t* send_info, DBusMessage** msg, DBusMessageIter* iter);
153
163int tbox_dbus_send_message_end(bool is_signal, DBusMessage* msg, tbox_dbus_param_t* return_param, int32_t timeout);
164
174int tbox_dbus_get_message_begin(DBusMessageIter* iter, DBusMessage** msg, tbox_dbus_recv_info_t* recv_info,
175 int32_t timeout);
176
183bool tbox_dbus_check_next_message(DBusMessageIter* iter);
184
192int tbox_dbus_get_message(DBusMessageIter* iter, tbox_dbus_param_t* param);
193
201int tbox_dbus_get_message_end(DBusMessage* msg, tbox_dbus_param_t* return_param);
202
211int tbox_dbus_send_message(const tbox_dbus_send_info_t* send_info, tbox_dbus_param_t* return_param, int32_t timeout);
212
219int tbox_dbus_set_receive_match(const char* filter);
220
227int tbox_dbus_delete_receive_match(const char* filter);
228
235
241void tbox_dbus_free_message(DBusMessage* msg);
242
252bool tbox_dbus_check_message_match(DBusMessage* msg, bool is_signal, const char* module, const char* action);
253
262int tbox_dbus_send_signal(const char* module, const char* action, tbox_dbus_param_t* param);
263
274int tbox_dbus_call_set(const char* dest, const char* module, const char* action, tbox_dbus_param_t* param,
275 uint32_t timeout);
276
287int tbox_dbus_call_get(const char* dest, const char* module, const char* action, tbox_dbus_param_t* return_param,
288 uint32_t timeout);
289
298void tbox_dbus_send_no_reply(const char* dest, const char* module, const char* action, tbox_dbus_param_t* param);
299
311int tbox_dbus_recv_no_reply(const char* need_module, int32_t timeout, bool need_signal, tbox_dbus_param_t* msg_param,
312 char* recv_action, uint32_t recv_action_len);
313
321void tbox_dbus_handle_message(const tbox_dbus_handle_map_t* handle_map, const char* need_module, int32_t timeout);
322
340#define DBUS_CHECK_OR_RESULT_WITH_ERROR(tag, expr, result, message, error) \
341 do \
342 { \
343 if (!(expr)) \
344 { \
345 TBOX_LOGE(tag, message ", check failed: %s in %s at %d", #expr, __FILE__, __LINE__); \
346 (result)->type = TBOX_DBUS_TYPE_INT32; \
347 (result)->type_info.i32 = (error); \
348 return; \
349 } \
350 } while (0)
351
368#define DBUS_CHECK_RET_OR_RESULT_WITH_MESSAGE(tag, ret, result, message) \
369 DBUS_CHECK_OR_RESULT_WITH_ERROR(tag, TBOX_OK == (ret), result, message, (ret))
370
388#define DBUS_CHECK_TYPE_OR_RESULT_WITH_MESSAGE(tag, etype, param, result, message) \
389 do \
390 { \
391 if ((etype) != (param)->type) \
392 { \
393 TBOX_LOGE(tag, message ", wrong type(%c), expected(%c)", (param)->type, (etype)); \
394 (result)->type = TBOX_DBUS_TYPE_INT32; \
395 (result)->type_info.i32 = DBUS_ERROR_REMOTE_WRONG_TYPE; \
396 return; \
397 } \
398 } while (0)
399
419#define DBUS_CHECK_TYPE_OR_RETURN_WITH_ERROR(tag, etype, param, message, error) \
420 do \
421 { \
422 if ((etype) != (param)->type) \
423 { \
424 TBOX_LOGE(tag, message ", wrong type(%c), expected(%c)", (param)->type, (etype)); \
425 if (TBOX_DBUS_TYPE_STRING == (param)->type) \
426 { \
427 TBOX_LOGE(tag, "error message: %s", (param)->type_info.str); \
428 tbox_dbus_free_param(param); \
429 } \
430 if (TBOX_DBUS_TYPE_ARRAY == (param)->type) \
431 { \
432 tbox_dbus_free_param(param); \
433 } \
434 return (error); \
435 } \
436 } while (0)
437
441
442#ifdef __cplusplus
443}
444#endif
445
446#endif /* __TBOX_DBUS_H__ */
T-Box 错误码定义
int tbox_dbus_get_message(DBusMessageIter *iter, tbox_dbus_param_t *param)
从消息迭代器读取一个参数
void tbox_dbus_handle_message(const tbox_dbus_handle_map_t *handle_map, const char *need_module, int32_t timeout)
根据映射表分发并处理接收到的 D-Bus 消息
bool tbox_dbus_check_message_match(DBusMessage *msg, bool is_signal, const char *module, const char *action)
检查消息是否匹配指定模块和动作
tbox_dbus_type_t
D-Bus 参数类型
Definition dbus.h:40
int tbox_dbus_recv_no_reply(const char *need_module, int32_t timeout, bool need_signal, tbox_dbus_param_t *msg_param, char *recv_action, uint32_t recv_action_len)
接收无需回复的 D-Bus 消息
int tbox_dbus_call_set(const char *dest, const char *module, const char *action, tbox_dbus_param_t *param, uint32_t timeout)
通过 D-Bus 方法调用执行 set 操作
int tbox_dbus_send_signal(const char *module, const char *action, tbox_dbus_param_t *param)
发送 D-Bus 信号
int tbox_dbus_send_message_end(bool is_signal, DBusMessage *msg, tbox_dbus_param_t *return_param, int32_t timeout)
完成 D-Bus 消息发送并等待回复
int tbox_dbus_set_message(DBusMessageIter *iter, const tbox_dbus_param_t *param)
向消息迭代器写入一个参数
int tbox_dbus_get_message_begin(DBusMessageIter *iter, DBusMessage **msg, tbox_dbus_recv_info_t *recv_info, int32_t timeout)
开始接收 D-Bus 消息(首参数)
int tbox_dbus_call_get(const char *dest, const char *module, const char *action, tbox_dbus_param_t *return_param, uint32_t timeout)
通过 D-Bus 方法调用执行 get 操作
int tbox_dbus_send_message_begin(const tbox_dbus_send_info_t *send_info, DBusMessage **msg, DBusMessageIter *iter)
开始构造并发送 D-Bus 消息(首参数)
int tbox_dbus_get_message_end(DBusMessage *msg, tbox_dbus_param_t *return_param)
完成 D-Bus 消息接收并发送方法返回
int tbox_dbus_connect(const char *app_name)
连接 D-Bus 服务
int tbox_dbus_set_receive_match(const char *filter)
添加接收消息匹配规则
void tbox_dbus_send_no_reply(const char *dest, const char *module, const char *action, tbox_dbus_param_t *param)
发送无需回复的 D-Bus 方法调用
void tbox_dbus_free_param(tbox_dbus_param_t *param)
释放参数中动态分配的内存
void tbox_dbus_free_message(DBusMessage *msg)
释放 D-Bus 消息对象
void(* tbox_dbus_handler_t)(tbox_dbus_param_t *msg_param, tbox_dbus_param_t *return_param)
接收消息处理回调
Definition dbus.h:79
int tbox_dbus_send_message(const tbox_dbus_send_info_t *send_info, tbox_dbus_param_t *return_param, int32_t timeout)
发送 D-Bus 消息并等待回复
void tbox_dbus_disconnect(void)
断开 D-Bus 服务连接
int tbox_dbus_delete_receive_match(const char *filter)
删除接收消息匹配规则
bool tbox_dbus_check_next_message(DBusMessageIter *iter)
检查消息迭代器是否还有下一个参数
const char * tbox_dbus_get_connection_name(void)
获取当前连接的唯一名称
@ TBOX_DBUS_TYPE_INT32
有符号 32 位整数类型
Definition dbus.h:43
@ TBOX_DBUS_TYPE_UINT8
无符号 8 位整数类型
Definition dbus.h:46
@ TBOX_DBUS_TYPE_UINT16
无符号 16 位整数类型
Definition dbus.h:44
@ TBOX_DBUS_TYPE_BOOL
布尔类型
Definition dbus.h:47
@ TBOX_DBUS_TYPE_INVALID
无效类型
Definition dbus.h:49
@ TBOX_DBUS_TYPE_STRING
字符串类型
Definition dbus.h:41
@ TBOX_DBUS_TYPE_ARRAY
数组类型
Definition dbus.h:48
@ TBOX_DBUS_TYPE_UINT32
无符号 32 位整数类型
Definition dbus.h:42
@ TBOX_DBUS_TYPE_INT16
有符号 16 位整数类型
Definition dbus.h:45
T-Box 日志客户端接口
消息处理映射表项
Definition dbus.h:85
const char * module
模块名
Definition dbus.h:86
const char * action
动作名
Definition dbus.h:87
tbox_dbus_handler_t handler
处理回调
Definition dbus.h:88
D-Bus 消息参数
Definition dbus.h:56
uint32_t array_len
数组长度
Definition dbus.h:59
uint16_t u16
无符号 16 位整数
Definition dbus.h:64
uint32_t u32
无符号 32 位整数
Definition dbus.h:62
tbox_dbus_type_t type
参数类型
Definition dbus.h:57
char * str
字符串
Definition dbus.h:68
uint8_t u8
无符号 8 位整数
Definition dbus.h:66
void * array
数组数据
Definition dbus.h:69
int32_t i32
有符号 32 位整数
Definition dbus.h:63
int16_t i16
有符号 16 位整数
Definition dbus.h:65
bool b
布尔值
Definition dbus.h:67
tbox_dbus_type_t array_type
数组元素类型
Definition dbus.h:58
接收消息描述
Definition dbus.h:107
tbox_dbus_param_t param
参数
Definition dbus.h:110
const char * action
动作名
Definition dbus.h:109
const char * module
模块名
Definition dbus.h:108
发送消息描述
Definition dbus.h:95
tbox_dbus_param_t * param
参数,可为空
Definition dbus.h:100
const char * dest
目标服务名
Definition dbus.h:97
const char * action
动作名
Definition dbus.h:99
const char * module
模块名
Definition dbus.h:98
bool is_signal
是否为信号
Definition dbus.h:96