首页 > C/C++ > 新开源项目Hybrid开发手记

新开源项目Hybrid开发手记

2011年7月30日 发表评论 阅读评论 22,938 人阅读过  

博客有两个月没更新了吧,先说说这段时间都在做些什么吧,六月初的时候实验室项目验收完,以为可以轻松下来了,于是开了一个新的开源项目在做,这个稍后再说,没过多久就被拉去给实验室的新项目做设计文档去了,这活做起来比硬编码要麻烦得多,于是大多数时间都在为这个事情心烦,稍微有点闲下来的时间就去写点代码,接下来说下最近在做的这个开源项目。

之前的Openfetion虽然也受到了一些开源社区朋友的好评,但软件质量怎么样我心里比谁都明白,在twitter上我也公开承认过Openfetion的代码质量以及软件架构都非常差,说到代码质量,最初在开发Openfetion的时候没有想过会把它作为一个通用的软件拿出来给大家用,而是自己纯粹在写着玩,于是写得很随意,当然这也得怪我这种恶劣的编程习惯,专业的coder即便是写一个测试用的小代码也会严格按规范来,这是一种习惯,我承认之前做得不够好。再说到软件架构,对于IM软件我之前一样没有什么经验,在没有经过调研的情况就盲目开始编码,完全没有参考现有的开源软件架构,甚至没有个合适的事件循环,所以Openfetion目前的状态是勉强能用。

之前考虑过重构Openfetion,但其实重构的成本要远远高于重写,于是我决定终止Openfetion项目,不再为Openfetion增加/修改代码,也不鼓励其它人对它进行修改。

