citadel学习笔记4——git版本XMPP模块之token.def

阅读citadel的代码,后来吧,有时候就是比较喜欢追新。就将citadel的最新版本给下下来了。也就是其git上的版本。还是有不少的收获。其XMPP模块也进行了重构,从代码上看,更加容易进行扩展等一系列的操作了。

首先,当然是先把代码都给clone下来。(我此次git的版本为commit 6050cb23108ee10dafcceb65b9cafab51c013ae0)

这是把citadel上的所有工程代码都给clone下来。

内容还不少的。其中服务端的话,是citadel那个目录。大概看了下,XMPP模块的话,已经被细分成多个模块了。下文将以XMPP模块为主,进行说明。

新的xmpp模块由原来的单个xmpp模块划分成了xmpp+xmpp_message+xmpp_presence+xmpp_queue+xmpp_xmacros。其中比较重要的就是xmpp_xmacros,这个模块,算是做了一个宏模板。也因为添加了该模块,出现了一个比较奇葩的定义——token.def,这个说是头文件吧,又不像,但是却又当头文件来引用。说起这个,我以前一个同事,在引用头文件的时候,引用了某个.c当做头文件,并且能够编译也可以执行。真是把一直用.h做头文件的习惯给打破了。这是后话了。token.def文件的内容如下:

再看看其被引用的地方:

从.c开始看吧,也就是从xmpp_xmacros.c开始吧,该文件代码并不多,把与token.def相关的贴出来:

说白了,就是通过每次对STRPROP,PAYLOAD及TOKEN这三个宏定义进行重构,就定义出不同的函数出来。很巧妙的利用宏定义。也正是这样,所以就起了个很奇葩的后缀.def,以IQ这个定义来展开,首次展开的内容应该是这样的:

之后调用了#undef,将所有之前的宏定义都消除了。再次重新定义,重新定义的,则是生成了free_buf系列函数:

最后还有一个,就是free_系列的函数了:

还有就是在函数CTDL_MODULE_INIT(xmpp_xmacros)里面还展开一次:

也就是说,在这个.c里面,通过宏的方式,把其定义的给展开成了一系列的函数及实现。而在头文件xmpp_xmacros.h中,测试变成了声明,还是以iq为例。

头文件内容如下:

展开后对应为(竟然少了serialize_iq函数的定义。。。。好吧,可能是二妈生的):

从上面的工作量来看,和对应的简短的代码,就可以看出该宏定义的优点了,将重复的工作简单化,让编译器去瞎忙活就行了(累死我了,展开这些)。从现有重构的代码上来看,用到的其实就只有TheToken_iq及TheToken_message,那个TheToken_piq还没有看到有哪里有用到(和iq参数一样)。这样也就方便我们扩展了,因为XMPP其实是支持非常多的扩展的,总不能每次需要一个节的时候,你总要写一大票的代码,通过token.def,就可以扩展的时候,只是做这么一个工作:

既快捷又方便。并不需要知道其再哪里有了什么样的实现。好了,taken.def就先说到这里了。XMPP模块还有很多的改动,如XPUT,原先的输出并不是使用该函数的。更多内容,下次的文章再进一步补充。

 

转载请注明: 转载自elkPi.com

本文链接地址: citadel学习笔记4——git版本XMPP模块之token.def

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Scroll to top