Symbian端彩信读取初探_第1页
Symbian端彩信读取初探_第2页
Symbian端彩信读取初探_第3页
Symbian端彩信读取初探_第4页
Symbian端彩信读取初探_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.:.;Symbian端彩信读取初探上周由于工程需求对彩信读取进展了预研,虽然并未涉及彩信的拦截,只是对Symbian S60手机收件箱中的彩信和彩信通知的内容进展提取并分析,但是也算是趟了下之前不断没有搞过的彩信这浑水,小结一下。为了表达分析过程的逻辑性,下文并非是由简入繁,而是采用由知到未知的阐明过程来进展。彩信和彩信通知的区别正如前面博文中提及的那样,手机中的各种音讯都是以数据项Entry方式供程序操作,鉴于Nokia之前的SDK有众多API采用非公开的方式,很多东西碰上了只能拼命的试,试通了就算OK了,短信就是这个样子的,自从Cxt将发送短信的代码调通后,目前用的代码根本都是他那份原型

2、。写了这么多只想说虽然手机中的各种音讯都是以数据项方式给出的,但是数据项又由文件夹类型、音讯类型、附件类型和效力类型的数据项,我们所指的音讯如短信、彩信和邮箱乃至用户自定义的一些音讯等等都是音讯类型的数据项即KuidMsvMessageEntry类型。既然音讯类型的数据项这么多,那么如何区分呢,这就靠各自不同的Mtm类型,由于SDK没有系统性论述,我们虽然曾经知道短信的类型是KUidMsgTypeSMS,但是彩信的Mtm类型值究竟是什么,它跟彩信通知能否是有区分的,我们不得而知。没方法只能经过数据项的通用操作,对手机中已存的彩信和彩信通知进展读取后进展分析内容,才得知彩信和彩信通知是两个完全不

3、同的Mtm类型值,一个是0 x100058E1,另一个是0 x100059C8,后来经过google搜索才知道前者的宏定义类型为KuidMsgTypeMultimedia,后者的宏定义类型为KUidMsgMMSNotification,两者在mmsconst.h头文件中有定义。同样运用通用的数据项操作,我们可以获取彩信和彩信通知音讯数据项的音讯存储CMsvStore和附件情况,两者的CMsvStore都是有数据的SizeL()函数前往都是大于0的,但是却没有文本体HasBodyTextL()前往都是Efalse;另外彩信都是有附件的,而彩信通知普通是没有附件的。由于附件本身也是数据项KuidM

4、svAttachmentEntry类型的数据项,所以我们可以更进一步经过通用的数据项操作将彩信的一切附件全部都读取出来。而附件类型由文件类型、链接类型和数据项类型三种,通常彩信中的附件都是文件类型的附件,我们用以下代码来演示将附件拷贝出来CMsvStore* inboxStore= iSmsMtm-Entry().ReadStoreL();CleanupStack:PushL(inboxStore);MMsvAttachmentManager& attachManager = inboxStore-AttachmentManagerL();TInt attachmentCount = atta

