Comms和消息传送

上传人:san****019 文档编号:20300043 上传时间:2021-03-05 格式:PPT 页数:78 大小:814.50KB
返回 下载 相关 举报
Comms和消息传送_第1页
第1页 / 共78页
Comms和消息传送_第2页
第2页 / 共78页
Comms和消息传送_第3页
第3页 / 共78页
点击查看更多>>
资源描述
1 第十二章 Comms和消息传送 2 完成本章内容之后我们将能够: 掌握 Symbian OS 的通讯架构 了解多媒体短信业务( MMS) 本 章 目 标 3 本章概述了 Symbian OS提供的 comms工具 , 并详细研究了用于消息传送 , 特别是用于发 送和接收多媒体消息 (MMS)的 API。 4 概述 Symbian OS上的 comms开发可从 3个主要方面考 虑: 开发与通信硬件(比如串口或电话硬件)对话的 驱动程序。这一类型的开发在手机生产时由手机 开发商承担。 Symbian提供与某些特定的基准硬 件(如 Intel Lubbock板)一起工作的驱动程序, 它可用于开发其中的真正手机硬件和驱动程序。 开发协议实现,如用于访问 Web的 HTTP实现,或 用于红外线协议的红外线。手机开发者和第三方 可以开发协议实现,并扩充到 Symbian OS已经提 供的部分中。 5 概述 开发使用有效协议的应用程序:手机开发者提供 具有基本通信应用程序的手机,如电话和消息传 送等应用程序。不过,很多领域中的应用程序可 以受益于与通信的集成,其中包括游戏 它可 以通过多玩家通过本地通信协议(如蓝牙)或通 过 2.5G电话网络上的包数据进行比赛,从而实现 交互。 企业应用 与专用应用程序服务器通信。 6 概述 通信组 目前可用的通信组件包括: 串行通信框架。 套接字框架。 电话框架。 TCP/IP栈。 蓝牙栈。 红外线栈。 SMS和 EMS栈。 7 概述 WAP栈。 HTTP传输框架。 Telnet和 FTP引擎。 消息协议支持,包括 MMS、 SMTP、 POP3和 IMAP4。 这些组件提供了应用程序可访问的 API。 8 概述 Comms及平台 如同其他领域的 Symbian OS开发,在进行 comms 相关的工作时,需要了解什么是 Symbian OS提供 的,什么是 UI平台增加的,比如 Series 60和 UIQ。 基本原则是: Symbian OS提供实现特定通信协 议的引擎组件,并向这些引擎公布 API; UI平台 提供使用这些引擎的应用程序。例如, Symbian OS提供了实现因特网电子邮件协议的组件,而 UIQ和 Series 60提供允许用户发送和接收电子邮 件的消息传送应用程序。 9 OS Comms架构 要理解 Symbian OS的 comms,需要理解所提供通用框 架和插入这些框架的特定协议的实现。本节首先 从框架着手。每种关键框架都使用了 Symbian OS 的客户端服务器架构。在这种架构中,后台运 行的程序(服务器)为其他多个程序(客户)提 供服务。当手机上的多个客户程序需要访问一些 公共资源时,会选择这种方案。服务器的任务是 控制对资源的访问。对于底层的 comms服务器, 所讨论的资源可能是一个硬件资源,比如串口。 资源也可以是共享的数据,比如消息的存储。 10 尽管框架通常具有服务器本身之外的其他要素, 如实用工具类的库,但提到整个框架时,通常还 是简称为服务器。某些情况下, API使得客户端 服务器架构的运用变得显而易见。例如,使用 电话功能时,基本的任务就是创建一个 RTelServer对象,它提供与电话服务器的初始连接 ( Symbian OS约定就是和 RTelServer类似的 API 类,它用于访问以 R 开头的服务器)。如消 息等其他 API,提供广泛的客户端类,从客户程 序中隐藏了客户端服务器接口的直接使用。 OS Comms架构 11 核心服务器如下: 套接字:利用 TCP/IP等协议,提供可寻址端点之 间的通信。自 Symbian OS的第一版起,即成为它 的一部分, 7.0增加了一个新的 API,用于创建和 管理连接。 串行 comms:提供简单串行连接之上的通信,如 用于处理 RS232。 消息传送:利用因特网电于邮件和 SMS这类协议, 提供消息的发送、检索和存储。 电话:提供电话呼叫及服务的控制,以及对电话 功能配置的控制。 OS Comms架构 12 套接字 套接字的概念首次出现于加州大学伯克利分校 的 Unix伯克利软件发行中心 (BSD),它是以 C语言 写的一个 API。自此之后,套接字常见于很多操 作系统和语言中。 套接字代表一个通信“信 道”的逻辑端点。它是物理机器的网络地址和逻 辑端口号的组合,另一个套接字可以给它传输数 据。 因为套接字由机器地址和端口号确定, 所以在一个特定的计算机网络中,每个套接字是 惟一标识的。这就允许应用程序惟一地识别网络 中与其通信的另一位置。 OS Comms架构 13 套接字通常用于在运行因特网协议 (IP)的网络 上进行通信。这时机器地址就是一个 IP地址,端 口将指定一些因特网应用程序,如 Web或 FTP。 与其他操作系统的套接字相比, Symbian OS实 现的套接字有两个主要不同: 套接字可用于访问多种协议,而不仅访问 TCP/IP。 其中包括蓝牙协议 L2CAP和 RFCOMM,以及红 外线协议 IrDA、 IrTinyTP和 IrMUX。 API用 C+编写,与传统的 BSD C API不同。如果 考虑必须使用 C API,例如向其他操作系统移植 代码时,可以考虑 Symbian OS的 C标准库 (STDLIB) 实现中可使用的 C API。 OS Comms架构 14 用于套接字的 Symbian OS C+ API是套接字客 户 API,发布在头文件 es_sock.h和库文件 esock.dll中。与套接字服务器的客户接口由 RSocketServ提供,套接字本身由 RSocket封 装。套接字的客户 API异步调用套接字服务器, 它协调客户端访问套接字服务,并管理与协议模 块的通信,这些协议模块提供了对特定网络协议 的支持。协议模块是插件 DLL,服务器根据需要 进行加载和卸载。 OS Comms架构 15 除与套接字连接,并读写数据外, API还提供了 对其他工具的访问: 主机名解析 (RHostResolver):一些网络类型能 够在适合于给最终用户显示的符号主机地址与协 议内部使用的数字地址之间转换。在 TCP/IP中, 主机名解析服务就是域名服务 (DNS)。对于蓝牙 和红外线,解析接口可用于发现其他哪些设备在 范围内,并可使用这些协议进行通信。通过 RHostResolver对象产生的查询打包在 TNameEntry描述符中,它保存了包含主机名和地 址的 TNameRecord对象。 OS Comms架构 16 协议信息 (TProtocolDesc):可以查询手机上支 持哪些套接字协议,并可以得到每个协议的信息, 比如协议名称和用于表明其性能的标志。 套接字 API还提供了下述功能,它们可能用得比 较少: 网络数据库访问 (RNetDatabase):用于访问关于 设备的数据库。对于红外线,存在 IrDA信息访问 服务 (IAS)这种服务。它与 TCP/IP或蓝牙没有关 联。 服务解析 (RServiceResolver):用于查询远程设 备的性能,也就是说,该设备在相应的协议上可 以提供什么服务。它不是为了 TCP/IP、蓝牙或红 外线而实现的。蓝牙标准中有 种服务,即蓝牙 业务搜寻协议 (SDP),但是 Symbian OS蓝牙设备 没有为此使用套接字 API,因为它有自己专门的 SDP API。 OS Comms架构 17 在 Symbian OS V7.0s以前的版本中,如何构 建网络连接以实现套接字请求,套接字客户 API的调用者不必关心。 连接是隐式建立的,举例如下。 例如,应用程序请求与某个远程地址的 TCP套 接字。与管理网络接口 (NIFMAN)相关的 Symbian OS组件检查没有已存在的网络连接。 它就读取通信设置项数据库 (CommDb), 了解怎样建立连接。例如,设置项可以指定拨 号连接到某个服务提供商 (ISP)。调用能够完 成拨号的其他组件,并利用适当的协议(如 PPP)连接到 ISP。建立连接的所需设置,如 ISP的电话号码和登录信息,也保存在通信数 据库中。 OS Comms架构 18 诸如 W-CDMA和最新版本的 GPRS等技术都可以 在一个连接中建立多个子连接。这在 v7.0s中 是由连接管理接口 RConnection来支持的。它 向客户提供创建、配置和监视连接与子连接的 功能。 OS Comms架构 19 串行通信 串行通信比套接字要简单一些。数据从手机的 一个端口简单地写入和读取,而不需要连接许多 可能的设备及其服务。习惯上,当 Symbian OS设 备通过一根电缆或红外线连接到 PC进行同步,或 连接到外部调制解调器,此时使用这种方式。 与套接字类似, Symbian OS串行 comms的实现使 用了一个服务器,它可以加载插件模块来处理特 定的通信协议。这些插件模块称做 CSY模块,它 们被串行通信服务器加载,客户应用程序不能直 接访问。 OS Comms架构 20 Symbian OS手机可能包括许多 CSY模块作为标 准配置,比如用于处理 RS232和红外线串口通 信的模块。串口协议模块 API允许开发新的 CSY 模块。 通过服务器会话类 RCommServ,可 以找到手机上可用的串口以及它们的协议。一 旦选定了要用的端口,就可以通过串口接口 RComm访问它。该类用于读、写、配置、设置 中断条件和得到端口状态信息。 OS Comms架构 21 通常,使用端口前,要先设置其配置。这包 括设置数据速率、奇偶类型和握手控制等。这 些设置保存在一个 TCommConfigV01类型的串口 配置块中。在配置串口前,可以先检查它的性 能,以保证所需配置是可行的。该串口的性能 由一个 TCommCapsV01类型的对象进行封装。 OS Comms架构 22 消息传送 Symbian OS的消息传送组件为多协议消息传送 提供了一个框架,并且支持特定的消息传送协议。 消息传送为建立高性能消息客户应用程序以及 创建用于支持个别消息传送协议的插件模块提供 了可能。建立这种插件模块的组件集合叫做消息 类型模块 (MTM)。与底层通信协议(如 TCP/IP) 的所有交互均由 MTM完成。 OS Comms架构 23 消息传送架构提供了一些基类,这些基类定 义了用于 MTM实现的组件接口。利用基类按口, 允许客户应用程序发现并动态使用可用的消息 传送协议。 协议提供者为他们的 MTM实现 开发新库。这些实现在协议需要时访问底层通 信库。 OS Comms架构 24 消息服务器 消息服务器控制对消息数据的访问,并将协 议相关的请求委托给服务器端 MTM。由服务器 保存的每条消息部有一个 TMsvId类型的整型 标识符。一条消息的状态(例如是否可读或不 可读)和一些常规属性对大多数消息是公用的, 如日期和主题保存在头部数据对象中,需要通 过 TMsvEntry类访问。消息还可以具有: 一个文件存储:保存消息正文文本、协议相关 的数据:它由 CMsvStore类封装。 一个目录:可存放相关文件(如消息附件) OS Comms架构 25 总体上,消息从 ID、头部、存储和文件目录, 都可以访问和操作,并由 CMsvEntry封装。 除消息本身之外,服务器还保存代表服务和文 件夹的记录。一个服务就是一个收集设置信息 的有用抽象。例如 SMTP,服务将为邮件帐户指定设置。文件夹保存 记录组(消息和其他文件夹)。其中某些文件 夹,如收件箱和草稿箱,总是存在并且在消息 服务器首次启动时创建。用户也可以创建自己 的文件夹。 消息以树形结构保存,与文件系统的目录树 形式类似。树中的每条记录代表一个服务、消 息文件夹或消息部分。图 8-1给出了一个实例。 OS Comms架构 26 OS Comms架构 根 邮 件 服 务 S M S 服 务 本 地 服 务 发 件 箱 发 件 箱 发 件 箱 发 件 箱 1 2 3 图 8-1 消息存储 27 树可以分解为三级: 根记录:只是用来表示将树结构捆绑在一起。 服务记录:有一个本地服务,在它下面保存文件 夹和消息,还有零或多个远程服务。远程服务代 表消息账号。 消息和文件夹记录:本地服务下的消息和文件夹 代表存储在设备上的消息。远程服务下的消息和 文件夹代表远程服务器上存在的消息在本地的副 本。例如,在 POP3电子邮件服务下面,会有 POP3 电子邮件服务器上存在的所有消息的副本;而在 SMS服务下面,可以找到 SIM上保存的 SMS消息。 OS Comms架构 28 MTM基类 MTM基类是提供消息传送协议支持的子类,可以 认为有四个类。用户接口 MTM(CBaseMtmUi)提供 用户接口操作,其中包括: 创建:运行消息编辑器并打开一条新消息。 编辑:如果记录是一条消息,则装入编辑器;如 果记录是一个服务,则编辑设置。 浏览:为消息运行浏览器。 显示操作的进度。 OS Comms架构 29 客户端 MTM(CBaseMtm)提供一个通用接口来操作 消息数 据。该类定义的函数可以用于: 创建消息。 回复消息。 转发消息。 增加删除地址。 增加删除正文文本。 增加删除主题。 增加删除附件。 OS Comms架构 30 UI数据 MTM(CBaseMtmUiData)提供对特定 UI MTM 相关资源 的访问。它包括: 用于消息服务器记录的 MTM相关图标。 用于 MTM相关操作的用户界面文字,例如菜单。 信息函数,用于检查 MTM函数是否适用于某条记 录。 OS Comms架构 31 最后,服务器端 MTM(CBaseServerMtm)提供了通 过相关通信协议对远程服务的消息传输,它的功 能包括: 移动或拷贝当前处于远程服务下的记录。 从本地服务移动或拷贝到远程服务下的一个目的 地。 创建、删除或修改远程记录(如果协议允许操作 远程服务器上的消息)。 实现 MTM相关命令。例如,同步化记录与远程服 务器上消息的命令。 OS Comms架构 32 注册 MTM必须用消息服务器注册。这就允许客户查 询当前是什么类型的 MTM,服务器可以知道哪些 DLL要加载,以创建一个给定的 MTM组件。通过 为每个 MTM提供一个资源文件来完成注册。 注册类允许标识和实例化 MTM组件。关键的类是 CClientMtmRegistry和 CmtmUiDataRegistry。 OS Comms架构 33 SendAs 该接口的使用很简单,它允许应用程序创建发 出的消息。注意,并不是像接口的名字的含义那 样, SendAs提供的 API只能创建而不能发送消息。 使用 SendAs时,它首先向调用者提供一个所有 支持发送消息的已注册 MTM列表。然后,应用程 序可以对 MTM列表增加更多的限制:例如,可以 要求 MTM支持附件或确定的消息大小。 SendAs按 这些附加的条件查询每一个 MTM,并从列表中移 除那些与条件不匹配的 MTM。应用程序完成条件 的增加之后,选择留在列表中的一个 MTM,并用 它构建消息、添加地址、标题、正文文本和附件。 OS Comms架构 34 基本接口由 CSendAs和 MSendAsObserver提供。但 是,还存在“引擎” API,它们不为创建和发送 消息提供可以简单添加到应用程序中的用户接口。 不过,用户接口平台确实提供了包装器类来达到 这一目的,它们是: UIQ API:CqikSendAsDialog。 Series 60 API:CsendAppUi。 OS Comms架构 35 规划发送 规划发送功能为客户提供了能够将消息发送安 排在稍后某一时刻,而不是立即发送。它允许为 规划消息、删除规划、重新规划和核对规划。它 还提供针对性的状态信息,如消息目前是否已规 划、正在发送或失败等。 MTM可以选择是否为规划提供支持。要支持规划, 服务器 MTM必须派生于 CscheduleBase ServerMtm。 服务器 MTM使用另一个叫做任务规划器的 Symbian OS组件,它可以负责在指定时刻启动指定的动作。 与任务规划器的接口由 CMsvScheduleSend封装。 OS Comms架构 36 电话 移动电话是一个包含很多用于手机服务、网 络和硬件标准的复杂领域。 Symbian OS提供的 电话 API及其框架希望通过提供与手机功能的 公共接口来减少这种复杂性,而不必关心下层 硬件或网络。 电话 API使用 Symbian OS客户端朋艮务器框架, 并提供向电话服务器发送请求的 R类。服务器 反过来将请求传递给管理物理设备的适当电话 驱动器插件。 OS Comms架构 37 手机制造商利用电话 API提供手机上的电话 应用程序,使用户能够拨打电话及设置服务 选项。除了这个用途,电话 API可认为是低层 次的,主要用于其他更高级的 comms组件。例 如,套接字一节讲述了要求连接套接字的 应用程序请求如何最终拨号连接到 ISP。 如果确实需要从应用程序中直接使用电话, 你会发现一个难题:授权商通常选择在他们 的 SDK中不暴露过多的高级电话 API。所以, 除非你是授权商或 Symbian的合作伙伴,否则 应用程序有可能不能访问所有的手机电话功 能。 OS Comms架构 38 然而, SDK确实暴露了两个应用程序编程者通常 感兴趣的 API: ETel Core和 Third PartyTelephony。 ETel Core定义了一组几乎所有电话设备和服务 都支持的核心函数。应用程序可以直接使用它来 访问通用电话设备。该 API可细分为四个主要的 类,它们分别封装了与电话服务器、手机、线路 和呼叫的会话。 会话类 RTelServer:提供了对系统电话信息的访 问,特别是可用的手机和 TSY。 手机类 RPhone:对特定的电话设备进行抽象化。 它允许客户访问设备的状态和功能,并在它们改 变时得到通知。 OS Comms架构 39 线路类 RLine:代表属于手机的一条线路。客户 可以访问线路的状态和功能,并在它们改变时得 到通知。 最后,线路可以有零或多个激活的呼叫,呼叫由 RCall类进行封装。呼叫具有拨号、等待呼入以 及挂机等功能。前面一样,客户可以取得状态和 功能的信息,并在它们改变时得到通知。 OS Comms架构 40 可见, ETel Core具有相当直接和合理的结 构,而它的功能封装却比较简单。 Third Party Telephony API也 是如此,它为电话数据呼叫提供了一个高级接口。 它允许此 API用户发出电话呼叫、等待呼入或 检查线路状态。 此 API有单独一个类 CTelephony。调用者将一个 RComm(串口)对 象传递给 CTelephony对象,当呼叫建立后, 它利用该对象读写连接上的数据。 OS Comms架构 41 高级 API 现代移动电话标准提供的功能远不止接打电 话。 Symbian OS对基本 ETel Core API提供了 扩展,以支持对这些高级性能的使用。不过, 如前所述,这些扩展在 SDK中可能不提供。 主要的高级 API是 ETel Multimode,它扩展了 ETel Core API,以提供对用于多种空中接口 蜂窝标准(或模式)的公共移动电话服务的访 问。在 v7.0s版本中,模式有 GSM、 GPRS、 EDGE、 CDMA(IS-95)、 3GPP2 cdma2000 1x (版本 A)和 3GPP W-CDMA。该 API还为用于特 定标准的专用服务(如 GSM)提供访问。 OS Comms架构 42 其他高级电话 API有: ETel Multimode Packet Data:提供用于电话包 数据标准的公用 API,如 GPRS、 CDMAOne和 CDMA2000中的包数据。 SIM应用程序工具箱:提供一个 API,用于访问由 手机 SIM卡提供的功能。 完成电话 API的综述前,还要提到几个不太重要 的 API: 拨号:提供拨号相关的实用工具,如处理电话号 码。 电话簿同步器:同步化 Symbian OS手机上的两种 地址信息存储,即手机 ICC(在 GSM手机上称为 SIM卡)上的电话簿和联系人数据库。 OS Comms架构 43 最后,对传真的支持也和电话 API紧密相关: ETel传真客户用于运用 Symbian OS传真存储文件 收发传真。 Faxio API为传真编码和压缩提供库。 Fax存储 API用于 访问存储的传真。 随着电话框架的介绍,结束了对 Symbian OS comms架构中最重要组件的综述。现在可以进一 步介绍该架构所开发的很多具体 comms协议。 OS Comms架构 44 多媒体消息传送业务是开放移动联盟 (最 初由 WAP论坛 )定义的 个标准,用于发送 和接收具有丰富内容的消息,通过移动电 话网络,从用户发送到服务器,再发送到 用户。 MMS操作通过拨号 (CSD)或 GPRS连接,并 使用 WAP或 HTTP进行消息的传输和通知。 MMS消息本身与 MIME电子邮件消息类似, 它们包含定义消息属性的头部,还包含理 论上可以是任何媒体类型的 MIME正文。实 际上,希望的 MMS消息格式是 MIME内容类 型:多部分关联。 MMS 45 例如,消息包含一些多媒体对象,如图 片、声音和文字。第一个对象应该是一个 同步多媒体语言 (SMIL)文件, 个向客户 提供关于如何呈现消息中其他媒体对象的 XML文档。 如前所见, Symbian OS设备之间存在兼 容性问题的不仅仅是 comms, MMS的实现在 一般性 Symbian OS、 UIQ中的使用和 Series60之间也不同。这里所描述的 API 都是 Symbian版本。对于 Nokia版本,参见 Series 60 SDK文档的“ Desigming MMS Client Applications for the Series 60Plateform(为 Series 60平台设计 MMS客 户应用程序 )” 。 MMS 46 MTM及 API MMS:实现是通过消息传送框架的插件来提供 的,其中有些支持实用工具库 : MMS客户 MTM为 MMS消早的创建、检索、发 送、转发和回复等操作提供接口。 MMS服务器 MTM调用低层 comms组件来发送 和接收 MMS消息。它不具有客户接口。 MMS。实用工具库提供了封装 MMS消息及消 息头部和媒体对象等部分的类。 MMS 47 这些库不提供任何可供显示和编辑 MMS消 息的功能,也不提供其他任何用户接口操 作。不过,有一个库可以用来解析 SMIL文 档。实际上,如果将问题复杂化,可以说 有两个这样的库。一个原始库,称做 SMIL 解析器和设计器, (smiltranslator.lib), 它是为 v7.0s制作的。 v7.0s实际上对此方 法进行了改进,使其更加灵活,具有处理 各种特定 DTD的 XML,文档的能力。此 API 称为消息传送 XML支持 API。 v7.0API仍然 可用,但如果编码新代码,则最好使用新 API。 MMS 48 现在将完成一些涉及使用消息传送框架 和 MMS API来发送和接收 MMS消息的任务。 这些任务是: 连接消息服务器。 获取客户 MTM。 创建消息。 设置消息内容和属性。 发送消息。 接收消息。 MMS 49 服务器会话 消息传送框架围绕一个服务器程序为基 础,在执行消息传送之前,必须建立与它 的连接 (会话 )。会话类叫做 CMsvSession, 消息客户应用程序在启动时通常创建该类 的一个实例。客户端 MTM实例、用户接口 MTM和高层客户库类维护对消息客户应用 程序的会话对象的引用,以便在需要时, 它们可以向服务器发出请求。 MMS 50 /创建消息服务器会话 iMsvSession=CMsvSession:OpenSyncL(*thi s); OpenSyncL()方法接受一个 MMsvSessionObserver类型的参数,所以, 为使该代码工作,包含的类必须实现这个 观察器接口。它使服务器能够呼叫客户, 向它通知重要事件,如注册 个新 MTM。 MMS 51 客户 MTM 应用程序不能直接为它希望使用的 MTM创建对象, 它必须请求消息服务器为它创建该对象。所有安 装在机器上的 MTM组件的记录保存在一个由消息 服务器管理的专用注册文件中。注册类利用此注 册数据标识和实例化 MTM组件。例如, CClientMtmRegistry类有一个成员函数可用于创 建客户端 MTM对象: 消息客户应用程序调用该函数,传递它需要的 MTM组件的 UID。 CClientMtmRegistry搜索所需 MTM组件的记录注 册,并从中获得库名和可刨建 MTM对象的库导出 工厂函数的序数。 CClientMtmRegistry加载 DLL,并调用工厂函数, 将新对象传回调用者。 MMS 52 类似的处理用于用户接口和 UI数据 MTM。 这样的 MTM对象由创建它们的客户拥有。 客户还负责删除这些对象。 在当前示例中,需要 MMS客户 MTM,因此 要利用 CClientMtmRegistry: /创建客户注册对象 iClientMtmRegistry = CClientMtmRegistry:NewL(*iMsvSession); MMS 53 /请求 MMS客户 MTM对象 iMmsClientMtm = (CMmsClientMtm*)iClientMtmRegistry- NewMtmL(KUidMsgTypeMMS); 注册 NewMtmL()函数返回一个指向客户 MTM基类 CBaseMtm的指针,将它转换成 MMS 客户类 CMmsClientMtm。 MMS 54 消息创建和删除 在创建新消息前,需要决定在哪里存储 它。通常创建新记录的地方是草稿文件夹。 客户端 MTM具有当前项或上下文的概念, 在此进行操作,因此需要将当前项设置为 草稿文件夹。也许你还记得前面讨论的消 息结构,每个项均有一个标识符用以查阅。 草稿文件夹的标识符是 KMsvDraftEntryld, 在 API中公开。下 面的调用将当前项设置为该文件夹: MMS 55 /设置草稿文件夹的上下文 iMmsClientMtm- SwitchCurrentEntryL(KMsvDraftEntryI d); 在创建消息前,还需要设置它属于什么 服务。可以通过编程方式发现哪些服务是 可用的。下面的代码使用了消息项 ChildrenWithMtmL()函数来请求消息根项 下 MMS类型项的列表。由于服务都存储在 根下,这样将得到一个 MMS服务的列表。 MMS 56 /获取消息服务器根项 CMsvEntry* root=CMsvEntry: NewL ( *iMsvSession, KMsvRoot IndexEntryId, TMsvSelectionOrdering ( KMsvNoGrouping, EMsvSortByOescriPtlon); CleanupStack:PushL (root); /获取根的所有 MMS类型的子项 ID cmsvEntrySelection* Services = root- ChildrenWithMtmL (KUidMsgTypeNMS); CleanupStack:PushL(Services); MMS 57 /如果无 MMs服务则退出 if (services - Count() = 0) User:Leave(KErrNotFound); 该代码得到 MMS服务的 ID列表,如果没有 可用的 MMS,服务将退出。 消息传送还具有默认服务的概念,除非 用户指定了其他服务,否则将使用默认服 务。默认服务设置可通过类 CMsvDefaultServices找到。它们存储在 与根项关联的消息存储器中。下面的代码 从这个存储器中读取默认服务设置,并获 得 serviceld中默认 MMS服务的 ID。 MMS 58 CMsvDefaultServices* services = new(ELeave)CMsvDefaultServices; CleanupStack:PushL(services); TMsvId serviceId; if(root-HasStoreL() /如果根具有存储器,则恢复默认的服务 CMsvStore*store = root-ReadStoreL(); CleanupStack:PushL(store); services-RestoreL(*store); CteanupStack:PopAndDestroy(); /存 储器 MMS 59 TInt error = services- DefaultService(KUidMsgTypeMMS, serviceId); CleanupStack:PopAndDestroy(); /服务 经过这些准备之后,就可以直接创建消 息了: /创建新消息项 iMmsClientMtm- CreateMessageL(serviceId); 还可以分别用 CMmsClientMtm:ForwardL()和 CMmsClientMtm:ReplyL()通过转发或回 复已存在的 MMS消息来创建新消息。在这 些情形下,新消息创建时,从原始消息中 拷入适当的内容和头。 MMS 60 设置消息内容 下一项任务是设置消息的内容和头。客 户 MTM基 类 CBaseMtm定义了一些函数,大部分 MTM均可 以使用 它们来完成这项任务: SetSubjectL():设置消息主题。 Body():读取和设置正文文本。 AddAddresseeL():设置收件人。 CreateAttachmentL():添加附件。 MMS 61 然而, MMS消息的属性和内容比使用上述 通用函数所定义的要复杂得多。因此, API在它的类 CMmsClientMessage和基类 CMmsMessage中提供了 MMS消息的完整封装。 该消息类拥有个对象,该对象封装了消息 头 CMmsHeaders和一个 CMmsMediaObject对 象列表,每个对象均描述了一种多媒体对 象,如 SMIL或图像文件。 MMS 62 为了获取刚创建消息的 CMmsClientMessge对象, 使用如下调用: /将新项设置为一条 MMS消息 iMmsClientMessage = CMmsClientMessage:NewL(*iMsvSession, iMmsClientMtm-Entry() EntryId(); 这里, NewL()的第二个参数是 MMS消息的 ID。序列 iMmsClientMtm- Entry() Entryld()要求客户 MTM返回当 前项的 ID:因为 CreateMessageL()函数设 置当前项为新消息,返回新消息的 1D。 MMS 63 CMmsClientMessage对象承担舶第一项任 务是设置消息头。, MMS规范定义了很多 可以在 MMS消息头中设置的字段。其中一 些是强制性的,如消息类型、事务 ID、 MMS版本号、发件人地址、内容类型和至 少一个收件人地址字段 (To, Cc或 Bcc)。 除客户必须自行指定收件人外, MMS服务 器 MTM为所有强制字段给出了适当的值。 这一过程相当直接,下例是为消息设置了 一个 To收件人 (anewRecipient是一个指定 地址的描述符 )。 MMS 64 iMmsClientMessage- Headers().AddRecipientL(CMmsHeaders :ETo, aNewRecipient); 还可以设置可选字段。设置消息的主题: iMmsClientMessage- Headers().SetSubjectL(aSubject); MMS 65 媒体对象 消息的媒体内容通过添加一个或多个媒 体对象来定义。媒体对象可以通过 CMmsMessage:CreateMediaObjectL()添加。 CreateMediaObjectL()返回另一个 MMS实 用工具类 CMmsMediaObject对象。该对象 指定了拷贝媒体数据 (如图像或 SMIL文件 ) 的目标文件名。当添加媒体对象后,调用 者就可以指定该对象为消息的“根”对象: 通常是包含了其他对象表达的 SMIL文件。 下述代码添加一个根 SMIL文件,其文件名 在 smilFile中指定。 MMS 66 /要求创建 MO,传递根选项 MIME类型和文件 扩展名 /文件的 MIME类型 _LIT(KSMILMIME, application/smil); /文件的扩展名 _LIT(KSMILExt, .smil) ; CMmsMediaObject MMS 68 发送消息 也许令人惊讶,客户 MTM基类 CBaseMtm并 不提供发送消息的方法。然而,它为 MTM 提供了一种标准手段使 MTM特有的功能可 用。为此, MTM实现了两个虚方法 InvokeAsyncFunctionL()(用于异步操作 ) 和 InvokeSyncFunctionL()(,用于同步操 作 ),或只实现其中一个方法。许多 MTM利 用这些函数提供了发送消息的命令, MMS 通过 InvokeAsyncFunctionL()来完成。 MMS 69 函数的参数包括: 指定执行命令的参数。枚举 TMmsMtmCmds 定义了 MMS MTM特有操作的 ID: KMmsMtmSendMessage是发送命令的 ID。 要执行命令的消息 ID。 可拥有可选参数的缓冲 (这里不用 )。 异步操作的常用请求状态参数。 MMS 70 下述代码开始发送数组 ildToSend中列出 的消息,数组的类型是 CMsvEntrySelection。 TBuf8param; /未使用 /异步发送消息 CMsvOperation* msvOperation = iMmsClientMtm-InvokeAsyncFunctionL( KMmsMtmSendMessage, *iIdToSend, param, aCompletionStatus); MMS 71 消息 API的一个特性是,像这样完成异步 操作的函数,返回一个 CMsvOperation对 象。这就允许调用者得到操作的进度信息 (例如,发送了四条消息中的两条 ),并可 取消该操作。 发送消息的另一种方式是利用 CMsvEntry:CopyL(),将消息从本地文件 夹拷贝到远程服务项中。 结束关于 MMS的讨论前,再看看应用程序 怎样处理到达的消息。 MMS 72 到达的消息 消息传送架构声明了一对抽象接口,定 义了会话观察器和数据项观察器。会话观 察器必须实现接口 MMsvSesionObserver,它得到新消息到达、 新 MTM注册等事件通知。数据项观察器实 现了接口 MMsvEntryObserver,当更改或 访问各个数据项时,它得到事件通知。 为了处理到达的消息,需要一个会话观 察器类。接口只需实现一个函数: void HandleSessionEventL(TMsvSessionEvent aEvent, TAny* aArgl, TAny* aArg2, TAny* aArg3) = 0; MMS 73 TMsvSessionEvent参数说明发生了什么 类型的事件:其他参数根据事件类型,可 以提供与该事件有关的数据。对于到达的 MMS消息,两种事件类型需要处理: EMsvEntriesCreated 当通知新 MMS消 息到达手机时发生。 aArgl是包含新数据 顶的 CMsvEntrySelection,而 aArg2是父 数据项的 TMsvld。 EMsvEntriesChanged 当取得消息正文 并可运行或可显示时发生。该事件的参数 同 EMsvEntriesCreated。 MMS 74 由于 MMS消息不一定需要完全从服务器上 取得,所以有两个事件。而远程 MMS服务 器首先向手机发送一条通知,告知现有一 条新消息。此时, SymbianOS MMS实现在消息存储器中创建一个新数据项, 并设置那些通知可用的头字段 (其他字段 保持空值 )。随后,手机可以选择是否要 获得消息正文 (它的媒体对象 )。 MMS 75 取得数据可以自动或按请求进行。 MMS服 务可以用方法 CMmsSettings:SetAutomatiFetch()设置 为自动取得完整的消息。未设置自动取得 数据的地方,应用程序可以通过 CMmsClientMtm:InvokeAsyncFunctionL(), 利用 KMmsMtmFetchMessage或 KMmsMtmBackgroundFetchMessage命令明确地 请求取得数据。可以通过检查 TMsvEntry:Complete()标志是否为真, 来检查消息是否己完全取得。 MMS 76 另一个需小心的复杂之处是,观察器将 接收所有类型消息的通知,而不仅仅是 MMS。所以,处理 MMS的代码需保证首先检 查与 MMS消息相关的事件。下列代码可以 实现这一点,它假设 entries是包含新数 据项 ID的 CMsvEntrySelection。 MMS 77 TInt count = entries-Count(); while (count- !=0) const TMsvId id=(*entries)count; CMsvEntry* msvEntry = iMsvSession- GetEntryL(id); CleanupStack:PushL(msvEntry); if(msvEntry-Entry() .iMtm = KUidMsgTypeMMS) ProcessMyMmsL(id); CleanupStack:PopAndDestroy (msvEntry); MMS 78 如果应用程序只想要处理 MMS消息,而不 是处理所有类型的消息,就需要读取消息 并检查一些特征,比如主题,检查是否需 要处理它。这可以通过为该消息实例化一 个新的 CMmsClientMessage并访问所需的 头字段来完成。如果决定应用程序必须处理 该消息,可以阻止用户从标准消息应用程 序的收件箱中看到它。为了做到这一点, 用 TMsvEntry:SetVisible()将消息项的 可见标志置为否。 MMS
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!