?? clocationexamplesmsengine.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 + -