dbus注册监听信号的函数
假设dbus的服务器端会发送一个信号,
比如(服务器端用python实现)
| @dbus.service.signal(INTERFACE_URI, signature='i') def StatusChanged(self, status): pass |
这里,服务器发送一个状态变化的信号,信号传过来的参数是一个int型
现在现在客户端捕捉这个信号
首先假设已经连上dbus,并 获得DBusGProxy *对象 proxy。
1。 要先注册监听信号
dbus_g_proxy_add_signal(proxy, StatusChanged, G_TYPE_INT, G_TYPE_INVALID);
第一个参数是代理对象, 第二个参数是要监听的信号名, 接下来是信号传递的参数描述,最后以
G_TYPE_INVALID来结束参数的描述
2。 指定处理函数
dbus_g_proxy_connect_signal(proxy, StatusChanged, G_CALLBACK(handler), NULL, NULL)
第一个参数是代理对象, 第二个参数是要监听的信号名, 第三个是处理函数, 第4个是额外传递给处理函数的数据
第5个是释放第4个参数所占内存的函数
3。声明处理函数
void handler(DBusGProxy *proxy, int status, gpointer user_data);
第一个参数是代理对象,接下来的是信号传过来的参数,在这个例子中就只要一个int, 最后是在
dbus_g_proxy_connect_signal中指定的额外数据,即第4个参数,这里是NULL
| void dbus_g_proxy_connect_signal | ( | DBusGProxy * | proxy, | |
| const char * | signal_name, | |||
| GCallback | handler, | |||
| void * | data, | |||
| GClosureNotify | free_data_func | |||
| ) |
dbus_g_proxy_connect_signal: : a proxy for a remote interface : the DBus signal name to listen for : the handler to connect : data to pass to handler : callback function to destroy data
Connect a signal handler to a proxy for a remote interface. When the remote interface emits the specified signal, the proxy will emit a corresponding GLib signal.
Definition at line 2872 of file dbus-gproxy.c.
References _DBusGProxyPrivate::interface, and _DBusGProxyPrivate::signal_signatures.
{
char *name;
GClosure *closure;
GQuark q;
DBusGProxyPrivate *priv;
g_return_if_fail (DBUS_IS_G_PROXY (proxy));
g_return_if_fail (!DBUS_G_PROXY_DESTROYED (proxy));
g_return_if_fail (signal_name != NULL);
g_return_if_fail (handler != NULL);
priv = DBUS_G_PROXY_GET_PRIVATE(proxy);
name = create_signal_name (priv->interface, signal_name);
q = g_quark_try_string (name);
#ifndef G_DISABLE_CHECKS
if (q == 0 || g_datalist_id_get_data (&priv->signal_signatures, q) == NULL)
{
g_warning ("Must add the signal '%s' with dbus_g_proxy_add_signal() prior to connecting to it\n", name);
g_free (name);
return;
}
#endif
closure = g_cclosure_new (G_CALLBACK (handler), data, free_data_func);
g_signal_connect_closure_by_id (G_OBJECT (proxy),
signals[RECEIVED],
q,
closure, FALSE);
g_free (name);
}

浙公网安备 33010602011771号