青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

franksunny的個人技術空間
獲得人生中的成功需要的專注與堅持不懈多過天才與機會。 ——C.W. Wendte

 

Symbian端彩信讀取初探

 

上周由于項目需要對彩信讀取進行了預研,雖然并未涉及彩信的攔截,只是對Symbian S60手機收件箱中的彩信和彩信通知的內容進行提取并分析,但是也算是趟了下之前一直沒有搞過的彩信這渾水,小結一下。為了體現分析過程的邏輯性,下文并非是由簡入繁,而是采用由已知到未知的說明過程來進行。

彩信和彩信通知的區別

正如前面博文《Symbian OS中的消息存儲與常用操作》中提及的那樣,手機中的各種消息都是以數據項(Entry)形式供程序操作,鑒于Nokia之前的SDK有眾多API采用非公開的方式,很多東西碰上了只能拼命的試,試通了就算OK了,短信就是這個樣子的,自從Cxt將發送短信的代碼調通后,目前用的代碼基本都是他那份原型。寫了這么多只想說雖然手機中的各種消息都是以數據項形式給出的,但是數據項又由文件夾類型、消息類型、附件類型和服務類型的數據項,我們所指的消息如短信、彩信和郵箱乃至用戶自定義的一些消息等等都是消息類型的數據項即KuidMsvMessageEntry類型。既然消息類型的數據項這么多,那么如何區分呢,這就靠各自不同的Mtm類型,由于SDK沒有系統性闡述,我們雖然已經知道短信的類型是KUidMsgTypeSMS,但是彩信的Mtm類型值到底是什么,它跟彩信通知是否是有區分的,我們不得而知。

沒辦法只能通過數據項的通用操作,對手機中已存的彩信和彩信通知進行讀取后進行分析內容,才得知彩信和彩信通知是兩個完全不同的Mtm類型值,一個是0x100058E1,另一個是0x100059C8,后來通過google搜索才知道前者的宏定義類型為KuidMsgTypeMultimedia,后者的宏定義類型為KUidMsgMMSNotification,兩者在mmsconst.h頭文件中有定義。

同樣使用通用的數據項操作,我們可以獲取彩信和彩信通知消息數據項的消息存儲CMsvStore和附件情況,兩者的CMsvStore都是有數據的(SizeL()函數返回都是大于0的),但是卻沒有文本體(HasBodyTextL()返回都是Efalse);另外彩信都是有附件的,而彩信通知一般是沒有附件的。

因為附件本身也是數據項(KuidMsvAttachmentEntry類型的數據項),所以我們可以更進一步通過通用的數據項操作將彩信的所有附件全部都讀取出來。而附件類型由文件類型、鏈接類型和數據項類型三種,通常彩信中的附件都是文件類型的附件,我們用以下代碼來演示將附件拷貝出來

CMsvStore* inboxStore= iSmsMtm->Entry().ReadStoreL();

CleanupStack::PushL(inboxStore);

 

MMsvAttachmentManager& attachManager = inboxStore->AttachmentManagerL();

TInt attachmentCount = attachManager.AttachmentCount();

for(TInt i=0;i< attachmentCount;i++)

{

    CMsvAttachment *attachment = attachManager.GetAttachmentInfoL(i);

    CleanupStack::PushL(attachment);

 

    if(type != CMsvAttachment::EMsvMessageEntry)

    {

        TFileName newPath(_L("c:\\data\\"));

        newPath.AppendNum(aMessageId);

        newPath.Append(_L("LLF"));

        newPath.Append(attachment->AttachmentName());

        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.Write(ptrBuf);

        newFile.Close();

        CleanupStack::PopAndDestroy(buf); 

    }

    CleanupStack::PopAndDestroy();

}

 

CleanupStack::PopAndDestroy();

為了更加直觀的區分各個附件隸屬于不同的消息,為此以消息ID打頭并加LLF來區分附件的各個文件,一條家庭生活報的彩信,我獲取到13個附件的截圖如下

其中有smil文件,有圖片文件,也有文本文件。

使用通用的數據項操作方法,借助SDK我們對彩信和彩信通知的內容區別和內容分析只能到這里了。

 

彩信的內容分析

顯然如果僅僅知道以上內容還是不夠的,困擾我們的CMsvStore里面到底有些什么東西呢?暫時從代碼里面走出去,我們來參閱下Nokia發布的一份難得的中文文檔《CH_How_To_Create_MMS_Services_v4_0.pdf》(詳見附件),正如短信有短信的PDU一樣,彩信也是有其PDU的,這個PDU就在這個文檔的第五部分,在這里就不詳述了,從里面截個圖過來說明下問題。

由這個MMSPDU,我們可以猜想下附件就是Message Body,CMsvStore是否就是MMS Header的內容呢?

