Ø 重要的概念术语
MTM:Message Type Module,是一组的用来处理不同类型消息的模块
Entry:数据项,描述消息分层结构中每一个结点属性的数据结构
Session:会话,是symbian的client/server通讯的基础,在客户端提供接口,服务器提供接口的实现
Ø symbian的消息组织结构
手机中的各种消息都是以数据项(Entry)形式供程序操作,数据项有4种类型, Symbian
OS为每种数据项提供了相应的常量标识UID,这些UID保存在msvuids.h文件中:
Ø 文件夹类型, 对应常量UID为KUidMsvFolderEntry,和PC上的文件系统一样,每个文
件夹可以包含其它数据项也可能是其它数据项的子数据项。
Ø 消息类型,对应常量UID为KUidMsvMessageEntry,它表示该数据项是一条消息。
Ø 附件类型,对应常量UID为KUidMsvAttachmentEntry,它表示该数据项是某条信息的
附件。
Ø 服务类型,对应常量UID为KUidMsvServiceEntry,服务数据项包含某个消息服务的配置信息,在一般情况还拥有通过该服务收发的消息数据项。
除了上面提到的四种类型UID还有常用到的UID是KUidMsvRootEntry(msvids.h),它指的是根数据项,根数据项包含了4个标准文件夹数据项,分别是收件箱(KMsvGlobalInBoxIndexEntryId)、发件箱(KMsvGlobalOutBoxIndexEntryId)、草稿箱(KMsvDraftEntryId)和已发送项(KMsvSentEntryId),另外根数据项下面还包含有各种消息服务的服务项。(具体参考http://blog.youkuaiyun.com/beover1984)
Ø 创建MMS和发送MMS
(1) 创建MMS
// switch to draft box
iMmsMtm->SwitchCurrentEntryL(KMsvDraftEntryId);
// create a new mms with default settings
iMmsMtm->CreateMessageL(iMmsMtm->DefaultSettingsL());
CMsvEntry& serverEntry = iMmsMtm->Entry();
TMsvEntry entry(serverEntry.Entry());
entry.SetInPreparation(EFalse);
entry.SetVisible(ETrue);
entry.SetSendingState(KMsvSendStateWaiting);
entry.iDate.HomeTime();
serverEntry.ChangeL(entry);
(2) 添加附件
// check if the mobile support attachments
if(iAttachFileName != NULL &&
iMmsMtm->QueryCapability(KUidMtmQuerySupportAttachments, queryResponse) == KErrNone)
{
TMsvId attID = KMsvNullIndexEntryId;
iMmsMtm->CreateAttachment 2L (attID, *iAttachFileName);
iMmsMtm->SetMessageRootL(attID);
iMmsMtm->SaveMessageL();
}
// add text body
RFileWriteStream txtFile;
txtFile.Replace(CCoeEnv::Static()->FsSession(), _L("c://warning.txt"), EFileWrite|EFileShareAny);
txtFile.WriteL(iMessageText);
txtFile.Close();
TMsvId attID = KMsvNullIndexEntryId;
iMmsMtm->CreateAttachment 2L (attID, _L("c://warning.txt"));
iMmsMtm->SetMessageRootL(attID);
iMmsMtm->SaveMessageL();
(3) 发送MMS
// sync send mms
CMsvOperationWait * wait = CMsvOperationWait::NewLC();
wait->iStatus = KRequestPending;
CMsvOperation* op = NULL;
op = iMmsMtm->SendL(wait->iStatus);
wait->Start();
CleanupStack::PushL(op);
CActiveScheduler::Start();
while (wait->iStatus.Int() == KRequestPending)
{
CActiveScheduler::Start();
}
CleanupStack::PopAndDestroy(2);