cuijpus的专栏

关注范围:Telecommunication, Mobile , Embedded Linux。好记性,不如烂笔头。

用户操作
[即时聊天] [发私信] [加为好友]
崔计平ID:cuijpus
51343次访问,排名2233(-1),好友22人,关注者49人。
做手机研发5年多,涉及app, middleware, driver等;好记性不如烂笔头,随手写些,免得忘记了。
cuijpus的文章
原创 155 篇
翻译 0 篇
转载 47 篇
评论 56 篇
cuijpus的公告
目前正在分析研究7个Linux手机平台的异同点


最近评论
qiuyu:您好,我想问一下是不是第三方开发只需LiMo的应用程序编程接口,在此基础上编程就可以了?我看了一下我得linux平台下并没有这个API的实现程序,这样的话只根据接口函数就能使用?一般情况下的话是不是得需要个库之类的文件呀?我是新手,请赐教!
yuhang111:我想还是兼容性的问题,maemo的不少组件是基于debian开发的, 所有应该更方便的在ubuntu上使用吧。当然用fedora也可以,好像虚拟机下用fedora要比ubuntu慢些吧。
wei04:请问D-BUS的C API是线程安全的么?
Liyonn8744:您好,Maemo平台的宿主Linux一定要用ubuntu的吗?用Fedora Core 6可以吗?有什么区别呢?谢谢~
SearchSun:同期待,如果有一个通过libosso封装的D-BUS来调用media player的例子就好了
文章分类
收藏
相册
常去的网站
linux mobile research圈子
存档
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 可以监听incoming message的dbus low level的sample code收藏

新一篇: 电信重组能给我们老百姓带来什么好处? | 旧一篇: 选择system bus还是session bus?

 

可以监听incoming message的dbus low level的sample code

 

 /* compile with:
   gcc `pkg-config dbus-1 --cflags --libs` own-mainloop.c -o own-
mainloop
*/

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/poll.h>
#include <dbus/dbus.h>

#define MAX_WATCHES 100

static DBusConnection *conn;
static struct pollfd pollfds[MAX_WATCHES];
static DBusWatch *watches[MAX_WATCHES];
static int max_i;
static char *progname;

static DBusHandlerResult
filter_func(DBusConnection *c, DBusMessage *m, void *data)
{
        printf("[%s] if: %s, member: %s, path: %s\n", progname,
               dbus_message_get_interface(m),
               dbus_message_get_member(m),
               dbus_message_get_path(m));
        return DBUS_HANDLER_RESULT_HANDLED;
}

static dbus_bool_t add_watch(DBusWatch *watch, void *data)
{
        short cond = POLLHUP | POLLERR;
        int fd;
        unsigned int flags;

        printf("[%s] add watch %p\n", progname, (void*)watch);
        fd = dbus_watch_get_fd(watch);
        flags = dbus_watch_get_flags(watch);
       
        if (flags & DBUS_WATCH_READABLE)
                cond |= POLLIN;
        if (flags & DBUS_WATCH_WRITABLE)
                cond |= POLLOUT;

        ++max_i;
        pollfds[max_i].fd = fd;
        pollfds[max_i].events = cond;
        watches[max_i] = watch;

        return 1;
}

static void remove_watch(DBusWatch *watch, void *data)
{
        int i, found = 0;

        printf("[%s] remove watch %p\n", progname, (void*)watch);
        for (i = 0; i <= max_i; ++i) {
                if (watches[i] == watch) {
                        found = 1;
                        break;
                }
        }
        if (!found) {
                printf("watch %p not found\n", (void*)watch);
                return;
        }

        memset(&pollfds[i], 0, sizeof(pollfds[i]));
        watches[i] = NULL;

        if (i == max_i && max_i > 0) --max_i;
}

static void fd_handler(short events, DBusWatch *watch)
{
        unsigned int flags = 0;

        if (events & POLLIN) 
                flags |= DBUS_WATCH_READABLE;
        if (events & POLLOUT)
                flags |= DBUS_WATCH_WRITABLE;
        if (events & POLLHUP)
                flags |= DBUS_WATCH_HANGUP;
        if (events & POLLERR)
                flags |= DBUS_WATCH_ERROR;

        while (!dbus_watch_handle(watch, flags)) {
                printf("dbus_watch_handle needs more memory\n");
                sleep(1);
        }
       
        dbus_connection_ref(conn);
        while (dbus_connection_dispatch(conn) ==
DBUS_DISPATCH_DATA_REMAINS);
        dbus_connection_unref(conn);
}

int main(int argc, char *argv[])
{
        DBusError error;

        progname = argv[0];
        dbus_error_init(&error);
        conn = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
        if (conn == NULL) {
                printf("Error when connecting to the bus: %s\n",
                       error.message);
                return 1;
        }

        if (!dbus_connection_set_watch_functions(conn, add_watch,
                     remove_watch, NULL, NULL, NULL)) {
                printf("dbus_connection_set_watch_functions failed\n");
                return 1;
        }

        if (!dbus_connection_add_filter(conn, filter_func, NULL, NULL))
{
                printf("Failed to register signal handler callback\n");
                return 1;
        }
        dbus_bus_add_match(conn, "type='signal'", NULL);
        dbus_bus_add_match(conn, "type='method_call'", NULL);

        while (1) {
                struct pollfd fds[MAX_WATCHES];
                DBusWatch *watch[MAX_WATCHES];
                int nfds, i;

                for (nfds = i = 0; i <= max_i; ++i) {
                        if (pollfds[i].fd == 0 ||
                            !dbus_watch_get_enabled(watches[i])) {
                                continue;
                        }

                        fds[nfds].fd = pollfds[i].fd;
                        fds[nfds].events = pollfds[i].events;
                        fds[nfds].revents = 0;
                        watch[nfds] = watches[i];
                        ++nfds;
                }

                if (poll(fds, nfds, -1) <= 0) {
                        perror("poll");
                        break;
                }

                for (i = 0; i < nfds; ++i) {
                        if (fds[i].revents) {
                                fd_handler(fds[i].revents, watch[i]);
                        }
                }
        }
        return 0;
}

发表于 @ 2008年05月25日 00:30:42|评论(loading...)|编辑

新一篇: 电信重组能给我们老百姓带来什么好处? | 旧一篇: 选择system bus还是session bus?

评论:没有评论。

发表评论  


登录
Csdn Blog version 3.1a
Copyright © cuijpus