幸好現在NokiaSymbian開源了,否則這個猜想是沒有辦法揭開了,通過Symbian網站上的源代碼瀏覽器,我們可以搜到彩信相關的源代碼位于sf\app\messaging文件夾下,但是這個里面除了彩信之外,短信也有,郵箱也有,到底該如何找到需要的彩信呢,我們知道短信其實也有短信頭的,在SDK中有提供CSmsHeader,懷疑彩信也應該有這么頭才是,于是用C*Header搜索文件夾,過來能夠搜索到一個mmsheaders.h頭文件中有一個CMmsHeaders,找到了這個離勝利就不遠了,聯想到短信讀取時有一個CSmsClientMtm::LoadMessageL()函數,索性就找找有沒有一個CMmsClientMtm::LoadMessageL()函數的,通過sf\app\messaging\mmsengine\clientmtm\src文件加下的mmsclient.cpp果然能找到這個函數,其源代碼如下

// ---------------------------------------------------------

// CMmsClientMtm::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.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 headers 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.

    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 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 here

    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 ) )

        {

        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 ) )

        {

        stream.OpenLC( aStore, KUidMMsMMBoxMessageHeaderStream ); // pushes 'stream' to the stack

        iMmBoxMessageHeaders = CMmsMMBoxMessageHeaders::NewL();

        iMmBoxMessageHeaders->InternalizeL( stream );

        CleanupStack::PopAndDestroy( &stream ); // close stream

        }

    if ( aStore.IsPresentL( KUidMMsMMBoxViewHeadersStream ) )

        {

        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; // 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 stack

        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

        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 );

            }

       

        CleanupStack::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 );

            }

        length = stream.ReadInt32L();

        if ( length > 0 )

            {

            iReplaceCancelId = HBufC8::NewL( stream, length );

            }

        iCancelStatus = stream.ReadInt32L();

        CleanupStack::PopAndDestroy( &stream ); // close stream

        }

       

    }

一來由于時間倉促,二來開源的代碼頭文件和相關庫等要拷入工程中去,所以具體的編碼調試驗證就留給以后正式要用的時候再進行了。

 

彩信通知的內容分析

以上對彩信的內容分析算是告一個段落了,我們再回過頭來看看這個彩信通知,這個消息類型的數據項其mtmKUidMsgMMSNotification,那么這個客戶端的MTm到底是什么,繼續搜索源碼,發現在sf\app\messaging\mmsengine\clientmtm\src有一個mmsnotificationclient.cpp其內部正好是CmmsNotificationClientMtm。本來以為其會跟彩信一樣比較容易看出結果來,誰知道這個類的源碼看了下,感覺有點殘缺的味道,里面也有用到彩信的頭CMmsHeaders,因為CMmsHeaders就沒有去深入,這下也只能打住了。而且還有一個疑問,如何通過這個彩信通知來編程實現手動去獲取彩信,又是一個比較繁瑣的問題,搜了下源碼貌似跟sf\app\messaging\mobilemessaging\mmsui\notmtmsrc文件下的源碼有關??磥磉@趟渾水不太清啊,就此打住了。

 

暫時將Symbian端的彩信讀取分析到這里。以后有機會再繼續趟這渾水。

 

按照常規,由于貼圖不會搞,如果需要詳盡文檔,請下載以下word文檔和諾基亞官方文檔rar的鏈接
彩信初探.rar

注意:
目前在6730機子上對草稿箱彩信進行試驗時發現
編輯的彩信假如沒有經過發送,那么通過之前的attachment->AttachmentName()無法獲得附件的文件名;但是在N81等機子上是能夠獲取到的。雖然通過attachment->AttachmentName()無法獲取,但是目前發現通過attachment->FilePath()卻可以得到完整的文件路徑,為此附件文件名的獲取,假設attachment->AttachmentName()獲取不到,那么將采用attachment->FilePath()獲取文件路徑后進行文件名提取的方法來實現比較可靠一些。

posted on 2010-07-28 21:16 frank.sunny 閱讀(2568) 評論(0)  編輯 收藏 引用 所屬分類: symbian 開發

常用鏈接

留言簿(13)

隨筆分類

個人其它博客