作为Openfetion的替代品,我发起了新的开源项目Hybrid(https://github.com/levin108/hybrid),这同样是一款IM软件,我把它定位为类似于Pidgin/Empathy的IM框架,但即没有使用libpurple也没有使用telepathy,这两个库使用起来都还是有很多限制,我喜欢自由自在的写代码,我不太想考虑太多关于Hybrid这个软件能走多远,能有多少人用,我需要一款这样的软件,我想让它支持飞信和Gtalk,这是我最需要的两种通信协议,这就够了。

Hybrid同样也使用了GTK作为UI库,纯C语言开发,用了OpenSSL处理加密逻辑,使用glib的GIOChannel来实现了异步IO事件循环,同时把libxml2的API做了封装,xml的处理代码看起来简洁多了(libxml2的API命名规则看起来实在太难受了,而且还需要经常对它的自定义数据类型进行转换)。软件的整体架构上参考了一个pidgin,之前的Openfetion用多线程来处理并发逻辑,线程之间的同步开销很大,现在经常还会出现的崩溃问题大多来源于线程同步没有做好。现在采用的方法是采用单线程,将处理逻辑都交给GUI线程来进行处理,当然所有的IO都必须是非阻塞IO,通过异步IO的方法来检测IO事件,当前所有的操作都必须是非阻塞的,包括SSL/TLS握手等,但目前还存在的一个问题是DNS解析过程仍然是阻塞的,我还没有去研究如何实现非阻塞DNS解析,这个会加入TODO List中。至于模块化也是采用了glib中的gmodule来实现的,没有直接使用dlopen的方法,这样应该会提高一点可移植性吧。

关于协议模块,飞信的协议模块在现有的pidgin插件的基础上重写了,使用了封装过的xml接口,同样也使用了一致的编码风格,但在之前的基础上写代码效率就高了很多,很快就完成了。另外关于Gtalk的协议模块也没有花太多时间,用了一个周末的时间就把基础框架弄好了,因为用的是XMPP,开放的协议实现起来非常简单,只需要读一遍协议然后照着开发就好了,一路写下来都很顺,没有遇到什么大的麻烦。

总之到目前为止,这款软件已经基本能满足我的需要了,但还是有很多需要完善的地方,如好友的搜索,webkit的聊天界面,以及自定义请求对话框等,这些等以后慢慢再更新,现在面临毕业找工作,时间相对也较少,有空的时候就更新一点。

还没有想好什么时候要发布一个正式版,有一点点追求完美,总想把它做得更好一点,有感兴趣的同学可以去把代码clone下来玩玩,有用过的同学欢迎反鐀意见。

原创文章,转载请注明: 转载自basic coder

本文链接地址: http://basiccoder.com/new-opensource-project-hybrid-dev-note.html

分类: C/C++ 标签: ,
  1. yyc
    2011年8月1日21:44 | #1

    @levin
    我在写gnome-shell extension的时候最讨厌的也是吧从各种地方跟新来的数据同步到界面上

    @levin
    我已经在aur上上传了包了(https://aur.archlinux.org/packages.php?ID=51159) 麻烦看看PKGBUILD 有没有问题
    因为已经有个包叫做hybrid了, 所以我起的名字是hybrid-im(-git)

  2. 2011年8月1日21:46 | #2

    @yyc 这么快就打了包,话说我还没正式发布一个版本呢,现在还在开发阶段,还有很多问题,呵呵,另外,arch我没用过,pkgbuild不太懂啊

  3. yyc
    2011年8月1日22:13 | #3

    @levin
    所以打的是git版本啊(其实主要是arch的打包系统超级方便, 我现在所有的软件只要可以打包的就都打包再装(升级方便))
    PKGBUILD就是顺序执行build和package了(主要是你的readme好像有点问题所以问一下下面这个安装方式有没有问题(也因为我没用过cmake)
    git checkout master
    mkdir -p build
    cd build
    cmake .. -DCMAKE_INSTALL_PREFIX=/usr
    make
    cd “$srcdir/$_gitname/build”
    make DESTDIR=”${pkgdir}” install
    )

  4. 2011年8月1日22:56 | #4

    @yyc 嗯,README文件写的是有问题,多谢提醒,我稍后会修改过来

  5. yyc
    2011年8月2日01:56 | #5

    @levin
    我已经改了
    麻烦pull一下

    虽然我也很喜欢diy东西(这也是我一直没有太仔细看cmake和autotools的原因之一)但是我记得你在openfetion的介绍上说过不想做已经有人做的东西(大概是这个意思的一句话), 这次的hybrid跟empathy/pidgin(telepathy/purple)相比有什么很不一样的地方么?

  6. charles
    2011年9月14日15:12 | #6

    build失败。

    ~/hybrid/src/chat-webkit.c: In function ‘timeout_cb’:
    ~/hybrid/src/chat-webkit.c:167:2: error: ‘WebKitLoadStatus’ undeclared (first use in this function)
    ~/hybrid/src/chat-webkit.c:167:2: note: each undeclared identifier is reported only once for each function it appears in
    ~/hybrid/src/chat-webkit.c:167:19: error: expected ‘;’ before ‘status’
    ~/hybrid/src/chat-webkit.c:169:45: error: ‘status’ undeclared (first use in this function)
    ~/hybrid/src/chat-webkit.c:171:16: error: ‘WEBKIT_LOAD_FINISHED’ undeclared (first use in this function)
    ~/hybrid/src/chat-webkit.c:175:2: warning: implicit declaration of function ‘webkit_web_view_execute_script’
    ~/hybrid/src/chat-webkit.c:175:2: warning: implicit declaration of function ‘WEBKIT_WEB_VIEW’
    ~/hybrid/src/chat-webkit.c: In function ‘hybrid_chat_webkit_append’:
    ~/hybrid/src/chat-webkit.c:188:2: error: ‘WebKitLoadStatus’ undeclared (first use in this function)
    ~/hybrid/src/chat-webkit.c:188:19: error: expected ‘;’ before ‘status’
    ~/hybrid/src/chat-webkit.c:227:41: error: ‘status’ undeclared (first use in this function)
    ~/hybrid/src/chat-webkit.c:231:6: error: ‘WEBKIT_LOAD_FINISHED’ undeclared (first use in this function)
    ~/hybrid/src/chat-webkit.c:231:40: error: ‘WEBKIT_LOAD_FIRST_VISUALLY_NON_EMPTY_LAYOUT’ undeclared (first use in this function)
    make[2]: *** [CMakeFiles/hybrid.dir/src/chat-webkit.c.o] 错误 1
    make[1]: *** [CMakeFiles/hybrid.dir/all] 错误 2
    make: *** [all] 错误 2

  7. grace
    2011年10月20日12:27 | #7

    原来openfetion已经停了,还好楼主没有直接消失,祝新项目成功。

  8. grace
    2011年11月1日10:50 | #8

    话说楼主很久没更新了,我下载了编译安装之后发现一个bug,就是网络可能不稳定的时候,经常出现没有掉线,但是之前一直聊天的一个联系人接收不到我发的消息,其他联系人能正常收发,该联系人和其他联系人也能正常收发,该联系人发给我的消息也能够收到,就是发给他他收不到。

  9. Qunero
    2011年11月3日11:33 | #9

    @levin 编译的时候遇到点小问题。1、git clone问题,readme中的无法成功哦:
    $ git clone git@github.com:levin108/hybrid.git
    Cloning into hybrid…
    Permission denied (publickey).
    fatal: The remote end hung up unexpectedly
    后面我用git clone git://github.com/levin108/hybrid.git才成功;
    2、依赖包的问题, 我用的ubuntu,没有xscrnsaver,只有个xscreensaver,下面是CMakeLists.txt内的内容:
    if(WITH_LIBXSS)
    pkg_check_modules(LIBXSS xscrnsaver)
    endif(WITH_LIBXSS)
    PS:如果能把依赖包的名字放大readme中就方便了。

  10. Terry
    2011年12月14日00:04 | #10

    你好,我在64位Fedora16上编译错误,不知道什么原因,下面是编译时的输出:

    terry@lixintian:~/Software/Network/hybrid$ mkdir -p build
    terry@lixintian:~/Software/Network/hybrid$ cd build/
    terry@lixintian:~/Software/Network/hybrid/build$ cmake ..
    – The C compiler identification is GNU
    – The CXX compiler identification is GNU
    – Check for working C compiler: /usr/lib64/ccache/gcc
    – Check for working C compiler: /usr/lib64/ccache/gcc — works
    – Detecting C compiler ABI info
    – Detecting C compiler ABI info – done
    – Check for working CXX compiler: /usr/lib64/ccache/c++
    – Check for working CXX compiler: /usr/lib64/ccache/c++ — works
    – Detecting CXX compiler ABI info
    – Detecting CXX compiler ABI info – done
    – checking for module ‘gtk+-2.0′
    – found gtk+-2.0, version 2.24.8
    – checking for module ‘gdk-pixbuf-2.0′
    – found gdk-pixbuf-2.0, version 2.24.0
    – checking for module ‘glib-2.0′
    – found glib-2.0, version 2.30.1
    – checking for module ‘gobject-2.0′
    – found gobject-2.0, version 2.30.1
    – checking for module ‘gmodule-2.0′
    – found gmodule-2.0, version 2.30.1
    – checking for module ‘openssl’
    – found openssl, version 1.0.0e
    – checking for module ‘libxml-2.0′
    – found libxml-2.0, version 2.7.8
    – checking for module ‘libnotify’
    – found libnotify, version 0.7.4
    – checking for module ‘gstreamer-0.10′
    – found gstreamer-0.10, version 0.10.35
    – checking for module ‘xscrnsaver’
    – found xscrnsaver, version 1.2.1
    – checking for module ‘webkit-1.0′
    – package ‘webkit-1.0′ not found
    – checking for module ‘NetworkManager’
    – found NetworkManager, version 0.9.2.0
    – checking for module ‘dbus-glib-1′
    – found dbus-glib-1, version 0.92
    – checking for module ‘indicate’
    – package ‘indicate’ not found
    – checking for module ‘indicate-gtk’
    – package ‘indicate-gtk’ not found
    – checking for module ‘indicate-gtk-0.5′
    – package ‘indicate-gtk-0.5′ not found
    – Libnotify support: NEW
    – GStreamer support: YES
    – Xscreensaver support: YES
    – WebKit support: NO
    – NetworkManager support: YES
    – Ubuntu Indicator support: NO
    – glib-2.0
    – Configuring done
    – Generating done
    – Build files have been written to: /home/terry/Software/Network/hybrid/build
    terry@lixintian:~/Software/Network/hybrid/build$ sudo make
    [sudo] password for terry:
    Scanning dependencies of target email
    [ 1%] Building C object CMakeFiles/email.dir/modules/email/mail.c.o
    [ 3%] Building C object CMakeFiles/email.dir/modules/email/imap.c.o
    Linking C shared library libemail.so
    [ 3%] Built target email
    Scanning dependencies of target fetion
    [ 5%] Building C object CMakeFiles/fetion.dir/modules/fetion/fetion.c.o
    /home/terry/Software/Network/hybrid/modules/fetion/fetion.c: 在函数‘fx_login’中:
    /home/terry/Software/Network/hybrid/modules/fetion/fetion.c:433:26: 警告:变量‘conn’被设定但未被使用 [-Wunused-but-set-variable]
    /home/terry/Software/Network/hybrid/modules/fetion/fetion.c: 在函数‘fx_chat_start’中:
    /home/terry/Software/Network/hybrid/modules/fetion/fetion.c:825:21: 警告:变量‘ac’被设定但未被使用 [-Wunused-but-set-variable]
    [ 7%] Building C object CMakeFiles/fetion.dir/modules/fetion/fx_login.c.o
    /home/terry/Software/Network/hybrid/modules/fetion/fx_login.c: 在函数‘cfg_connect_cb’中:
    /home/terry/Software/Network/hybrid/modules/fetion/fx_login.c:304:28: 警告:格式 ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘size_t’ [-Wformat]
    [ 9%] Building C object CMakeFiles/fetion.dir/modules/fetion/fx_account.c.o
    [ 11%] Building C object CMakeFiles/fetion.dir/modules/fetion/fx_sip.c.o
    /home/terry/Software/Network/hybrid/modules/fetion/fx_sip.c: 在函数‘fetion_sip_to_string’中:
    /home/terry/Software/Network/hybrid/modules/fetion/fx_sip.c:264:9: 警告:格式 ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘size_t’ [-Wformat]
    [ 13%] Building C object CMakeFiles/fetion.dir/modules/fetion/fx_group.c.o
    [ 15%] Building C object CMakeFiles/fetion.dir/modules/fetion/fx_buddy.c.o
    [ 16%] Building C object CMakeFiles/fetion.dir/modules/fetion/fx_trans.c.o
    [ 18%] Building C object CMakeFiles/fetion.dir/modules/fetion/fx_util.c.o
    [ 20%] Building C object CMakeFiles/fetion.dir/modules/fetion/fx_msg.c.o
    [ 22%] Building C object CMakeFiles/fetion.dir/modules/fetion/fx_config.c.o
    Linking C shared library libfetion.so
    [ 22%] Built target fetion
    Scanning dependencies of target hybrid
    [ 24%] Building C object CMakeFiles/hybrid.dir/lib/connect.c.o
    [ 26%] Building C object CMakeFiles/hybrid.dir/lib/network.c.o
    [ 28%] Building C object CMakeFiles/hybrid.dir/lib/debug.c.o
    [ 30%] Building C object CMakeFiles/hybrid.dir/lib/eventloop.c.o
    [ 32%] Building C object CMakeFiles/hybrid.dir/lib/module.c.o
    [ 33%] Building C object CMakeFiles/hybrid.dir/lib/account.c.o
    [ 35%] Building C object CMakeFiles/hybrid.dir/lib/xmlnode.c.o
    [ 37%] Building C object CMakeFiles/hybrid.dir/lib/config.c.o
    [ 39%] Building C object CMakeFiles/hybrid.dir/lib/util.c.o
    /home/terry/Software/Network/hybrid/lib/util.c: 在函数‘hybrid_base64_encode’中:
    /home/terry/Software/Network/hybrid/lib/util.c:332:3: 警告:计算出的值未被使用 [-Wunused-value]
    [ 41%] Building C object CMakeFiles/hybrid.dir/lib/pref.c.o
    [ 43%] Building C object CMakeFiles/hybrid.dir/lib/logs.c.o
    [ 45%] Building C object CMakeFiles/hybrid.dir/src/gtkconn.c.o
    [ 47%] Building C object CMakeFiles/hybrid.dir/src/gtksound.c.o
    [ 49%] Building C object CMakeFiles/hybrid.dir/src/gtkutils.c.o
    [ 50%] Building C object CMakeFiles/hybrid.dir/src/gtkaccount.c.o
    /home/terry/Software/Network/hybrid/src/gtkaccount.c: 在函数‘bind_account_to_edit’中:
    /home/terry/Software/Network/hybrid/src/gtkaccount.c:542:19: 警告:变量‘module’被设定但未被使用 [-Wunused-but-set-variable]
    /home/terry/Software/Network/hybrid/src/gtkaccount.c: 在函数‘add_cb’中:
    /home/terry/Software/Network/hybrid/src/gtkaccount.c:837:29: 警告:变量‘edit_panel’被设定但未被使用 [-Wunused-but-set-variable]
    /home/terry/Software/Network/hybrid/src/gtkaccount.c: 在函数‘modify_cb’中:
    /home/terry/Software/Network/hybrid/src/gtkaccount.c:898:29: 警告:变量‘edit_panel’被设定但未被使用 [-Wunused-but-set-variable]
    /home/terry/Software/Network/hybrid/src/gtkaccount.c: 在函数‘action_cb’中:
    /home/terry/Software/Network/hybrid/src/gtkaccount.c:932:19: 警告:变量‘module’被设定但未被使用 [-Wunused-but-set-variable]
    /home/terry/Software/Network/hybrid/src/gtkaccount.c: 在函数‘create_account_child_menus’中:
    /home/terry/Software/Network/hybrid/src/gtkaccount.c:986:19: 警告:变量‘proto’被设定但未被使用 [-Wunused-but-set-variable]
    [ 52%] Building C object CMakeFiles/hybrid.dir/src/blist.c.o
    /home/terry/Software/Network/hybrid/src/blist.c: 在函数‘buddy_information_menu_cb’中:
    /home/terry/Software/Network/hybrid/src/blist.c:277:17: 警告:变量‘info’被设定但未被使用 [-Wunused-but-set-variable]
    /home/terry/Software/Network/hybrid/src/blist.c: 在函数‘buddy_move_cb’中:
    /home/terry/Software/Network/hybrid/src/blist.c:302:16: 警告:变量‘proto_icon’被设定但未被使用 [-Wunused-but-set-variable]
    /home/terry/Software/Network/hybrid/src/blist.c: 在函数‘create_group_menu’中:
    /home/terry/Software/Network/hybrid/src/blist.c:587:20: 警告:变量‘account’被设定但未被使用 [-Wunused-but-set-variable]
    /home/terry/Software/Network/hybrid/src/blist.c: 在函数‘hybrid_blist_buddy_to_cache’中:
    /home/terry/Software/Network/hybrid/src/blist.c:1898:14: 警告:变量‘root’被设定但未被使用 [-Wunused-but-set-variable]
    [ 54%] Building C object CMakeFiles/hybrid.dir/src/conv.c.o
    /home/terry/Software/Network/hybrid/src/conv.c: 在函数‘menu_popup_current_page_cb’中:
    /home/terry/Software/Network/hybrid/src/conv.c:480:25: 警告:变量‘parent’被设定但未被使用 [-Wunused-but-set-variable]
    /home/terry/Software/Network/hybrid/src/conv.c:477:10: 警告:变量‘page_index’被设定但未被使用 [-Wunused-but-set-variable]
    /home/terry/Software/Network/hybrid/src/conv.c: 在函数‘init_chat_window_body’中:
    /home/terry/Software/Network/hybrid/src/conv.c:1087:16: 警告:变量‘button’被设定但未被使用 [-Wunused-but-set-variable]
    /home/terry/Software/Network/hybrid/src/conv.c: 在函数‘hybrid_chat_window_update_tips’中:
    /home/terry/Software/Network/hybrid/src/conv.c:1654:25: 警告:变量‘conv’被设定但未被使用 [-Wunused-but-set-variable]
    [ 56%] Building C object CMakeFiles/hybrid.dir/src/info.c.o
    [ 58%] Building C object CMakeFiles/hybrid.dir/src/head.c.o
    [ 60%] Building C object CMakeFiles/hybrid.dir/src/action.c.o
    [ 62%] Building C object CMakeFiles/hybrid.dir/src/notify.c.o
    [ 64%] Building C object CMakeFiles/hybrid.dir/src/tooltip.c.o
    [ 66%] Building C object CMakeFiles/hybrid.dir/src/preference.c.o
    [ 67%] Building C object CMakeFiles/hybrid.dir/src/chat-textview.c.o
    [ 69%] Building C object CMakeFiles/hybrid.dir/src/chat-webkit.c.o
    /home/terry/Software/Network/hybrid/src/chat-webkit.c: 在函数‘timeout_cb’中:
    /home/terry/Software/Network/hybrid/src/chat-webkit.c:167:5: 错误:未知的类型名‘WebKitLoadStatus’
    /home/terry/Software/Network/hybrid/src/chat-webkit.c:171:19: 错误:‘WEBKIT_LOAD_FINISHED’未声明(在此函数内第一次使用)
    /home/terry/Software/Network/hybrid/src/chat-webkit.c:171:19: 附注:每个未声明的标识符在其出现的函数内只报告一次
    /home/terry/Software/Network/hybrid/src/chat-webkit.c:175:5: 警告:隐式声明函数‘webkit_web_view_execute_script’ [-Wimplicit-function-declaration]
    /home/terry/Software/Network/hybrid/src/chat-webkit.c:175:5: 警告:隐式声明函数‘WEBKIT_WEB_VIEW’ [-Wimplicit-function-declaration]
    /home/terry/Software/Network/hybrid/src/chat-webkit.c: 在函数‘hybrid_chat_webkit_append’中:
    /home/terry/Software/Network/hybrid/src/chat-webkit.c:188:5: 错误:未知的类型名‘WebKitLoadStatus’
    /home/terry/Software/Network/hybrid/src/chat-webkit.c:246:9: 错误:‘WEBKIT_LOAD_FINISHED’未声明(在此函数内第一次使用)
    /home/terry/Software/Network/hybrid/src/chat-webkit.c:247:9: 错误:‘WEBKIT_LOAD_FIRST_VISUALLY_NON_EMPTY_LAYOUT’未声明(在此函数内第一次使用)
    /home/terry/Software/Network/hybrid/src/chat-webkit.c: 在函数‘hybrid_chat_webkit_notify’中:
    /home/terry/Software/Network/hybrid/src/chat-webkit.c:268:5: 错误:未知的类型名‘WebKitLoadStatus’
    /home/terry/Software/Network/hybrid/src/chat-webkit.c:276:9: 错误:‘WEBKIT_LOAD_FINISHED’未声明(在此函数内第一次使用)
    /home/terry/Software/Network/hybrid/src/chat-webkit.c:277:9: 错误:‘WEBKIT_LOAD_FIRST_VISUALLY_NON_EMPTY_LAYOUT’未声明(在此函数内第一次使用)
    make[2]: *** [CMakeFiles/hybrid.dir/src/chat-webkit.c.o] 错误 1
    make[1]: *** [CMakeFiles/hybrid.dir/all] 错误 2
    make: *** [all] 错误 2
    terry@lixintian:~/Software/Network/hybrid/build$

  11. bluefoxah
    2012年6月19日01:13 | #11

    请问是否可以将这个项目中的飞信模块抽出,然后再次写个command line的呢?如果要抽出的话,主要要做哪几块的工作呢?可以给个答复吗?

评论分页
1 2 891

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。