zoukankan      html  css  js  c++  java
  • Reading messages stored on SIM card

    Contents

    [hide]

    <?NOINDEX-END?>

    Overview

    This code example can be used to read the SMS messages stored in the SIM card.

    Preconditions

    The class should be derived from MMsvSessionObserver.

    MMP file

    // .mmp
    ...
    CAPABILITY ReadUserData WriteUserData NetworkServices
    ...
    LIBRARY msgs.lib // CMsvSession
    LIBRARY smcm.lib // TSmsUtilities
    LIBRARY gsmu.lib // CSmsPDU
    ...

    Header file

    // .h
    ...
    #include <msvapi.h> // MMsvSessionObserver
    ...
    protected: // MMsvSessionObserver
    void HandleSessionEventL(TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3);
    ...

    Source file

    // .cpp
    ...
    #include <MTCLREG.h> // CClientMtmRegistry
    #include <smsclnt.h> // CSmsClientMtm
    #include <smscmds.h> // ESmsMtmCommandEnumeratePhoneStores
    #include <TXTRICH.H> // CRichText
    ...
    _LIT(KFileName, "e:\\simcardx.txt");
    RFs& fs = CCoeEnv::Static()->FsSession();
    TUint mode = EFileWrite+EFileStreamText+EFileShareAny;
    RFileWriteStream file;
    User::LeaveIfError(file.Replace(fs, KFileName, mode));
    CleanupClosePushL(file);
    file.WriteUint16L(0xFEFF); // Windows unicode file header.
     
    CMsvSession* msvs = CMsvSession::OpenAsyncL(*this);
    CleanupStack::PushL(msvs);
    CClientMtmRegistry* reg = CClientMtmRegistry::NewL(*msvs);
    CleanupStack::PushL(reg);
    CSmsClientMtm* mtm = static_cast<CSmsClientMtm*>(reg->NewMtmL(KUidMsgTypeSMS));
    CleanupStack::PushL(mtm);
    TMsvId imFolderId=0;
    {
    // Reads the SMS messages on the SIM and creates a copy of those
    // messages in an invisible folder under the SMS service in the
    // message store. If successful, the imFolderId member of the
    // operation's progress identifies the invisible folder which
    // contains the messages read from the SIM card.
    CMsvEntry* serviceEntry = msvs->GetEntryL(KMsvRootIndexEntryId);
    CleanupStack::PushL(serviceEntry);
    TMsvId serviceId;
    TSmsUtilities::ServiceIdL(*serviceEntry, serviceId, KUidMsgTypeSMS);
    CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection();
    CleanupStack::PushL(selection);
    selection->AppendL(serviceId);
    TBuf8<1> emp (KNullDesC8);
    CMsvOperationActiveSchedulerWait* waiter = CMsvOperationActiveSchedulerWait::NewLC();
    CMsvOperation* operation = mtm->InvokeAsyncFunctionL(ESmsMtmCommandEnumeratePhoneStores, *selection, emp, waiter->iStatus);
    CleanupStack::PushL(operation);
    waiter->Start();
    User::LeaveIfError(waiter->iStatus.Int());
    TSmsProgressBuf progressBuf;
    progressBuf.Copy(operation->ProgressL());
    CleanupStack::PopAndDestroy(operation);
    TSmsProgress progress = progressBuf();
    if (!progress.iError)
    {
    //identify the invisible folder that contains the messages read from the phone store(SIM)
    simFolderId = progress.iEnumerateFolder;
    }
    CleanupStack::PopAndDestroy(waiter);
    CleanupStack::PopAndDestroy(selection);
    CleanupStack::PopAndDestroy(serviceEntry);
    }
    {
    // Now iterate through all the SMS entries in the invisible folder
    // and output their info to a text file
    TMsvSelectionOrdering sort;
    sort.SetShowInvisibleEntries(ETrue); // To handle invisible entries also
    CMsvEntry* inboxContext=CMsvEntry::NewL(*msvs,simFolderId ,sort);
    CleanupStack::PushL(inboxContext);
    CMsvEntrySelection* entries = inboxContext->ChildrenL();
    CleanupStack::PushL( entries );
    TInt count=entries->Count();
    for (TInt i=0; i<count; i++)
    {
    TMsvId entryID = entries->At(i);
    mtm->SwitchCurrentEntryL(entryID);
    CMsvEntry* entry= msvs->GetEntryL(entryID);
    CleanupStack::PushL(entry);
    TMsvEntry entry1 = entry->Entry();
    CMsvStore* inboxStore= entry->ReadStoreL();
    CleanupStack::PushL(inboxStore);
    // if this is a SMS message and not empty
    if ((entry1.iMtm==KUidMsgTypeSMS)&&(inboxStore->HasBodyTextL()))
    {
    mtm->LoadMessageL();
    // the message body
    CRichText& richText= mtm->Body();
    inboxStore->RestoreBodyTextL(richText);
    const TInt length = richText.DocumentLength();
    TPtrC body = richText.Read(0,length);
    if(body.Length()>0)
    {
    _LIT(KComma, ",");
    _LIT(KCrLf, "\x0D\x0A");
    _LIT(KFormat, "%F%Y-%M-%D %H:%T:%S.%C");
    // the Recipient Number or its Contact's Name (if available)
    file.WriteL(entry1.iDetails);
    file.WriteL(KComma);
     
    // the Recipient Number
    TPtrC number = mtm->SmsHeader().FromAddress();
    file.WriteL(number);
    file.WriteL(KComma);
     
    // the received date
    TBuf<32> buf;
    entry1.iDate.FormatL(buf, KFormat);
    file.WriteL(buf);
    file.WriteL(KComma);
     
    file.WriteL(body);
     
    file.WriteL(KCrLf);
    }
    }
    CleanupStack::PopAndDestroy(inboxStore);
    CleanupStack::PopAndDestroy(entry);
    }
    CleanupStack::PopAndDestroy(entries);
    CleanupStack::PopAndDestroy(inboxContext);
    }
    CleanupStack::PopAndDestroy(mtm);
    CleanupStack::PopAndDestroy(reg);
    CleanupStack::PopAndDestroy(msvs);
     
    CleanupStack::PopAndDestroy(&file);
     

    Related article: TSS001332 - Deleting messages stored on SIM card

  • 相关阅读:
    Bootstrap入门
    CSS3动画详解(图文教程)
    CSS3属性详解(图文教程)
    CSS3选择器详解
    HTML5详解
    jQuery动画详解
    jQuery的介绍和选择器详解
    html 出现粒子线条,鼠标移动会以鼠标为中心吸附的特效之canvas-nest.js插件
    div 内容宽度自适应、超出后换行
    layui layui.open弹窗后按enter键不停弹窗问题的解决
  • 原文地址:https://www.cnblogs.com/yaoliang11/p/1932100.html
Copyright © 2011-2022 走看看