diff -r ebe688cedc25 -r 7fdbb852d323 mobilemessaging/smsui/viewersrc/MsgSmsViewerCDMAAppUi.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/smsui/viewersrc/MsgSmsViewerCDMAAppUi.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -0,0 +1,805 @@ +/* +* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Sms CDMA Viewer Application UI +* +*/ + + +// UIKON/AVKON +#include // CAknTitlePane +#include // Rich text ed +// messaging editors +#include // CMsgBodyControl +#include // CEikRichTextEditor +#include // CMsgEditorView +#include // CMsgAddressControl +#include // CMsgBioBodyControl +// messaging +#include +#include +#include // DiskSpaceBelowCriticalLevelL +#include +#include // CAknInputBlock +// phone +#include // Common phone number validity checker +// resources +#include // resouce identifiers +#include // bitmaps +// local +#include "msgsmsviewer.hrh" // application specific commands +#include "msgsmsviewerdoc.h" // CMsgSmsViewerDocument +#include "msgsmsviewerappui.h" // CMsgSmsViewerAppUi +// Find item +#include // find item resources +#include // CFindItemMenu +#include +//#include // CFindItemDialog +// phonebook +#include // Phonebook Engine +#include +#include // Phonebook field types +#include // CreateContact menu +// general +#include // StringLoader +#include // FeatureManager +#include // Data Caging For Platform Security +#include // Icon utility +#include + +// variant +#include +// local +#include "msgsmsviewerdoc.h" // CMsgSmsViewerDocument +#include "msgsmsviewerappui.h" // CMsgSmsViewerCDMAAppUi +#include "msgsmsviewercdmaappui.h" // CMsgSmsViewerCDMAAppUi + +#include +#include // for SendUi + +// Mbm-file location +_LIT( KMsgEditorMbm, "MsgEditor.mbm" ); + +// C++ default constructor can NOT contain any code, that +// might leave. +CMsgSmsViewerCDMAAppUi::CMsgSmsViewerCDMAAppUi() + : iCallbackNumber( KNullDesC ) + { + } + +// Symbian OS default constructor can leave. +void CMsgSmsViewerCDMAAppUi::ConstructL() + { + CMsgEditorAppUi::ConstructL(); + + // Prepare FeatureManager, read values to members + FeatureManager::InitializeLibL(); + iHelpFeatureSupported = FeatureManager::FeatureSupported( KFeatureIdHelp ); + iEmailFeatureSupported = FeatureManager::FeatureSupported(KFeatureIdEmailOverSms); + + // Prepare iSmsHeader + CPlainText* nullString = CPlainText::NewL(); + CleanupStack::PushL( nullString ); + iSmsHeader = CSmsHeader::NewL( CSmsPDU::ESmsDeliver, *nullString ); + CleanupStack::PopAndDestroy(nullString); + + iSendUi = CSendUi::NewL(); + + if( !iEikonEnv->StartedAsServerApp( ) ) + { // If the app was not started as server app, we can call PrepareLaunchL + Document()->PrepareToLaunchL( this ); + } + iMsgVoIPExtension = CMsgVoIPExtension::NewL(); + + // Use CDMA Menubar + MenuBar()->SetMenuTitleResourceId(R_SMSV_OPTIONSMENUBAR_CDMA); + MenuBar()->SetMenuType(CEikMenuBar::EMenuOptions); + } + +// Destructor +CMsgSmsViewerCDMAAppUi::~CMsgSmsViewerCDMAAppUi() + { + FeatureManager::UnInitializeLib(); + delete iMsgVoIPExtension; + } + + +// --------------------------------------------------------- +// CMsgSmsViewerCDMAAppUi::LaunchViewL +// (other items were commented in a header). +// --------------------------------------------------------- +void CMsgSmsViewerCDMAAppUi::LaunchViewL() + { + CAknInputBlock::NewLC(); + + // Creating view (exits app immediately if fails) + iView = CMsgEditorView::NewL( *this, CMsgEditorView::EMsgReadOnly ); + // get hands on entry + const CMsgSmsViewerDocument* doc = Document(); + TMsvEntry msvEntry = doc->Entry(); + // Getting sender/receiver to From/To-field + // (just copies the content of iDetails to To/From-field, + // should work also with IR-messages...) + iRecipientstring = msvEntry.iDetails; + + __ASSERT_DEBUG(msvEntry.Id() != + KMsvNullIndexEntryId, Panic( EMsgSmsNoMessage )); + + + // Instead of using Sms Mtm load the entry's values + // using store. This is because Sms Viewer is also used + // by bio messages and then sms mtm can't be used... + + CMsvStore* store = doc->CurrentEntry().ReadStoreL(); + CleanupStack::PushL(store); + + // This TRAPping is needed to find out if the entry's store has + // KUidMsvSMSHeaderStream. If it hasn't, we're most propably dealing + // with non sms message and we can assume it is received message. + TRAPD( err, iSmsHeader->RestoreL( *store )); + if (err == KErrNone) + {// Yes, it is sms based message + iIrBt = EFalse; + + // Original longish LaunchViewL-function is splitted to 3 parts; + // LaunchViewL, SmsBasedMsgHandlingL & LaunchBioViewL + SmsBasedMsgHandlingL( msvEntry.iBioType, store ); + } + else + {// No, this is not a sms and sms pdu can't be checked. However + // this is most propably _received_ IR or BT message. + iIrBt = ETrue; + iControlId = EMsgComponentIdFrom; + iView->AddControlFromResourceL( + R_SMSV_FROM, + EMsgAddressControl, + EMsgAppendControl, + EMsgHeader); + } + CleanupStack::PopAndDestroy( store ); //store + + // Tests if Bio message + if ( msvEntry.iBioType ) + { + // Original longish LaunchViewL-function is split into 3 parts; + // LaunchViewL, SmsBasedMsgHandlingL & LaunchBioViewL + iFindItemMenu = CFindItemMenu::NewL( ESmsViewerFindItem ); + LaunchBioViewL( msvEntry ); + } + + if ( iIsFromEmail ) + { // Email over SMS. Use email address + if (KErrNotFound != iEmailAddress.Match( iRecipientstring )) + { + iRecipientstring = KNullDesC; + } + } + else // General SMS. Use sender number + { + if (KErrNotFound != iNumber.Match( iRecipientstring )) + { + iRecipientstring = KNullDesC; + } + } + CMsgBaseControl* addressBase = iView->ControlById( iControlId ); + CMsgAddressControl* addressControl = static_cast( addressBase ); + if ( iIsFromEmail ) + { // Email over SMS. Use email address + addressControl->AddRecipientL( iRecipientstring, iEmailAddress, KNullContactId, ETrue ); + } + else + { // General SMS. Use sender number + addressControl->AddRecipientL( iRecipientstring, iNumber, KNullContactId, ETrue ); + } + + if ( !iBioMsg ) + { + // Read the value of automatic highlight sd-key + ReadAutoHlSharedDataValueAndSetNotifyL(); + // Set the state of automatic highlighting for sms + SetAutomaticHighlightL( iAutomaticHlValue ); + } + + // Parse the filename + TParse tp; + tp.Set( KMsgEditorMbm, &KDC_APP_BITMAP_DIR, NULL ); + // Load the bitmaps + CFbsBitmap *bitmap; + CFbsBitmap *bitmapMask; + AknIconUtils::CreateIconLC( + bitmap, bitmapMask, tp.FullName(), + EMbmMsgeditorQgn_prop_folder_sms_tab1, + EMbmMsgeditorQgn_prop_folder_sms_tab1_mask); + + // navipane tabgroup takes ownership of the bitmaps. + UpdateNaviPaneL( bitmap, bitmapMask ); + CleanupStack::Pop(2); // bitmap, bitmapMask + + // set focus + iView->ExecuteL( ClientRect(), iControlId ); + + CleanupStack::PopAndDestroy();// CAknInputBlock + } + + +// --------------------------------------------------------- +// CMsgSmsViewerAppUi::SmsBasedMsgHandlingL +// (other items were commented in a header). +// --------------------------------------------------------- +void CMsgSmsViewerCDMAAppUi::SmsBasedMsgHandlingL( + TInt32 aBioType, CMsvStore* aStore ) + { + // Initialize the richtext object... + CParaFormatLayer* paraFormat = iEikonEnv->SystemParaFormatLayerL(); // <- pointer only + CCharFormatLayer* charFormat = iEikonEnv->SystemCharFormatLayerL(); // <- pointer only + CRichText* textBody = CRichText::NewL( paraFormat, charFormat ); + CleanupStack::PushL( textBody ); + // ...and read bodytext + if ( aStore != NULL ) + { + aStore->RestoreBodyTextL( *textBody ); + } + if ( !aBioType ) + { + // message is ordinary sms message or Picture Message + // so, let's get message body to viewer. + CMsgBaseControl* baseControl = iView->ControlById( + EMsgComponentIdBody ); + CMsgBodyControl* bodyControl = static_cast(baseControl); + + iFindItemMenu = CFindItemMenu::NewL( EFindItemMenuPlaceHolder ); + //the Title-pane text + HBufC* text = StringLoader::LoadLC( R_QTN_TITLE_SMS, iCoeEnv ); + CAknTitlePane* title = static_cast + (StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ))); + + title->SetTextL( *text ); + CleanupStack::PopAndDestroy(); // text + + // body text + bodyControl->SetTextContentL( *textBody ); + if ( iView->ItemFinder() ) + { + iView->ItemFinder()->SetFindModeL( + CItemFinder::EPhoneNumber | + CItemFinder::EUrlAddress | + CItemFinder::EEmailAddress ); + } + bodyControl->SetPlainTextMode( ETrue ); + } + CleanupStack::PopAndDestroy(); //textBody + + // Deciding between To/From text in address control + + const CSmsPDU::TSmsPDUType pduType = iSmsHeader->Type(); + + switch ( pduType ) + { + + case CSmsPDU::ESmsDeliver: + + // Setting from-control + iControlId = EMsgComponentIdFrom; + iView->AddControlFromResourceL( + R_SMSV_FROM, + EMsgAddressControl, + EMsgAppendControl, + EMsgHeader ); + ExtractCallingInfoL(); + + break; + + case CSmsPDU::ESmsSubmit: + // Setting To-control + iControlId = EMsgComponentIdTo; + iView->AddControlFromResourceL( + R_SMSV_TO, + EMsgAddressControl, + EMsgAppendControl, + EMsgHeader ); + // take the number + iNumber = iSmsHeader->FromAddress(); + + break; + + default: + Panic( EMsgSmsViewerUnknownSmsPduType ); + break; + } + } + + +// --------------------------------------------------------- +// CMsgSmsViewerCDMAAppUi::DynInitNonBioOptionsMenuL +// (other items were commented in a header). +// --------------------------------------------------------- +void CMsgSmsViewerCDMAAppUi::DynInitNonBioOptionsMenuL( CEikMenuPane* aMenuPane ) + { + if ( aMenuPane != NULL ) + { + TPtrC senderNumber = KNullDesC(); + + if ( iIsFromEmail ) // case of Email over SMS + { + senderNumber.Set( iEmailAddress ); + iFindItemMenu->SetSenderDescriptorType( CItemFinder::EEmailAddress ); + if ( iValidCallbackNumber ) + { + iFindItemMenu->SetCallbackNumber ( iCallbackNumber); + } + } + else + { + if ( iValidSenderNumber ) // if sender's number is valid, choose it first + { + senderNumber.Set( iNumber ); + } + if ( iValidCallbackNumber && ( ComparePhoneNumberL( iCallbackNumber, iNumber ) != 0 ) ) + { + iFindItemMenu->SetCallbackNumber ( iCallbackNumber); + } + } + + iFindItemMenu->AddItemFinderMenuL( + IsBodyFocused() ? iView->ItemFinder() : 0, + aMenuPane, EFindItemMenuPlaceHolder, + senderNumber, + ( iRecipientstring.Length() != 0 )); + // Remove "Call back to sender" and "create cc" from menu + // Find UI can handle it now. + aMenuPane->SetItemDimmed( ESmsViewerCallBack, ETrue ); + aMenuPane->SetItemDimmed( ESmsViewerCreateCC, ETrue ); + + // Remove "reply" from menu, + // if this is a sent message + if ( iControlId == EMsgComponentIdTo ) + { + aMenuPane->SetItemDimmed( ESmsViewerReply, ETrue ); + } + + // Help handling + aMenuPane->SetItemDimmed( EAknCmdHelp, !iHelpFeatureSupported ); + } + } + +// --------------------------------------------------------- +// CMsgSmsViewerCDMAAppUi::HandleCommandL +// (other items were commented in a header). +// --------------------------------------------------------- +void CMsgSmsViewerCDMAAppUi::HandleCommandL(TInt aCommand ) + { + // is it find item command + if ( iFindItemMenu && iFindItemMenu->CommandIsValidL( aCommand ) && !iGms && !iBioMsg ) + { + iFindItemMenu->HandleItemFinderCommandL( aCommand ); + return; + } + + // Are we dealing with bio-message? + if ( iBioMsg ) + { + // let the biocontrol handle the command and check + // whether it was handled. + if ( aCommand==EAknCmdHelp ) + { + LaunchHelpL(); + return; + } + + if ( BioBody().HandleBioCommandL( aCommand )) + { + return;// Bio control has handled the command. + } + } + + // find item + if ( iFindItemMenu && iFindItemMenu->CommandIsValidL( aCommand ) && ( iGms || iBioMsg )) + { + DoSearchL( aCommand ); + } + + switch ( aCommand ) + { + case ESmsViewerReply: + CheckDiskAndReplyForwardL( EFalse ); + Exit( EAknSoftkeyClose ); + break; + case ESmsViewerForward: + CheckDiskAndReplyForwardL( ETrue ); + Exit( EAknSoftkeyClose ); + break; + case ESmsViewerDelete: + DoFileDeleteL(); + break; + case ESmsViewerMove: + DoMoveEntryL(); + break; + case ESmsViewerCallBack: + DoCallBackToSenderL(); + break; + case ESmsViewerCreateCCNew: + // FALLTHROUGH + case ESmsViewerCreateCCExisting: + DoCreateContactCardL( aCommand ); + break; + case ESmsViewerMessInfo: + DoMessageInfoL(); + break; + case EAknSoftkeyBack: + Exit( EAknSoftkeyClose ); + break; + case EEikCmdExit: + // system exit + DoMsgSaveExitL(); + break; + case EAknCmdHelp: + LaunchHelpL(); + break; + default: + break; + } + } + +// --------------------------------------------------------- +// CMsgSmsViewerCDMAAppUi::DynInitMenuPaneL +// (other items were commented in a header). +// --------------------------------------------------------- +void CMsgSmsViewerCDMAAppUi::DynInitMenuPaneL( + TInt aMenuId, + CEikMenuPane* aMenuPane ) + { + // Confirm app is running properly + if ( !Document()->IsLaunched()) + { + // If not, hide everything and return + TInt amountOfItems = aMenuPane->NumberOfItemsInPane(); + if ( amountOfItems ) + { + aMenuPane->DeleteBetweenMenuItems( 0, amountOfItems-1 ); + return; + } + } + + // ...then construct the menu itself. There is two menu-resources, + // one for contextmenu and one for normal optionsmenu. + switch ( aMenuId ) + { + case R_SMSV_OPTIONSMENUPANE_CDMA: + { + if ( !iBioMsg ) + { // Normal sms or picture msg + DynInitNonBioOptionsMenuL( aMenuPane ); + } + else + { // Smart (BIO) msg + DynInitBioOptionsMenuL( aMenuId, aMenuPane ); + } + } + break; + case R_SMSV_CONTEXTMENUPANE_CDMA: + { + if ( !iBioMsg ) + { // Normal sms or picture msg + DynInitNonBioContextMenuL( aMenuPane ); + } + else + { // Smart (BIO) msg + DynInitBioContextMenuL( aMenuPane ); + } + } + break; + case R_FINDITEMMENU_MENU: + { + iFindItemMenu->DisplayFindItemCascadeMenuL( *aMenuPane ); + } + break; + default: + if ( iBioMsg || iGms ) + {// for BIO & GMS; create contact card menu + // If it's AIW sub-menu, let AIW initialize it + InitAiwContactCardSubMenuL( aMenuPane ); + } + else + {// for normal SMS; update the finder menu + if( iVoIPNumber && iMsgVoIPExtension->IsVoIPSupported() ) + { + iFindItemMenu->SetSenderDescriptorType( CItemFinder::EEmailAddress ); + } + iFindItemMenu->UpdateItemFinderMenuL( aMenuId, aMenuPane ); + } + break; + } + } + + +// --------------------------------------------------------- +// CMsgSmsViewerCDMAAppUi::DynInitNonBioContextMenuL +// (other items were commented in a header). +// --------------------------------------------------------- +void CMsgSmsViewerCDMAAppUi::DynInitNonBioContextMenuL( CEikMenuPane* aMenuPane ) + { + if ( aMenuPane != NULL ) + { + + TPtrC senderNumber = KNullDesC(); + if ( iIsFromEmail ) // SMS originating address is email address + { + senderNumber.Set( iEmailAddress ); + iFindItemMenu->SetSenderDescriptorType( CItemFinder::EEmailAddress ); + if ( iValidCallbackNumber ) + {// set callback number when it is attached on the email over SMS + iFindItemMenu->SetCallbackNumber ( iCallbackNumber); + } + } + else + {// SMS originating adddress is Phone number + if ( iValidSenderNumber ) // if sender's number is valid, choose it first + { + senderNumber.Set( iNumber ); + } + if ( iValidCallbackNumber && ( ComparePhoneNumberL( iCallbackNumber, iNumber ) != 0 ) ) + {// set callback number when it is valid and different from SMS originating address. + iFindItemMenu->SetCallbackNumber ( iCallbackNumber); + } + } + + iFindItemMenu->AddItemFinderMenuL( + IsBodyFocused() ? iView->ItemFinder() : 0, + aMenuPane, EFindItemContextMenuPlaceHolder, + senderNumber, + ETrue, ETrue ); + + } + } + +// --------------------------------------------------------- +// CMsgSmsViewerCDMAAppUi::HandleKeyEventL +// (other items were commented in a header). +// --------------------------------------------------------- +TKeyResponse CMsgSmsViewerCDMAAppUi::HandleKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + TKeyResponse aResponse = EKeyWasNotConsumed; + + // Confirm app is running properly + if ( iView && ( aType == EEventKey ) && Document()->IsLaunched()) + { + // react with all sms classes + switch ( aKeyEvent.iCode ) + { + case EKeyUpArrow: + case EKeyDownArrow: + { + // Base-editor handles scrolling + iView->OfferKeyEventL( aKeyEvent, aType ); + aResponse = EKeyWasConsumed; + } + break; + case EKeyDevice3: + {// Selection-key checking (Context sensitive menu) + // (with Class 0 just show the menu) + MenuBar()->SetMenuTitleResourceId( R_SMSV_CONTEXTMENUBAR_CDMA); + MenuBar()->SetMenuType(CEikMenuBar::EMenuContext); + MenuBar()->TryDisplayMenuBarL(); + MenuBar()->SetMenuTitleResourceId( R_SMSV_OPTIONSMENUBAR_CDMA ); + MenuBar()->SetMenuType(CEikMenuBar::EMenuOptions); + aResponse = EKeyWasConsumed; + } + break; + case EKeyYes: + {// Send-key checking. Either valid sender's phone number or callback number is valid. + if ( !iIrBt && !iBioMsg ) + { // normal sms + DoHandleSendKeyL(); + } + else if ( iValidSenderNumber && !iIrBt ) + { // smart message + TBool okToQuery( ETrue ); + // Is it biocontrol? + TUint32 permBio = OptionsMenuPermissionsBioL(); + okToQuery = ( permBio & EMsgBioCallBack ) ? ETrue : EFalse ; + + + // Launch confirmation query and start calling + if ( okToQuery ) + { + if ( iMsgVoIPExtension->IsPreferredTelephonyVoIP() && + iMsgVoIPExtension->VoIPProfilesExistL() ) + { + MsvUiServiceUtilitiesInternal::InternetCallToSenderQueryL( iNumber, iRecipientstring, ETrue ); + } + else + { + MsvUiServiceUtilitiesInternal::CallToSenderQueryL( iNumber, iRecipientstring, ETrue ); + } + } + } + else + { + //do nothing + } + aResponse = EKeyWasConsumed; + } + break; + default: + break; + } + + switch ( aKeyEvent.iCode ) + { + case EKeyRightArrow: + {// Show next message if possible + if ( IsNextMessageAvailableL( ETrue )) + { + NextMessageL( ETrue ); + aResponse = EKeyWasConsumed; + } + } + break; + case EKeyLeftArrow: + { // Show prev message if possible + if ( IsNextMessageAvailableL( EFalse )) + { + NextMessageL( EFalse ); + aResponse = EKeyWasConsumed; + } + } + break; + case EKeyBackspace: + { + DoFileDeleteL(); + aResponse = EKeyWasConsumed; + } + break; + default: + break; + } + } + else // App is not running properly yet + { + aResponse = EKeyWasConsumed; + + } + + return aResponse; + } + + +// ---------------------------------------------------- +// CMsgSmsViewerCDMAAppUi::DoHandleSendKeyL +// +// ---------------------------------------------------- + +void CMsgSmsViewerCDMAAppUi::DoHandleSendKeyL() + { + if ( !iMsgVoIPExtension ) + { + return; + } + + TPtrC senderNumber = KNullDesC(); + TPtrC alias = KNullDesC(); + TPtrC focusedNumber = KNullDesC(); + + if ( iIsFromEmail ) // case of Email over SMS + { + senderNumber.Set( iEmailAddress ); + } + else // SMS originating address is phone number + { + if ( iValidSenderNumber ) // if sender's number is valid, choose it first + { + senderNumber.Set( iNumber ); + } + if ( iRecipientstring.Length() ) + { + alias.Set( *&iRecipientstring ); + } + } + + if ( IsBodyFocused() && iView->ItemFinder( ) ) + { + const CItemFinder::CFindItemExt& item = + iView->ItemFinder( )->CurrentItemExt( ); + if ( item.iItemDescriptor + && ( item.iItemType == CItemFinder::EPhoneNumber + || item.iItemType == CItemFinder::EEmailAddress ) ) + { + focusedNumber.Set( *(item.iItemDescriptor) ); + } + } + + MsvUiServiceUtilitiesInternal::InternetOrVoiceCallServiceL( + *iMsgVoIPExtension, + senderNumber, + alias, + focusedNumber, + ETrue, + iEikonEnv ); + } + + +// ---------------------------------------------------- +// CMsgSmsViewerCDMAAppUi::SetAutomaticHighlightL +// +// ---------------------------------------------------- +void CMsgSmsViewerCDMAAppUi::SetAutomaticHighlightL( const TBool aSwitchON ) + { + __ASSERT_DEBUG( !iGms, Panic( EMsgSmsNotForGms ) ); + __ASSERT_DEBUG( !iBioMsg, Panic( EMsgSmsNotAllowedForBio ) ); + if ( iView->ItemFinder() ) + { + // content highlight + if ( aSwitchON ) + { // switch ON + iView->ItemFinder()->SetFindModeL( + CItemFinder::EPhoneNumber | + CItemFinder::EUrlAddress | + CItemFinder::EEmailAddress ); + } + else + { // switch OFF + iView->ItemFinder()->SetFindModeL( + CItemFinder::ENoneSelected ); + } + // header highlight + if ( iControlId != EMsgComponentIdTo && ( iValidSenderNumber || iValidEmailAddress) ) + { + static_cast + (iView->ControlById( iControlId ))->SetAddressFieldAutoHighlight( aSwitchON ); + + } + } + } + +// ---------------------------------------------------- +// CMsgSmsViewerCDMAAppUi::ExtractCallingInfoL +// +// ---------------------------------------------------- +void CMsgSmsViewerCDMAAppUi::ExtractCallingInfoL() +{ + + + HBufC* callback = NULL; + + callback = iSmsHeader->CdmaMessage().GetCallbackNumberL(); + if (callback != NULL) + { + CleanupStack::PushL(callback); + iCallbackNumber = callback->Des(); + iValidCallbackNumber = CommonPhoneParser::IsValidPhoneNumber( + iCallbackNumber, CommonPhoneParser::EPhoneClientNumber ); + CleanupStack::PopAndDestroy(callback); + + } + // Currently only consider general SMS situation. + + if ( MsvUiServiceUtilities::IsValidEmailAddressL(iSmsHeader->FromAddress()) + && iEmailFeatureSupported ) + { + iIsFromEmail = ETrue; + iValidEmailAddress = ETrue; + iVoIPNumber = ETrue; + iEmailAddress = iSmsHeader->FromAddress(); + } + else + { + iNumber = iSmsHeader->FromAddress(); + iValidSenderNumber = CommonPhoneParser::IsValidPhoneNumber( iNumber, + CommonPhoneParser::ESMSNumber ); + } + +} +