meego中dbus服务程序开发的一点总结

转载时请注明出处和作者联系方式
文章出处:
http://blog.csdn.net/jack0106
作者联系方式:冯牮
[email protected]

 


     我们的项目团队之前是在moblin平台上作开发的,使用的是gobject那一套对象系统,moblin合并成meego后,考虑到新技术的学习成本和之前完成的代码的重用性,我们在meego平台上开发的时候,有一部分代码还是继续沿用原来的gobject系统,而并没有完全换用qt的对象系统。当然,这一部分继续基于gobject系统开发的代码,肯定不会是GUI部分,而主要都是一些基于dbus的中间件。

     开发过程中,发现了一个问题,我们用gobject和dbus-glib库,开发了一个dbus服务程序,其中有一个函数,它的xml定义片段如下:

    <method name="GetContacts">
      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
      <arg type="a{ss}" name="contactList" direction="out" />
    </method>
    如果dbus客户端程序,也使用dbus-glib这个库进行开发,那么,是没有任何问题的。但是,handset版的meego,主要的开发环境还是qt,而且qt里面也有dbus相关的类。而问题就在于唯一的这个参数,a{ss}。如果dbus客户端使用qtdbus接口的话,是不能正确调用到这个服务程序端的函数的。后来查了一下原因,总结了一下。

 


    dbus本身,支持的数据类型并不多,主要都是一些最基本的,比如INT,DOUBLE,STRING等等,还有少数容器类型。但是,dbus又是一个比较灵活的系统,其支持的数据类型,是可以扩充的。比如,dbus-glib库,就扩充了数据类型,qt中dbus相关的类,也有相应的数据类型扩充。问题就在于不同的对象系统,在扩充dbus数据类型的时候,并不统一(其实是不可能统一的)。上面提到的a{ss},是dbus-glib库扩充出来的一个类型,对应到glib里面,其实就是GHashTable。qt里面不可能有 GHashTable,所以,用qtdbus接口开发出来的客户端,不能成功的调用上面给出的服务端函数接口。

 


     解决办法有3个:

     1. 要求客户端使用者使用dbus-glib库提供的接口。这个方法不太合适,毕竟,meego上主要的开发环境是qt,我们不能要求第三方开发者还要掌握glib和gobject这一套系统的基本使用方法,而且,在qt程序中,使用dbus-glib接口,本身也有点四不像的感觉。

     2. 我们的服务程序,完全换用qtdbus来开发。这个方法的问题就是学习成本太大,暂时不适合我们采用。

     3. 调整参数类型。把a{ss}换成as,这样的话,虽然在处理数据的时候,不如GHashTable方便,但是仍然满足项目需求,同时,qtdbus客户端,也可以正确的调用该函数。我们项目最终采用的就是这个折衷的办法。

你可能感兴趣的:(中间件,String,qt,平台,meego,程序开发)