Cliff的工作室
libdmclient代码阅读

libdmclient 是oma-dm的客户端库,基于syncml rtk库封装,后者源出自syncml.org,但现在打不开。libdmclient里面充斥着大量的指针强制转换,且缺少文档。虽然代码量不大,但阅读起来比较繁琐。

libdmclient里面包含了一个test的例子,从这个例子里可以看到libdmclient的使用方法,以下对其中的主要函数进行简单分析:

关于omadmclient_session_init,初始化

关于omadmclient_session_start,启动会话

关于omadmclient_get_next_packet,获得下一个要发的包

关于omadmclient_process_reply,处理http/https响应,没有例子,暂时不看了,不解释。

关于omadmclient_session_close,关闭会话,不解释。

总体来说,omadmclient的本质就是在一个持续的for循环中,不断地完成这样的循环:

graph LR A[发消息给server] --> B[收消息解析] B --> C[更新本地数据结构/UI callback等] C --> D[生成下一个包] D --> A

而libdmclient的本质就是分层处理,在libdmclient这一层面,通过internals_t结构的全局变量,保存所有元素,并在需要时将所有元素丢到syncml RTK(其函数通常都以sml开头),并从syncml RTK得到最后输出的buffer。处理http/https结果的解析部分没看,但应该类似。

第二部分,omadmclient_session_add_mo,添加plugin

add_mo函数的参数是session句柄和mo接口指针,session句柄和mo的关系是:(internals_t)->dmtreeH(dmtree_t)->MOs(mo_mgr_t),括号里面是数据结构名。

核心的实现在momgr.c中的momgr_add_plugin函数中,添加mo的主要动作包括:

  1. 执行initFunc,此时得到data的回调
  2. 将mo plugin的interface/data/container塞到MOs中

每一个mo包含base_uri和以下回调函数:

不需要全部实现,但initFunc必须要有,否则无法加到session中。 这些函数的定义在dmcore/include/omadmtree_mo.h

2016 年 11 月 22 日 13 时 23 分