5. 规范性描述
本节以规范性方式描述共享外观 (shared appearances) 功能扩展. 本文档通篇使用以下定义:
外观编号 (Appearance number): 外观编号是与某个 AOR 的一个或多个对话 (dialog) 关联的正整数. 外观编号由外观代理 (Appearance Agent) 管理, 并由支持本规范的 UA 向用户显示和呈现. 当分配或请求外观编号时, 通常分配的编号是当前尚未作为该 AOR 某个对话的外观编号使用的最小正整数. 本规范不定义外观编号的上限; 但是, 使用常见整数表示方式不易表示的外观编号很可能导致失败.
占用 (Seizing): 可以通过占用某个外观, 在发起呼叫前预留该外观. 外观可以通过在实际发起对话 (即发送 INVITE) 之前传送一个人为的 "trying" 状态来占用, 使其看起来好像已经在发起对话.
选择 (Selecting, or Not-Seizing): 如果在发起对话之前没有传送这种人为的 "trying" 状态, 即状态是在实际发起对话时才传送的, 则该外观只是被选择 (即未被占用). 外观编号在 INVITE 发送之后获知.
5.1. 元素
实现此功能的完整系统由以下部分组成:
-
支持 SIP 对话事件包以及共享外观对话包扩展和行为的发布, 订阅和通知的 UA.
-
一个外观代理, 它由对话事件包的状态代理 (State Agent) 组成, 该状态代理实现事件状态组合器 (Event State Compositor, ESC) 以及共享外观对话包扩展和行为. 外观代理还具有分配和释放外观编号以及解决外观编号争用的逻辑.
-
一个能够与状态代理通信的分叉代理服务器 (forking proxy server).
-
一个支持注册事件包 (registration event package) 的注册服务器 (registrar).
在定义对话包扩展之后, 以下各节以规范性方式描述这些元素的行为.
5.2. 共享外观对话包扩展
本规范定义四个新元素, 作为 SIP 对话事件包 [RFC4235] 的扩展. 其模式在 Section 6 中定义. 这些元素是 <appearance>, <exclusive>, <joined-dialog> 和 <replaced-dialog>, 它们都是 <dialog> 元素的子元素.
5.2.1. <appearance> 元素
<appearance> 元素是 <dialog> 元素的子元素, 用于传送由父 <dialog> 元素描述的对话的外观编号. 当 UA 在发送给外观代理的 PUBLISH 中携带父 <dialog> 且其 state 属性为 "trying" 时, UA 正在请求将给定外观编号分配给具有给定对话标识符的当前或未来对话. 当外观代理在 NOTIFY 中发送 <appearance> 元素时, 它表示该外观编号已被分配给指定对话.
注意, <dialog-info> 元素从 UA (由 "entity" 属性命名) 的视角描述其中包含的对话, 无论包含该元素的请求是由 UA 发送还是由外观代理发送. 特别是, 如果 UA 在所描述的对话内发送了请求, 则 To 头字段 URI 将匹配 <remote> <identity> 值, to-tag 参数将匹配 remote-tag 属性. 类似地, From 头字段 URI 将匹配 <local> <identity> 值, from-tag 参数将匹配 local-tag 属性.
5.2.2. <exclusive> 元素
<exclusive> 元素是 <dialog> 元素的子元素, 其值为布尔值. 当其为 true 时, 表示 UA 不愿意接受以 <exclusive> 元素的父 <dialog> 元素所描述的对话为目标, 且带有 Join 或 Replaces 头字段的 INVITE. 例如, 某些共享外观系统只允许在呼叫保持时进行呼叫代答. 在这种情况下, 应在呼叫保持时将 <exclusive> 元素设置为 "false", 在呼叫未保持时设置为 "true", 而不是让 "exclusive" 值由保持状态隐含得出.
需要注意, 此元素只是一个提示 (hint). 为了防止另一个 UA 接管或加入某个呼叫, UA 除设置 <exclusive> 标签外, 还可以不向外观代理报告完整的对话信息. 缺少完整的对话信息 (Call-ID, remote-tag 和 local-tag) 会阻止另一个 UA 构造 Join 或 Replaces 头字段. 尽管 UA 可以将 <exclusive> 设置为 "true", 该 UA 仍必须准备好拒绝与此对话相关的 INVITE Join. 如果这些对话标识符已经与外观代理共享, UA 可以发送 INVITE Replaces 来改变它们, 然后不向外观代理报告新的标识符.
如果代理知道哪些对话被标记为 exclusive, 则代理 MAY 通过对包含这些对话标识符的 INVITE Join 和 INVITE Replaces 请求返回 403 (Forbidden) 响应来强制执行这种排他性.
注意, 排他性与外观编号的选择或占用无关, 而是与可在对话上执行的呼叫控制操作有关.
如果不存在 <exclusive> 元素, 则假定其为 false.
5.2.3. <joined-dialog> 元素
<joined-dialog> 元素是 <dialog> 元素的子元素, 用于传送与该对话相加入 (混合或桥接) 的任何其他对话的对话标识符. 只有作为这些混合对话公共端点 (因而控制混合操作) 的 UA, 才应在向外观代理发布时包含此元素. 注意, 即使未使用 Join 头字段来加入对话, 仍应使用此元素. 例如, UA 上两个独立的对话可以在没有任何 SIP 呼叫控制操作的情况下被加入. 已加入的对话将共享同一个外观编号.
如果不存在 <joined-dialog> 元素, 则假定该对话未与任何其他对话加入, 也不会与任何其他对话加入.
5.2.4. <replaced-dialog> 元素
<replaced-dialog> 元素是 <dialog> 元素的子元素, 用于传送将被此对话替换或已经被此对话替换的任何其他对话的对话标识符. 例如, 组内某个 UA 通过发送带有 Replaces 的 INVITE 来代答另一个 UA 上的呼叫时, 会在替换对话中包含此元素. 被替换的对话将共享同一个外观编号.
如果不存在 <replaced-dialog> 元素, 则假定该对话尚未替换任何其他对话, 也不会替换任何其他对话.