基礎知識鏈接

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲人精品午夜在线观看| 亚洲欧洲视频| 欧美成人伊人久久综合网| 欧美影院午夜播放| 久久视频国产精品免费视频在线| 性欧美video另类hd性玩具| 一区二区日韩精品| 亚洲欧美日本伦理| 久久精品日韩| 欧美成人精品一区| 亚洲麻豆视频| 欧美一级理论性理论a| 欧美专区在线观看| 欧美成人嫩草网站| 欧美午夜在线视频| 国产一区二区三区在线观看视频| 韩国精品久久久999| 亚洲精品一区久久久久久| 香蕉尹人综合在线观看| 乱人伦精品视频在线观看| 亚洲精品视频啊美女在线直播| 亚洲一区在线观看视频| 久久天堂国产精品| 国产精品亚洲一区| 亚洲精品社区| 久久综合婷婷| 亚洲免费影视第一页| 欧美 日韩 国产 一区| 国产精品一区二区a| 99av国产精品欲麻豆| 久久久青草青青国产亚洲免观| 亚洲日本欧美在线| 久久亚洲欧美国产精品乐播| 国产精品都在这里| 最新中文字幕亚洲| 久久视频在线看| 亚洲一区二区欧美| 欧美极品aⅴ影院| 伊人精品视频| 久久九九精品| 亚洲欧美国产va在线影院| 欧美老女人xx| 91久久精品国产| 免费精品99久久国产综合精品| 亚洲一区二区在线| 欧美午夜不卡在线观看免费| 亚洲精选一区| 亚洲福利视频网| 久久久女女女女999久久| 国产亚洲欧美一区| 欧美一级网站| 欧美一级大片在线免费观看| 国产精品专区h在线观看| 亚洲一区二区三区涩| 99国产精品久久久久久久| 欧美激情影院| 一本久久精品一区二区| 亚洲破处大片| 欧美日韩综合视频| 亚洲丝袜av一区| 一本久道久久综合狠狠爱| 欧美日韩在线影院| 亚洲欧美日韩一区| 在线一区二区三区四区五区| 欧美三区在线视频| 欧美日韩国产色视频| 夜夜精品视频一区二区| 亚洲毛片一区二区| 国产精品第2页| 午夜在线视频一区二区区别| 亚洲欧美日韩国产成人| 国产人久久人人人人爽| 久久视频在线看| 裸体一区二区| 日韩视频免费大全中文字幕| 亚洲伦理在线观看| 国产精品每日更新| 久久久久久亚洲综合影院红桃| 久久久久久亚洲精品不卡4k岛国| 在线观看av一区| 亚洲欧洲日本国产| 国产精品久久久一本精品| 久久福利电影| 女人香蕉久久**毛片精品| 国产精品99久久久久久人| 午夜精品999| 亚洲第一福利社区| 日韩一区二区精品葵司在线| 国产精品私拍pans大尺度在线| 久久亚洲春色中文字幕久久久| 免费在线看一区| 亚洲欧美日韩综合aⅴ视频| 久久激情五月激情| 一本色道久久综合狠狠躁篇的优点| 亚洲综合成人在线| 亚洲国产一区二区三区a毛片| 99re这里只有精品6| 国产日本欧洲亚洲| 亚洲精品国产精品乱码不99按摩| 国产老肥熟一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美激情aaaa| 欧美视频在线看| 欧美freesex8一10精品| 国产精品久在线观看| 欧美高潮视频| 国产一区二区欧美| 中日韩视频在线观看| 91久久夜色精品国产网站| 欧美一级大片在线免费观看| 一区二区三区.www| 玖玖精品视频| 久久免费精品视频| 国产精品卡一卡二| 亚洲精品三级| 99www免费人成精品| 另类欧美日韩国产在线| 久久久久久香蕉网| 国产欧美精品va在线观看| 一区二区三区欧美视频| 99在线|亚洲一区二区| 免费av成人在线| 老司机一区二区| 国语自产在线不卡| 亚洲欧美在线免费观看| 亚洲视频一二三| 欧美日韩视频在线第一区| 亚洲日本中文| 榴莲视频成人在线观看| 久热精品视频在线观看| 国产欧美精品在线播放| 国产精品99久久久久久久久| 亚洲午夜激情免费视频| 欧美日韩高清在线播放| 亚洲清纯自拍| 亚洲午夜精品视频| 国产精品久久久久免费a∨| 一区二区三区.www| 亚洲欧美在线磁力| 国产精品视频不卡| 亚洲欧美中日韩| 久久久久久久综合日本| 国模私拍视频一区| 久久一区二区三区四区| 欧美不卡一卡二卡免费版| 亚洲福利视频在线| 欧美国产日韩一区二区在线观看 | 国产精品亚洲激情| 香蕉久久夜色| 噜噜噜91成人网| 亚洲精品乱码| 欧美午夜宅男影院| 午夜日韩电影| 欧美不卡视频一区发布| av成人福利| 国产欧美 在线欧美| 久久久久成人精品免费播放动漫| 免费成人美女女| 亚洲精品日日夜夜| 国产精品久久夜| 久久国产成人| 亚洲欧洲一区| 久久福利资源站| 在线观看三级视频欧美| 欧美另类一区二区三区| 亚洲永久免费精品| 欧美大色视频| 亚洲欧洲99久久| 精品福利免费观看| 欧美精品激情在线| 欧美亚洲综合网| 亚洲久久一区| 久久综合色一综合色88| 亚洲图片欧美日产| 伊人精品视频| 国产精品中文在线| 欧美激情日韩| 久久久久久高潮国产精品视| 国产精品99久久久久久久久| 美女脱光内衣内裤视频久久影院 | 亚洲国产三级在线| 久久国产精彩视频| 一区二区三区四区五区精品视频| 国产亚洲精品久| 欧美午夜精品久久久久免费视| 久久蜜桃资源一区二区老牛 | 国产日韩视频| 欧美日韩不卡在线| 老司机免费视频一区二区三区| 午夜性色一区二区三区免费视频| 亚洲黄一区二区三区| 国产精品揄拍一区二区| 欧美日韩一区二区欧美激情| 老司机成人在线视频| 久久国产精品72免费观看| 中文无字幕一区二区三区| 亚洲人体偷拍| 欧美激情一二区| 你懂的国产精品永久在线| 久久精品国产99精品国产亚洲性色 |