5、chManager.AttachmentCount();for(TInt i=0;iAttachmentName();RFile file = attachManager.GetAttachmentFileL(i);TInt size(0);file.Size(size);HBufC8 *buf = HBufC8:NewLC(size);TPtr8 ptrBuf(buf-Des();file.Read(ptrBuf, size);RFile newFile;User:LeaveIfError(newFile.Replace(iFs, newPath, EFileWrite);newFile.W

6、rite(ptrBuf);newFile.Close();CleanupStack:PopAndDestroy(buf); CleanupStack:PopAndDestroy();CleanupStack:PopAndDestroy();为了更加直观的区分各个附件隶属于不同的音讯,为此以音讯ID打头并加LLF来区分附件的各个文件,一条家庭生活报的彩信,我获取到13个附件的截图如下其中有smil文件,有图片文件,也有文本文件。运用通用的数据项操作方法,借助SDK我们对彩信和彩信通知的内容区别和内容分析只能到这里了。彩信的内容分析显然假设仅仅知道以上内容还是不够的,困扰我们的CMsvStore里

7、面究竟有些什么东西呢?暂时从代码里面走出去,我们来参阅下Nokia发布的一份难得的中文文档详见附件,正如短信有短信的PDU一样,彩信也是有其PDU的,这个PDU就在这个文档的第五部分,在这里就不详述了,从里面截个图过来阐明下问题。由这个MMS的PDU,我们可以猜测下附件就是Message Body,而CMsvStore能否就是MMS Header的内容呢?幸好如今Nokia将Symbian开源了,否那么这个猜测是没有方法揭开了,经过Symbian网站上的源代码阅读器,我们可以搜到彩信相关的源代码位于sfappmessaging文件夹下,但是这个里面除了彩信之外,短信也有,邮箱也有,究竟该如何找

8、到需求的彩信呢,我们知道短信其实也有短信头的,在SDK中有提供CSmsHeader,疑心彩信也应该有这么头才是,于是用C*Header搜索文件夹,过来可以搜索到一个mmsheaders.h头文件中有一个CMmsHeaders,找到了这个离胜利就不远了,联想到短信读取时有一个CSmsClientMtm:LoadMessageL()函数,索性就找找有没有一个CMmsClientMtm:LoadMessageL()函数的,经过sfappmessagingmmsengineclientmtmsrc文件加下的mmsclient.cpp果然能找到这个函数,其源代码如下/ -/ CMmsClientMtm:

9、LoadMessageL/ Loads the multimedia message/ -/void CMmsClientMtm:LoadMessageL() / First we should assert that iMsvEntry is not NULL, and panic, if it is _ASSERT_DEBUG( iMsvEntry, gPanic( EMmsNoCMsvEntrySet ) ); / LoadMessageL should only be supported for message entries. if ( iMsvEntry-Entry().iType

10、.iUid != KUidMsvMessageEntryValue ) iAttributes-Reset(); iMmsHeaders-Reset(); iAddresseeList-Reset(); return; / Old data must be reset first. iAttributes-Reset(); / load the correct data / get read-only message store CMsvStore* store = iMsvEntry-ReadStoreL(); CleanupStack:PushL( store ); / restore h

11、eaders of multimedia message / Attachment info is not restored. / It makes no sense to cache the attachment info as new attachments / can be added with the help of the attachment magager without / informing MMS Client MTM of the additions. / Caller must use attachment manager to get attachment info.

12、 iMmsHeaders-RestoreL( *store ); RestoreAttributesL( *store ); CleanupStack:PopAndDestroy( store ); store = NULL; / Build the iAddresseeList up BuildAddresseeListL(); 留意源码中红色字体部分,我是英盲,所以也不论这个restore是啥意思,直接看CMmsHeaders里面的头文件定义和源码头文件定义 /* * Internalize the headers. * param aStore CMsvStore */ IMPORT_C

13、 void RestoreL( CMsvStore& aStore );其实看了头文件里面的定义注释,初始化头,参数是CMsvStore我们就知道是怎样回事了,不过既然有源码,那就还是贴下源码,至于分析我就不做了,反正跟短信读取CSmsHeader一样,操作这个CMmsHeaders。/ -/ CMmsHeaders:RestoreL/ -/EXPORT_C void CMmsHeaders:RestoreL( CMsvStore& aStore ) RMsvReadStream stream; Reset( NULL ); / all old pointers are deleted her

14、e if ( aStore.IsPresentL( KUidMmsHeaderStream ) ) stream.OpenLC( aStore, KUidMmsHeaderStream ); / pushes stream to the stack InternalizeL( stream ); CleanupStack:PopAndDestroy( &stream ); / close stream / restore MMBox header streams if present if ( aStore.IsPresentL( KUidMMsElementDescriptorStream

15、) ) stream.OpenLC( aStore, KUidMMsElementDescriptorStream ); / pushes stream to the stack iElementDescriptor = new( ELeave )CMmsElementDescriptor; iElementDescriptor-InternalizeL( stream ); CleanupStack:PopAndDestroy( &stream ); / close stream if ( aStore.IsPresentL( KUidMMsMMBoxMessageHeaderStream

16、) ) stream.OpenLC( aStore, KUidMMsMMBoxMessageHeaderStream ); / pushes stream to the stack iMmBoxMessageHeaders = CMmsMMBoxMessageHeaders:NewL(); iMmBoxMessageHeaders-InternalizeL( stream ); CleanupStack:PopAndDestroy( &stream ); / close stream if ( aStore.IsPresentL( KUidMMsMMBoxViewHeadersStream )

17、 ) stream.OpenLC( aStore, KUidMMsMMBoxViewHeadersStream ); / pushes stream to the stack iMmBoxViewHeaders = new( ELeave )CMmsMMBoxViewHeaders; iMmBoxViewHeaders-InternalizeL( stream ); CleanupStack:PopAndDestroy( &stream ); / close stream / Extended notification also restored here TInt length = 0; /

18、 string length / Completeness indicator is not saved or restored. / If we have stored the text, it normally indicates that the message is not complete if ( aStore.IsPresentL( KUidMMsExtendedNotificationStream ) ) stream.OpenLC( aStore, KUidMMsExtendedNotificationStream ); / pushes stream to the stac

19、k length = stream.ReadInt32L(); if ( length 0 ) iExtendedNotificationText = HBufC:NewL( stream, length ); CleanupStack:PopAndDestroy( &stream ); / close stream if ( aStore.IsPresentL( KUidMmsApplicationInfoStream ) ) stream.OpenLC( aStore, KUidMmsApplicationInfoStream ); / pushes stream to the stack

20、 length = stream.ReadInt32L(); if ( length 0 ) iApplicationId = HBufC:NewL( stream, length ); length = stream.ReadInt32L(); if ( length 0 ) iReplyToApplicationId = HBufC:NewL( stream, length ); length = stream.ReadInt32L(); if ( length 0 ) iApplicationInfo = HBufC8:NewL( stream, length ); CleanupSta

21、ck:PopAndDestroy( &stream ); / close stream if ( aStore.IsPresentL( KUidMmsReserved ) ) stream.OpenLC( aStore, KUidMmsReserved ); / pushes stream to the stack iRecommendedRetrievalMode = stream.ReadInt32L(); length = stream.ReadInt32L(); if ( length 0 ) iRecommendedRetrievalModeText = HBufC16:NewL( stream, length );

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论