第三章 消息元素
URI
统一资源定位符(URI)几乎是仿照面向对象构造的(或者有人说是基于对象而不是面向对象的)。因此URI是可以被协议栈统一对待,而且新的URI类型也很容易引入。
URI类图
下图展示了URI对象的设计:
URI上下文
URI上下文指定了URI在哪使用(如在请求行,在From和To头部域等等)。上下文指定了此时什么URI元素是允许出现的。例如,transport参数不允许在From/To头部域出现等等。在PJSIP中,当要向一个缓存中输出URI时和比较两个URIs时,需要指定上下文。在这些情况下,在指定上下文中部允许出现的URI部分,将在输出和比较过程中忽略。
基本URI
pjsip_uri数据结构中包含了所有类型URI共享的属性。因此,所有类型的URI都可以转化为pjsip_uri,且可以统一的方式操作。
jsip_uri_vptr指定了虚函数表,其中的成员是由每一种类型的URI定义的。应用不推荐直接访问这些函数指针。应用推荐使用URI的API。因为它们可读性好,同时也减少一些输入。
下面的URI函数可以被所有类型的URI对象应用。这些函数通常实现为内联函数,这些内联函数调用URI虚函数表中对应的函数指针。
获取URI的机制字符串(如”sip”,”sips”,”tel”)。
获取URI对象。通常所有URI对象会返回它自身。除了命名地址(name address),会返回命名地址对象内的URI。
根据指定的上下文比较uri1和uri2。指定上下文中不允许出现的参数将被忽略。如果URIs相同则返回PJ_SUCCESS。
根据指定的上下文将uri输出到指定buffer。指定上下文中不允许出现的参数将不会被输出。
使用 指定的内存池,创建uri的深度拷贝。
SIP URI和SIPs URI
pjsip_sip_uri代表SIP和SIPs URI。它声明在<pjsip/sip_uri.h>中。
下面列出的函数是SIP/SIPS URI对象