⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clocationexamplesmsengine.cpp

📁 Symbian Demo, why do you want to get 20 bytes.
💻 CPP
字号:
/*
* ============================================================================
*  Name     : clocationexamplesmsengine.cpp
*  Part of  : Location Example
*  Created  : 21.05.2007 by Forum Nokia
*  Description:
*  Version  : 1.0
*  Copyright: Nokia Corporation
* ============================================================================
*/

// INCLUDE FILES
#include <msvids.h>             // Folder Ids
#include <smut.h>               // KUidMsgTypeSMS
#include <txtrich.h>            // CRichText
#include <eikenv.h>             // CEikonEnv

#include "clocationexampleapplication.h"
#include "clocationexamplesmsengine.h"
#include "clocationexampleengine.h"


#ifdef __WINS__
    const TMsvId KObservedFolderId = KMsvDraftEntryId;
#else
    const TMsvId KObservedFolderId =  KMsvGlobalInBoxIndexEntryId;
#endif

const TMsvId KInbox = KMsvGlobalInBoxIndexEntryId;


// ---------------------------------------------------------
// CLocationExampleSmsEngine::NewL()
// ---------------------------------------------------------
//
CLocationExampleSmsEngine* CLocationExampleSmsEngine::NewL(MSmsEngineObserver* aObserver)
    {
    CLocationExampleSmsEngine* self = NewLC(aObserver);
    CleanupStack::Pop(self);
	return self;
    }

// ---------------------------------------------------------
// CLocationExampleSmsEngine::NewLC()
// ---------------------------------------------------------
//
CLocationExampleSmsEngine* CLocationExampleSmsEngine::NewLC(MSmsEngineObserver* aObserver)
    {
    CLocationExampleSmsEngine* self = new (ELeave) CLocationExampleSmsEngine(aObserver);
    CleanupStack::PushL(self);
    self->ConstructL();
    return self;
    }

// ---------------------------------------------------------
// CLocationExampleSmsEngine::ConstructL()
// ---------------------------------------------------------
//
void CLocationExampleSmsEngine::ConstructL()
    {
    User::LeaveIfError(iSendAs.Connect());

	// SMS automatic receiving needs a session to the messaging server
	iMsvSession = CMsvSession::OpenAsyncL(*this);
    } 

// ---------------------------------------------------------
// CLocationExampleSmsEngine::CLocationExampleSmsEngine()
// ---------------------------------------------------------
//
CLocationExampleSmsEngine::CLocationExampleSmsEngine(MSmsEngineObserver* aObserver) 
: iObserver(aObserver)
    {
    }   

// ---------------------------------------------------------
// CLocationExampleSmsEngine::~CLocationExampleSmsEngine()
// ---------------------------------------------------------
//
CLocationExampleSmsEngine::~CLocationExampleSmsEngine()
    {
    delete iMsvEntry;
    
    if (iMsvSession)
        {
        iMsvSession->Cancel();
        }
    delete iMsvSession;

    iSendAs.Close();
    }


// ---------------------------------------------------------
// CLocationExampleSmsEngine::HandleSessionEventL()
// ---------------------------------------------------------
//
void CLocationExampleSmsEngine::HandleSessionEventL(
TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* /*aArg3*/)
    {
    switch (aEvent)
        {
        case EMsvServerReady:
            {
            // Initialise iMsvEntry
            if (!iMsvEntry)
                {
                iMsvEntry = CMsvEntry::NewL(*iMsvSession, KInbox,
                                            TMsvSelectionOrdering());
                }
            break;
            }
        case EMsvEntriesCreated:
            {
            // Only look for changes in the Inbox
            if (aArg2 &&  *(static_cast<TMsvId*>(aArg2)) == KObservedFolderId)
                {
                CMsvEntrySelection* entries = static_cast<CMsvEntrySelection*>(aArg1);
                if( entries->Count() >= 1 )
                    {
                    iNewMessageId = entries->At(0);
                    }
                else
                    {
                	return;
                    }
                }
            break;
            }
        case EMsvEntriesChanged:
            {
            // Look for changes. When using the emulator observed folder is drafts, otherwise inbox
            if (aArg2 &&  *(static_cast<TMsvId*>(aArg2)) == KObservedFolderId)
                {
                CMsvEntrySelection* entries = static_cast<CMsvEntrySelection*>(aArg1);
                if(!entries && entries->Count() < 1 )
                    {
                	return;
                    }
                else if (iNewMessageId == entries->At(0))
                    {
                    if( !iMsvEntry )
                    	{
                    	return;
                    	}

                    // Set entry context to the new message
                    iMsvEntry->SetEntryL(iNewMessageId);

        			// Check the type of the arrived message and that the message is complete
        			// Only SMS's are our consern
        			if (iMsvEntry->Entry().iMtm != KUidMsgTypeSMS || !iMsvEntry->Entry().Complete())
        			    {
        				return;
        				}

                    // Read-only store
                    CMsvStore* store = iMsvEntry->ReadStoreL();
                    CleanupStack::PushL(store);

					// Get address of received message.
                    iAddress.Copy(iMsvEntry->Entry().iDetails);

                    // Body text
                    if (store->HasBodyTextL())
                        {
        				CRichText* richText = CRichText::NewL(
                           CEikonEnv::Static()->SystemParaFormatLayerL(),
                           CEikonEnv::Static()->SystemCharFormatLayerL());
                        CleanupStack::PushL(richText);

                        store->RestoreBodyTextL(*richText);
        				TPtrC ptr = richText->Read(0, richText->DocumentLength());
        			    iMessage.Copy(ptr);

        			    CleanupStack::PopAndDestroy(richText);
            			CleanupStack::PopAndDestroy(store);
                
                        // Check that incoming message was our location message
                        TUint reqType(EInvalidPositionType);
                        if (ParseMsgRequestType(iMessage,reqType) == KErrNone)
                            {
                            // Delete message from this Inbox-folder
                            TRAP_IGNORE(iMsvEntry->DeleteL(iMsvEntry->EntryId())){}

                            if (reqType == EPositionResponse)
                                {
                                // You are reseiving your friend location
                                iObserver->MessageReceived(iMessage, iAddress);
                                }
                            else if(reqType == EPositionRequest)
                                {
                                // Your friend ask your location
                                iObserver->MessageRequested(iMessage, iAddress);
                                }
                            }
                        }
                    else
                        {
            			CleanupStack::PopAndDestroy(store);
                        }
                    }
                }
            break;
            }
        default:
            {
            break;
            }
        }
    }


// ---------------------------------------------------------
// CLocationExampleSmsEngine::ParseMsgRequestType()
//
// Message body: RES E01FF1Cd latitude_value longitude_value
// Message body: REQ E01FF1Cd latitude_value longitude_value
// ---------------------------------------------------------
//
TInt CLocationExampleSmsEngine::ParseMsgRequestType(
const TDesC& aMsg, TUint& aType)
    {
    TInt ret = KErrNone;
    if (!aMsg.Find(KPosRequest) && !aMsg.Find(KPosResponse))
        {
        return KErrNotSupported;
        }

    TLex16 lex(aMsg);

    TPtrC typeStr = lex.NextToken();

    if (typeStr == KPosRequest)
        {
        aType = EPositionRequest;
        }
    else if (typeStr == KPosResponse)
        {
        aType = EPositionResponse;
        }
    else
        {
        aType = EInvalidPositionType;
        ret = KErrNotSupported;
        }

    return ret;
    }

// ---------------------------------------------------------
// CLocationExampleSmsEngine::ParseMsgUid()
//
// Message body: RES E01FF1Cd latitude_value longitude_value
// Message body: REQ E01FF1Cd latitude_value longitude_value
// ---------------------------------------------------------
//
TInt CLocationExampleSmsEngine::ParseMsgUid(const TDesC& aMsg)
    {
    TInt err = KErrNone;

    if (!aMsg.Find(KPosRequest) && !aMsg.Find(KPosResponse))
        {
        return KErrNotSupported;
        }

    TLex16 lex(aMsg);

    TPtrC typeStr = lex.NextToken();
    lex.Inc();

    TPtrC uidStr = lex.NextToken();
    lex.Inc();

    // Create UID
    TLex16 smsUid(uidStr);
    TInt64 uidVal(0);
    err = smsUid.Val(uidVal);
    if (err)
        {
        return err;
        }
    else
        {
        // Check UID    
        if ((TInt32)uidVal == KUidLocationExampleApp.iUid)
            {
            return KErrNone;
            }
        else
            {
            return KErrArgument;
            }
        }
    }

// ---------------------------------------------------------
// CLocationExampleSmsEngine::ParseMsgCoordinates()
//
// Message body: RES E01FF1Cd latitude_value longitude_value
// Message body: REQ E01FF1Cd latitude_value longitude_value
// ---------------------------------------------------------
//
TInt CLocationExampleSmsEngine::ParseMsgCoordinates(const TDesC& aMsg, TCoordinate& aCoordinate)
    {
    TInt ret = KErrNone;

    if (!aMsg.Find(KPosRequest) && !aMsg.Find(KPosResponse))
        {
        return KErrNotSupported;
        }

    TLex16 lex(aMsg);

    TPtrC typeStr = lex.NextToken();
    lex.Inc();

    TPtrC uidStr = lex.NextToken();
    lex.Inc();

    TPtrC latitudeStr = lex.NextToken();
    lex.Inc();

    TPtrC longitudeStr = lex.NextToken();
    lex.Inc();


    TReal64 latitude = 0;
    lex = latitudeStr;
    ret = lex.Val(latitude);
    if (ret)
        {
        return KErrNotSupported;
        }

    TReal64 longitude = 0;
    lex = longitudeStr;
    ret = lex.Val(longitude);
    if (ret)
        {
        return KErrNotSupported;
        }

    aCoordinate.SetCoordinate(latitude,longitude);

    return KErrNone;
    }


// ---------------------------------------------------------
// CLocationExampleSmsEngine::SendSmsL()
// ---------------------------------------------------------
//
void CLocationExampleSmsEngine::SendSmsL(const TDesC& aAddr, const TDesC& aMsg)
    {
    RSendAsMessage message;
    message.CreateL(iSendAs, KUidMsgTypeSMS);
    CleanupClosePushL(message);

    // Prepare the message
    message.AddRecipientL(aAddr, RSendAsMessage::ESendAsRecipientTo);
    message.SetBodyTextL(aMsg);

    // Send the message
    TRequestStatus status;
    message.SendMessage(status);
    User::WaitForRequest(status);
    message.Close();

    CleanupStack::Pop(); // message
    
    iObserver->MessageSent();
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -