免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1993 | 回复: 0
打印 上一主题 下一主题

dbus-glib笔记 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-21 11:02 |只看该作者 |倒序浏览
use command "make server" to make server while "make client" to make client.

说明:附件程序演示如下内容:

  • 如何在服务端同步以及异步处理客户端提交的请求。
  • 如何在客户端同步以及异步调用服务端提供的服务。
  • 信号的使用以及参数的传递。
  • 如何防止客户端调用超时。

client端
/*********************************************
*
*
*
*
*
*
* ******************************************/
#include stdio.h>
#include stdlib.h>
#include glib.h>
#include dbus/dbus.h>
#include dbus/dbus-glib.h>
#include "study_client.h"
void plusone_cbk (DBusGProxy *proxy, guint result, GError *error, gpointer userdata);
static void signal_cbk(DBusGProxy *proxy, guint ret, gpointer user_data);
int main(int argc, char **argv)
{
    GMainLoop *mainloop = NULL;
    mainloop = g_main_loop_new(NULL, FALSE);
    DBusGConnection *connection = NULL;
    GError *err = NULL;
    g_type_init();
    if((connection = dbus_g_bus_get(DBUS_BUS_SESSION, &err)) == NULL)
    {
        printf("dbus_g_bus_get--------------failed!\n");
        return 0;
    }
    DBusGProxy *proxy = NULL;
    if((proxy = dbus_g_proxy_new_for_name(connection, "ivt.object", "/ivt/ivt_object", "ddb.study")) == NULL)
    {
        printf("dbus_g_proxy_new_for_name-------------failed!\n");
        return 0;
    }
    dbus_g_proxy_set_default_timeout (proxy, INT_MAX);
    ddb_study_plusone_in_10_min_async_async(proxy, 9, plusone_cbk, NULL);
    guint result = 0;
    ddb_study_plustwo_in_10_min(proxy, 10, &result, &err);
    printf("sync result = %d\n", result);
    dbus_g_proxy_add_signal(proxy, "return_three", G_TYPE_UINT, G_TYPE_INVALID);
    dbus_g_proxy_connect_signal(proxy, "return_three", G_CALLBACK (signal_cbk), NULL, NULL);
    g_main_loop_run(mainloop);
    return 0;
}
static void signal_cbk(DBusGProxy *proxy, guint ret, gpointer user_data)
{
    printf ("receive message from server, value = %d\n", ret);
}
void plusone_cbk(DBusGProxy *proxy, guint result, GError *error, gpointer userdata)
{
    printf("result = %d\n", result);
}

server端

/****************************************
*
*
*
* *************************************/
#include stdio.h>
#include stdlib.h>
#include pthread.h>
#include glib.h>
#include dbus/dbus.h>
#include dbus/dbus-glib.h>
void *thread_func(void *);
typedef struct _IvtObject IvtObject;
typedef struct _IvtObjectClass IvtObjectClass;
GType ivt_object_get_type(void);
struct _IvtObject
{
    GObject parent;
};
struct _IvtObjectClass
{
    GObjectClass parent;
};
static guint ivt_object_signals[2] = { 0 };
#define DDB_TYPE_OBJECT (ivt_object_get_type())
G_DEFINE_TYPE(IvtObject, ivt_object, G_TYPE_OBJECT)
gboolean ivt_object_plusone_in_10_min_async(IvtObject *obj, const guint value, DBusGMethodInvocation *context);
gboolean ivt_object_plustwo_in_10_min(IvtObject *obj, guint value, guint *ret, GError **err);
#include "study_server.h"
static void
ivt_object_init(IvtObject *obj)
{
}
static void
ivt_object_class_init(IvtObjectClass *obj_class)
{
    ivt_object_signals[0] = g_signal_new ("return_three",
                    G_OBJECT_CLASS_TYPE (obj_class),
                    (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED),
                    0,
                    NULL, NULL,
                    g_cclosure_marshal_VOID__UINT,
                    G_TYPE_NONE, 1, G_TYPE_UINT);
}
/***********************for thread**************************/
typedef struct _ThreadArg
{
    IvtObject *obj;
    DBusGMethodInvocation *context;
    guint value;
}ThreadArgStr;
void *thread_func(void *arg)
{
    ThreadArgStr *pkg = (ThreadArgStr *)arg;
    sleep(10);
    dbus_g_method_return(pkg->context, pkg->value+1);
    g_signal_emit(pkg->obj, ivt_object_signals[0], 0, 3);
    free(pkg);
}
/************************************************************/
gboolean ivt_object_plusone_in_10_min_async(IvtObject *obj, const guint value, DBusGMethodInvocation *context)
{
    printf("value = %d\n", value);
    ThreadArgStr *pkg = NULL;
    pkg = (ThreadArgStr *)malloc(sizeof(ThreadArgStr));
    pkg->obj = obj;
    pkg->context = context;
    pkg->value = value;
    pthread_t tid;
    if(pthread_create(&tid, NULL, thread_func, (void *)pkg) != 0)
    {
        printf("pthread_create------------failed!\n");
    }
    return TRUE;
}
gboolean ivt_object_plustwo_in_10_min(IvtObject *obj, guint value, guint *ret, GError **err)
{
    printf("value = %d\n", value);
    (*ret) = value + 2;
    return TRUE;
}
int main(int argc, char **argv)
{
    GMainLoop *main_loop = NULL;
    g_type_init();
    if((main_loop = g_main_loop_new(NULL, FALSE)) == NULL)
    {
        printf("g_main_loop_new -------------failed!\n");
        return 0;
    }
    DBusGConnection *connection = NULL;
    GError *err = NULL;
    if((connection = dbus_g_bus_get(DBUS_BUS_SESSION, &err)) == NULL)
    {
        printf("dbus_g_bus_get---------------failed!\n");
        return 0;
    }
    DBusGProxy *proxy = NULL;
    guint request_name_result;
    proxy = dbus_g_proxy_new_for_name (connection, DBUS_SERVICE_DBUS,
                                              DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
    if (!dbus_g_proxy_call(proxy, "RequestName", &err,
                          G_TYPE_STRING, "ivt.object", G_TYPE_UINT, 0, G_TYPE_INVALID,
                          G_TYPE_UINT, &request_name_result, G_TYPE_INVALID))
    {
          printf("Failed to acquire org.example.TestService: %s", err->message);
          dbus_g_connection_unref(connection);
          return 0;
    }
    dbus_g_object_type_install_info(DDB_TYPE_OBJECT, &dbus_glib_ivt_object_object_info);
    IvtObject *obj = NULL;
    obj = g_object_new(DDB_TYPE_OBJECT, NULL);
    dbus_g_connection_register_g_object(connection, "/ivt/ivt_object", G_OBJECT(obj));
    g_main_loop_run(main_loop);
    dbus_g_connection_unref(connection);
    return 0;
}

XML文件

?xml version="1.0" encoding="UTF-8" ?>
node name="/ddb/study">
    interface name="ddb.study">
        method name="plusone_in_10_min_async">
            annotation name="org.freedesktop.DBus.GLib.Async" value="plusone_in_10_min_async_imp" />
            arg type="u" name="value" direction="in" />
            arg type="u" name="result" direction="out" />
        /method>
        method name="plustwo_in_10_min">
            arg type="u" name="value" direction="in"/>
            arg type="u" name="result" direction="out" />
        /method>
        !--signal-->
        signal name="return_three">
            arg type="u" name="signal_value" direction="out" />
        /signal>
    /interface>
/node>

marshal.list文件

VOID:UINT


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93784/showart_2033532.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP