# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1264499142 -7200 # Node ID a4d6f1ea04162ba6b955b98916705fadb494e8e7 # Parent 5253a20d2a1e07b6daee2277b6611c3e60815e95 Revision: 201001 Kit: 201004 diff -r 5253a20d2a1e -r a4d6f1ea0416 emailcontacts/remotecontactlookup/engine/src/cpbkxrclvcardsender.cpp --- a/emailcontacts/remotecontactlookup/engine/src/cpbkxrclvcardsender.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailcontacts/remotecontactlookup/engine/src/cpbkxrclvcardsender.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -132,33 +132,26 @@ } CMessageData* messageData = CMessageData::NewLC(); - - if ( mtmUid == KSenduiMtmSmsUid ) - { - // Sending through SMS - - // Copy the one and only attachment into a rich text object - CRichText* msgBody = CreateRichTextFromFileLC(); - - messageData->SetBodyTextL( msgBody ); - - // Send the message using Send Ui - iSendUi->CreateAndSendMessageL( mtmUid, messageData, KMsgBioUidVCard ); - - CleanupStack::PopAndDestroy( msgBody ); - } - else - { - // Not sending through SMS, just pass the attachments - // hardcoded paths removed - messageData->AppendAttachmentL(iTempFileName); - // - - // Send the message using Send Ui - iSendUi->CreateAndSendMessageL( mtmUid, messageData, KMsgBioUidVCard ); - } - + + // + RFs fs; + RFile attachament; + + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + User::LeaveIfError( attachament.Open( fs, iTempFileName, EFileShareAny ) ); + CleanupClosePushL( attachament ); + + messageData->AppendAttachmentHandleL( attachament ); + + // Send the message using Send Ui + iSendUi->CreateAndSendMessageL( mtmUid, messageData, KMsgBioUidVCard ); + + CleanupStack::PopAndDestroy( &attachament ); + CleanupStack::PopAndDestroy( &fs ); CleanupStack::PopAndDestroy( messageData ); + + // DestroyTempFileL(); @@ -223,11 +216,9 @@ // Open the file for reading RFile file; // take away double line break - User::LeaveIfError( - file.Open( - iEikEnv->FsSession(), - iTempFileName, // - EFileRead | EFileStream | EFileShareReadersOnly ) ); + User::LeaveIfError( file.Open( iEikEnv->FsSession(), + iTempFileName, // + EFileRead | EFileStream | EFileShareReadersOnly ) ); // CleanupClosePushL( file ); diff -r 5253a20d2a1e -r a4d6f1ea0416 emailservices/emailclientapi/src/emailmessage.cpp --- a/emailservices/emailclientapi/src/emailmessage.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailservices/emailclientapi/src/emailmessage.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -371,6 +371,7 @@ if( count == 0 ) { /* No content, return NULL */ + CleanupStack::Pop(); // parts return NULL; } CFSMailMessagePart* part = parts[0]; diff -r 5253a20d2a1e -r a4d6f1ea0416 emailservices/emailframework/commonlib/src/CFSMailFolder.cpp --- a/emailservices/emailframework/commonlib/src/CFSMailFolder.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailservices/emailframework/commonlib/src/CFSMailFolder.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -111,23 +111,33 @@ FUNC_LOG; // init asynchronous request CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetFolderId()); - TFSPendingRequest request = iRequestHandler->InitAsyncRequestL( GetFolderId().PluginId(), aObserver ); - - MFSMailRequestObserver* observer = request.iObserver; - TRAPD(err,plugin->FetchMessagesL( GetMailBoxId(), - GetFolderId(), - aMessageIds, - aDetails, - *observer, - request.iRequestId)); + + TInt err = KErrNone; + + if (plugin) + { + MFSMailRequestObserver* observer = request.iObserver; + TRAP(err,plugin->FetchMessagesL( GetMailBoxId(), + GetFolderId(), + aMessageIds, + aDetails, + *observer, + request.iRequestId)); + } + else + { + err = KErrNotFound; + } + if(err != KErrNone) - { - iRequestHandler->CompleteRequest(request.iRequestId); - User::Leave(err); - } - return request.iRequestId; + { + iRequestHandler->CompleteRequest(request.iRequestId); + User::Leave(err); + } + return request.iRequestId; + } diff -r 5253a20d2a1e -r a4d6f1ea0416 emailservices/emailframework/commonlib/src/CFSMailRequestHandler.cpp --- a/emailservices/emailframework/commonlib/src/CFSMailRequestHandler.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailservices/emailframework/commonlib/src/CFSMailRequestHandler.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -2,9 +2,9 @@ * Copyright (c) 2007-2008 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" +* under the terms of the License "Symbian Foundation License v1.0" * which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. @@ -178,8 +178,10 @@ iPendingRequests[i].iRequestStatus == TFSPendingRequest::EFSRequestPending) { TFSMailMsgId pluginId(iPendingRequests[i].iPluginId,0); - CFSMailPlugin* plugin = GetPluginByUid(pluginId); - plugin->CancelL(aRequestId); + if(CFSMailPlugin* plugin = GetPluginByUid(pluginId)) + { + plugin->CancelL(aRequestId); + } iPendingRequests[i].iRequestStatus = TFSPendingRequest::EFSRequestCancelled; break; } @@ -197,8 +199,10 @@ if(iPendingRequests[i].iRequestStatus == TFSPendingRequest::EFSRequestPending) { TFSMailMsgId pluginId(iPendingRequests[i].iPluginId,0); - CFSMailPlugin* plugin = GetPluginByUid(pluginId); - plugin->CancelL(iPendingRequests[i].iRequestId); + if(CFSMailPlugin* plugin = GetPluginByUid(pluginId)) + { + plugin->CancelL(iPendingRequests[i].iRequestId); + } iPendingRequests[i].iRequestStatus = TFSPendingRequest::EFSRequestCancelled; } } diff -r 5253a20d2a1e -r a4d6f1ea0416 emailservices/emailframework/inc/emailversionnumbers.hrh --- a/emailservices/emailframework/inc/emailversionnumbers.hrh Mon Jan 18 20:08:26 2010 +0200 +++ b/emailservices/emailframework/inc/emailversionnumbers.hrh Tue Jan 26 11:45:42 2010 +0200 @@ -12,7 +12,7 @@ * Contributors: * * Description : Common email version number definitions -* Version : %version: 10.1.1 % +* Version : %version: 10.1.2 % * */ @@ -25,14 +25,14 @@ * version number both major and minor version are stored in separate 32 bit * location. */ -#define KEmailBinaryVersionNumber 10.2 +#define KEmailBinaryVersionNumber 10.4 /** ECom version number to be used in Cmail related ECom registeration * resource files. * NOTE: Version number in ECom registeration resource file is saved as one * byte, so 255 is the maximum version number. */ -#define KEmailEcomVersionNumber 3 +#define KEmailEcomVersionNumber 4 /** Binary paging setting (paged/non-paged) */ diff -r 5253a20d2a1e -r a4d6f1ea0416 emailservices/emailserver/cmailhandlerplugin/inc/cmailcpshandler.h --- a/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpshandler.h Mon Jan 18 20:08:26 2010 +0200 +++ b/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpshandler.h Tue Jan 26 11:45:42 2010 +0200 @@ -220,7 +220,13 @@ * @param aMailbox mailbox id */ void HandleNewMailboxEventL( const TFSMailMsgId aMailbox ); - + + /** + * Handles mailbox renamed event. + * @param aMailbox mailbox id + */ + void HandleMailboxRenamedEventL( const TFSMailMsgId aMailbox ); + /** * handles mailbox deleted event * @param aMailbox mailbox id diff -r 5253a20d2a1e -r a4d6f1ea0416 emailservices/emailserver/cmailhandlerplugin/inc/cmailmailboxdetails.h --- a/emailservices/emailserver/cmailhandlerplugin/inc/cmailmailboxdetails.h Mon Jan 18 20:08:26 2010 +0200 +++ b/emailservices/emailserver/cmailhandlerplugin/inc/cmailmailboxdetails.h Tue Jan 26 11:45:42 2010 +0200 @@ -46,7 +46,12 @@ * Destructor. */ void SetWidgetInstance( const TDesC& aWidgetInstance ); - + + /** + * Changes the mailbox name. + */ + void SetMailboxName( const TDesC& aMailboxName ); + private: /** diff -r 5253a20d2a1e -r a4d6f1ea0416 emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp --- a/emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -705,6 +705,11 @@ // HandleNewMailboxEventL( aMailbox ); break; } + case TFSEventMailboxRenamed: + { + HandleMailboxRenamedEventL( aMailbox ); + break; + } case TFSEventMailboxDeleted: { HandleMailboxDeletedEventL( aMailbox ); @@ -788,6 +793,28 @@ } // --------------------------------------------------------- +// CMailCpsHandler::HandleMailborRenamedEventL +// --------------------------------------------------------- +// +void CMailCpsHandler::HandleMailboxRenamedEventL( const TFSMailMsgId aMailbox ) + { + for ( TInt ii = iAccountsArray.Count() - 1; ii >= 0; --ii ) + { + if ( iAccountsArray[ii]->iMailboxId.Id() == aMailbox.Id() ) + { + CFSMailBox* mailbox = NULL; + mailbox = MailClient().GetMailBoxByUidL( aMailbox ); + if ( mailbox ) + { + iAccountsArray[ii]->SetMailboxName( mailbox->GetName() ); + } + delete mailbox; + break; + } + } + } + +// --------------------------------------------------------- // CMailCpsHandler::HandleMailboxDeletedEventL // --------------------------------------------------------- // diff -r 5253a20d2a1e -r a4d6f1ea0416 emailservices/emailserver/cmailhandlerplugin/src/cmailmailboxdetails.cpp --- a/emailservices/emailserver/cmailhandlerplugin/src/cmailmailboxdetails.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailmailboxdetails.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -69,6 +69,20 @@ } // --------------------------------------------------------- +// CMailMailboxDetails::SetMailboxNameL +// --------------------------------------------------------- +// +void CMailMailboxDetails::SetMailboxName( const TDesC& aMailboxName ) + { + HBufC* newMailboxName = aMailboxName.Alloc(); + if ( newMailboxName ) + { + delete iMailboxName; + iMailboxName = newMailboxName; + } + } + +// --------------------------------------------------------- // CMailMailboxDetails::ConstructL // --------------------------------------------------------- // diff -r 5253a20d2a1e -r a4d6f1ea0416 emailservices/emailserver/cmailhandlerplugin/src/emailsoundhandler.cpp --- a/emailservices/emailserver/cmailhandlerplugin/src/emailsoundhandler.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailservices/emailserver/cmailhandlerplugin/src/emailsoundhandler.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -226,15 +226,26 @@ MProfile* profile = iProfileEngine->ActiveProfileL(); CleanupReleasePushL( *profile ); + TBool vibraEnabled = profile->ProfileTones().ToneSettings().iEmailVibratingAlert; + + + TInt preference = KAudioPrefNewSMS; + if ( !vibraEnabled ) + { + preference = EMdaPriorityPreferenceTimeAndQuality; + } + if ( IsBeepOnceSetL( *profile ) ) { + + // create audio player based on hard coded sequence // (Platform does not offer any "play platform-wide beep" service) iAudioPlayer = CMdaAudioPlayerUtility::NewDesPlayerReadOnlyL( KEmailBeepSequence(), *this, KAudioPriorityRecvMsg, - static_cast( KAudioPrefNewSMS ) ); + preference ); } else { @@ -272,7 +283,7 @@ fileToPlay, *this, KAudioPriorityRecvMsg, - static_cast( KAudioPrefNewSMS ) ); + static_cast( preference ) ); } CleanupStack::PopAndDestroy( profile ); // profile } diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/data/FreestyleEmailUi.rss --- a/emailuis/emailui/data/FreestyleEmailUi.rss Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/data/FreestyleEmailUi.rss Tue Jan 26 11:45:42 2010 +0200 @@ -2372,6 +2372,8 @@ RESOURCE TBUF r_fse_viewer_attachments_list_downloading { buf=qtn_fse_viewer_attachments_downloading; } RESOURCE TBUF r_fse_viewer_attachments_list_downloaded_100 { buf=qtn_fse_viewer_attachments_downloaded_100; } RESOURCE TBUF r_fse_viewer_attachments_list_downloading_cancelled { buf=qtn_fse_viewer_attachments_downloading_cancelled; } +RESOURCE TBUF r_fse_viewer_attachments_list_download { buf=qtn_fse_viewer_attachments_download_prefix; } +RESOURCE TBUF r_fse_viewer_attachments_list_download_cancelled { buf=qtn_fse_viewer_attachments_download_cancelled_prefix; } RESOURCE TBUF r_fse_viewer_attachments_list_manager_link { buf=qtn_fse_viewer_attachments_list_manager_link; } RESOURCE TBUF r_fse_viewer_attachments_header_download_manager { buf=qtn_fse_viewer_attachments_header_download_manager; } RESOURCE TBUF r_fse_viewer_note_attachment_downloading_progress { buf=qtn_fse_viewer_note_attachment_downloading_progress; } diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/group/FreestyleEmailUi.mmp --- a/emailuis/emailui/group/FreestyleEmailUi.mmp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/group/FreestyleEmailUi.mmp Tue Jan 26 11:45:42 2010 +0200 @@ -108,7 +108,7 @@ SOURCE FreestyleMessageHeaderHTML.cpp SOURCE FreestyleMessageHeaderURLFactory.cpp SOURCE FreestyleMessageHeaderURLEventHandler.cpp -SOURCE FreestyleAttachmentDownloadProgressBar.cpp +SOURCE FreestyleEmailUiAknStatusIndicator.cpp SOURCE FreestyleEmailUiPropertySubscriber.cpp SOURCE freestyleemailuimailboxdeleter.cpp SOURCE cmailcustomstatuspaneindicators.cpp diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/inc/FSHtmlReloadAO.h --- a/emailuis/emailui/inc/FSHtmlReloadAO.h Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/inc/FSHtmlReloadAO.h Tue Jan 26 11:45:42 2010 +0200 @@ -2,9 +2,9 @@ * Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available -* under the terms of the License "Symbian Foundation License v1.0" +* under the terms of "Eclipse Public License v1.0" * which accompanies this distribution, and is available -* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* at the URL "http://www.eclipse.org/legal/epl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/inc/FreestyleEmailUiAknStatusIndicator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/emailui/inc/FreestyleEmailUiAknStatusIndicator.h Tue Jan 26 11:45:42 2010 +0200 @@ -0,0 +1,101 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Symbian Foundation License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +*/ + + +#ifndef __FREESTYLEEMAILUI_AKN_STATUS_INDICATOR_H__ +#define __FREESTYLEEMAILUI_AKN_STATUS_INDICATOR_H__ + +#include + +#include "FreestyleEmailUiUtilities.h" // FSEmailUiGenericTimer + +const TInt KStatusIndicatorAutomaticHidingDuration = 3000; +const TInt KStatusIndicatorDefaultDuration = -1; + +class CFreestyleEmailUiAknStatusIndicator : public CCoeControl, + protected MFSEmailUiGenericTimerCallback + { +public: + IMPORT_C static CFreestyleEmailUiAknStatusIndicator* NewL( const TRect& aRect, const CCoeControl* aParent = NULL ); + + IMPORT_C static CFreestyleEmailUiAknStatusIndicator* NewLC( const TRect& aRect, const CCoeControl* aParent = NULL ); + + ~CFreestyleEmailUiAknStatusIndicator(); + + // The ownships of aBitmap, aMaskBitmap and aText are transferred in. + // The status indicator is display for aDuration millisecond if aDuration is not negative; + // otherwise, it is diplayed forever until it is manually hidden. + void ShowIndicatorL( CFbsBitmap* aBitmap, + CFbsBitmap* aMaskBitmap, + TDesC* aText, + TInt aDuration ); + + void HideIndicator( TInt aDelayBeforeHidingInMs = 0 ); + + // The ownship of aText is transferred in. + void SetTextL( TDesC* aText ); + + // CCoeControl + CCoeControl* ComponentControl( TInt aIndex ) const; + TInt CountComponentControls() const; + void Draw( const TRect& aRect ) const; + void SizeChanged(); + + inline const CFbsBitmap* Image() const + { + return iBitmap; + } + + inline const CFbsBitmap* ImageMask() const + { + return iMaskBitmap; + } + + inline const TDesC* Text() const + { + return iText; + } + +protected: + CFreestyleEmailUiAknStatusIndicator(); + void ConstructL( const TRect& aRect, const CCoeControl* aParent ); + + void TimerEventL( CFSEmailUiGenericTimer* aTriggeredTimer ); + +private: + void CalculateLayout( const TRect& aRect ) const; + + void SetTextFont() const; + void CalculateVisualText() const; + + void DrawBoundary( const TRect& aRect ) const; + void DrawImage( const TRect& aRect ) const; + void DrawText( const TRect& aRect ) const; + + void SetImage( CFbsBitmap* aBitmap, CFbsBitmap* aMaskBitmap ); + void ScaleImage() const; + + void ClearImage(); + void ClearText(); + +private: + CFbsBitmap* iBitmap; + CFbsBitmap* iMaskBitmap; + TDesC* iText; + + CFSEmailUiGenericTimer* iTimer; + + mutable TRect iImageRect; + mutable TRect iTextRect; + + mutable HBufC* iVisualText; + mutable CFont* iTextFont; + }; + +#endif // __FREESTYLEEMAILUI_AKN_STATUS_INDICATOR_H__ diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/inc/FreestyleEmailUiAppui.h --- a/emailuis/emailui/inc/FreestyleEmailUiAppui.h Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiAppui.h Tue Jan 26 11:45:42 2010 +0200 @@ -211,6 +211,7 @@ void SubscribeMailboxL( TFSMailMsgId aActiveMailboxId ); void SetActiveMailboxL( TFSMailMsgId aActiveMailboxId, TBool aAutoSync = ETrue ); + void StartMonitoringL(); CMsvSession* GetMsvSession(); TFSMailMsgId GetActiveBoxInboxId(); diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/inc/FreestyleEmailUiHtmlViewerContainer.h --- a/emailuis/emailui/inc/FreestyleEmailUiHtmlViewerContainer.h Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiHtmlViewerContainer.h Tue Jan 26 11:45:42 2010 +0200 @@ -31,6 +31,8 @@ class CFSMailMessage; class CFreestyleEmailUiAppUi; class CFreestyleMessageHeaderURLEventHandler; +class CFreestyleEmailUiAknStatusIndicator; +struct TAttachmentData; /** * Html viewer container. @@ -110,6 +112,11 @@ * changed */ void ReloadPageL(); + + void ShowAttacthmentDownloadStatusL( TFSProgress::TFSProgressStatus aProgressStatus, const TAttachmentData& aAttachmentData ); + TBool AttacthmentDownloadStatusVisible(); + void HideAttacthmentDownloadStatus(); + private: // Second phase constructor. @@ -174,6 +181,7 @@ CBrCtlInterface* FindWindowL( const TDesC& aTargetName ) const; void HandleWindowCommandL( const TDesC& aTargetName, TBrCtlWindowCommand aCommand ); + TRect CalcAttachmentStatusRect(); private: // data @@ -207,6 +215,8 @@ TInt iScrollPosition; COverlayControl* iOverlayControlNext; COverlayControl* iOverlayControlPrev; + + CFreestyleEmailUiAknStatusIndicator* iAttachmentStatus; }; diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/inc/FreestyleEmailUiHtmlViewerView.h --- a/emailuis/emailui/inc/FreestyleEmailUiHtmlViewerView.h Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiHtmlViewerView.h Tue Jan 26 11:45:42 2010 +0200 @@ -36,7 +36,6 @@ class CFreestyleEmailUiAppUi; class CFsEmailUiHtmlViewerContainer; class CFreestyleMessageHeaderURL; -class CFreestyleAttachmentDownloadProgressBar; class CAknWaitDialog; // class CFlagSelectionNoteHandler; class CAknGlobalListQuery; @@ -277,7 +276,6 @@ CFSMailMessage* iMessage; THtmlViewerActivationData iActivationData; CFSEmailUiAttachmentsListModel* iAttachmentsListModel; - CFreestyleAttachmentDownloadProgressBar* iProgressBar; // Stack of open messages. Messages are owned by this stack. CStack* iOpenMessages; diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/inc/FreestyleEmailUiMailListVisualiser.h --- a/emailuis/emailui/inc/FreestyleEmailUiMailListVisualiser.h Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/inc/FreestyleEmailUiMailListVisualiser.h Tue Jan 26 11:45:42 2010 +0200 @@ -2,9 +2,9 @@ * Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available -* under the terms of the License "Symbian Foundation License v1.0" +* under the terms of "Eclipse Public License v1.0" * which accompanies this distribution, and is available -* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* at the URL "http://www.eclipse.org/legal/epl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. @@ -75,11 +75,146 @@ class CDateChangeTimer; class CFsTreePlainTwoLineItemData; class CFsTreePlainTwoLineItemVisualizer; -// class CEUiEmailListTouchManager; -// +class MFSMailIterator; class CAknStylusPopUpMenu; +/** + * CMailListModelUpdater + * + * Asynchronous mail list updater. + * + */ +class CMailListModelUpdater : public CActive + { +private: + + // Updater state + enum TState + { + // Idle state. Updater is doing nothing. + EIdle, + // Initializing state. Get ready for the update. + EInitialize, + // Fetching state. Fetch the messages for the model. + EFetch, + // Finalizing state. Model update done. + EFinalize + }; + +public: + + // Updater observer + class MObserver + { + public: + /** + * Called when an error has occured. + */ + virtual void UpdateErrorL(TInt aError) = 0; + + /** + * Called when update begins. + */ + virtual void UpdateBeginL() = 0; + + /** + * Called when new messages fetched. + */ + virtual void UpdateProgressL(TFsTreeItemId& aParentId, RPointerArray& aMessages) = 0; + + /** + * Called when update is completed. + */ + virtual void UpdateCompleteL() = 0; + + /** + * Update cancelled. + * @param aForceRefresh If ETrue, model will be fully refreshed on next activation. + */ + virtual void UpdateCancelled(const TBool aForceRefresh) = 0; + }; + +public: + + /** + * Constructor + */ + CMailListModelUpdater(); + + /** + * Destructor + */ + ~CMailListModelUpdater(); + +public: + + /** + * Reference to sorting criteria array. + */ + RArray& Sorting(); + + /** + * Update model. + */ + void UpdateModelL(MObserver& aObserver, MFSMailIterator* aIterator); + + /** + * Returns ETrue if updating. + */ + TBool IsUpdating() const; + +public: // from CActive + + /** + * @see CActive::RunL + */ + void RunL(); + + /** + * @see CActive::DoCancel + */ + void DoCancel(); + +private: + + /** + * Signal self with given error code and set a new state. + */ + void Signal(TState aState, TInt aError = KErrNone); + + /** + * Initialize update. + */ + void InitializeL(); + + /** + * Fetch one step. + */ + void FetchL(); + + /** + * Finalize update. + */ + void FinalizeL(); + + /** + * Reset to uninitialized state. + */ + void Reset(); + +private: + + RArray iSorting; + TFSMailMsgId iId; + TState iState; + TInt iItemsFetched; + MObserver* iObserver; + MFSMailIterator* iIterator; + TFsTreeItemId iParentId; + TInt iBlockSize; + }; + struct SMailListItem { TFsTreeItemId iListItemId; @@ -122,7 +257,8 @@ public MFSEmailUiFolderListCallback, public MFSEmailUiSortListCallback, public MFsTreeListObserver, - public MFSEmailUiContactHandlerObserver + public MFSEmailUiContactHandlerObserver, + public CMailListModelUpdater::MObserver // { friend class CMailListUpdater; @@ -310,6 +446,8 @@ void InsertNewMessageL( CFSMailMessage* aNewMessage, const TBool aAllowRefresh ); // ownership is transferred void RefreshListItemsL(); + void RefreshListItemsL(TFsTreeItemId& aLatestNodeId, + const TInt aStartIndex, const TInt aEndIndex); // Refresh the list order only void RefreshOrderL(); @@ -325,7 +463,35 @@ // Omitting the argument aChildIdx causes the new item to be appended as last child of the node. TFsTreeItemId InsertListItemL( TInt aModelIndex, TFsTreeItemId aParentNodeId, TInt aChildIdx = KErrNotFound, TBool aAllowRefresh = ETrue ); + // from CMailListModelUpdater::MObserver + + /** + * @see CMailListModelUpdater::MObserver::UpdateErrorL + */ + void UpdateErrorL(TInt aError); + + /** + * @see CMailListModelUpdater::MObserver::UpdateBeginL + */ + void UpdateBeginL(); + + /** + * @see CMailListModelUpdater::MObserver::UpdateProgressL + */ + void UpdateProgressL(TFsTreeItemId& aParentId, RPointerArray& aMessages); + + /** + * @see CMailListModelUpdater::MObserver::UpdateCompleteL + */ + void UpdateCompleteL(); + + /** + * @see CMailListModelUpdater::MObserver::UpdateCancelled + */ + void UpdateCancelled(const TBool aForceRefresh); + // Mail model update + void UpdateMailListModelAsyncL(); void UpdateMailListModelL(); void CreateModelItemsL( RPointerArray& aMessages ); @@ -616,7 +782,9 @@ // Was focus visible in the ListView. TBool iLastFocus; //used to prevent Call application execution (on keyup of call button) when call to contact required - TBool iConsumeStdKeyYes_KeyUp; + TBool iConsumeStdKeyYes_KeyUp; + CMailListModelUpdater* iMailListModelUpdater; + TBool iForceRefresh; }; @@ -668,12 +836,14 @@ ~CDateChangeTimer(); void Start(); void RunL(); - + TInt DayCount(); + protected: CDateChangeTimer( CFSEmailUiMailListVisualiser& aMailListVisualiser ); private: CFSEmailUiMailListVisualiser& iMailListVisualiser; + TInt iDayCount; }; #endif diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/inc/FreestyleMessageHeaderHTML.h --- a/emailuis/emailui/inc/FreestyleMessageHeaderHTML.h Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/inc/FreestyleMessageHeaderHTML.h Tue Jan 26 11:45:42 2010 +0200 @@ -2,9 +2,9 @@ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available -* under the terms of the License "Symbian Foundation License v1.0" +* under the terms of "Eclipse Public License v1.0" * which accompanies this distribution, and is available -* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* at the URL "http://www.eclipse.org/legal/epl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/inc/OverlayControl.h --- a/emailuis/emailui/inc/OverlayControl.h Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/inc/OverlayControl.h Tue Jan 26 11:45:42 2010 +0200 @@ -2,9 +2,9 @@ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available -* under the terms of the License "Symbian Foundation License v1.0" +* under the terms of "Eclipse Public License v1.0" * which accompanies this distribution, and is available -* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* at the URL "http://www.eclipse.org/legal/epl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/inc/ncsheadercontainer.h --- a/emailuis/emailui/inc/ncsheadercontainer.h Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/inc/ncsheadercontainer.h Tue Jan 26 11:45:42 2010 +0200 @@ -342,6 +342,13 @@ TBool IsAddressInputField( const CCoeControl* aControl ) const; TBool IsRemoteSearchInprogress() const; + + /** + * Shows/hides cursor. + * + * @param aShow ETrue - shows, EFalse - hides cursor. + */ + void ShowCursor( TBool aShow ); private: // Function members void FocusChanged(TDrawNow aDrawNow); @@ -430,6 +437,9 @@ TBool iLongTapEventConsumed; TBool iRALInProgress; + + // Currently focused control + CCoeControl* iFocused; }; diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/loc/freestyleemailui.loc --- a/emailuis/emailui/loc/freestyleemailui.loc Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/loc/freestyleemailui.loc Tue Jan 26 11:45:42 2010 +0200 @@ -1916,6 +1916,36 @@ // #define qtn_fse_viewer_note_attachment_restart_downloading "Downloading cancelled. Restart downloading?" +// d:Download status item in the html email viewer +// l:list_single_cmail_header_detail_pane_t1 +// d:%0U stands for the name of the attachment +// d:%1U stands for the percent of attachment file which has been downloaded. +// r:TB9.1 +// +#define qtn_fse_viewer_attachments_download "%0U %1N%" + +// d:Download status item in the html email viewer +// l:list_single_cmail_header_detail_pane_t1 +// d:%0U stands for the percent of attachment file which has been downloaded. +// d:%1U stands for the name of the attachment +// r:TB9.1 +// +#define qtn_fse_viewer_attachments_download_prefix "%0N% %1U" + +// d:Download status item in the html email viewer when download is cancelled +// l:list_single_cmail_header_detail_pane_t1 +// d:%0U stands for the name of the attachment +// r:TB9.1 +// +#define qtn_fse_viewer_attachments_download_cancelled "%0U cancelled" + +// d:Download status item in the html email viewer when download is cancelled +// l:list_single_cmail_header_detail_pane_t1 +// d:%0U stands for the name of the attachment +// r:TB9.1 +// +#define qtn_fse_viewer_attachments_download_cancelled_prefix "cancelled %0U" + // d:Menu component in attachment list which opens the download manager // l:list_single_cmail_header_detail_pane_t1 // r:TB9.1 diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/FSHtmlReloadAO.cpp --- a/emailuis/emailui/src/FSHtmlReloadAO.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/src/FSHtmlReloadAO.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -2,9 +2,9 @@ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available -* under the terms of the License "Symbian Foundation License v1.0" +* under the terms of "Eclipse Public License v1.0" * which accompanies this distribution, and is available -* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* at the URL "http://www.eclipse.org/legal/epl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/FreestyleEmailDownloadInformationMediator.cpp --- a/emailuis/emailui/src/FreestyleEmailDownloadInformationMediator.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/src/FreestyleEmailDownloadInformationMediator.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -233,18 +233,24 @@ if ( aEvent.iProgressStatus == TFSProgress::EFSStatus_RequestComplete && !aEvent.iError ) { - // Show "Download completed" if necessary - if ( CompletionNotesInUseL() && completedDownloadsToNotify ) - { - LaunchDownloadCompleteNoteL( download.iPartData, - completedDownloadsToNotify ); - } // Notification of saved attachments may be given if all downloads of the given message has been completed. if ( download.iNotifyComplete && countObject.iDownloadsCompletedCount && - countObject.iDownloadsCompletedCount == countObject.iDownloadsStartedCount ) + countObject.iDownloadsCompletedCount == countObject.iDownloadsStartedCount && + countObject.iSaveRequestedCount > 0 ) { TFsEmailUiUtility::ShowFilesSavedToFolderNoteL( countObject.iSaveRequestedCount ); } + // Show "Download completed" if necessary + else if ( CompletionNotesInUseL() && completedDownloadsToNotify ) + { + LaunchDownloadCompleteNoteL( download.iPartData, + completedDownloadsToNotify ); + } + else if ( download.iNotifyComplete && + countObject.iSaveRequestedCount == 0 ) + { + TFsEmailUiUtility::OpenAttachmentL( download.iPartData ); + } } // } diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -0,0 +1,308 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Symbian Foundation License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +*/ + +#include "FreestyleEmailUiAknStatusIndicator.h" + +#include +#include +#include + +const TInt KImageMargin = 8; +const TInt KTextMargin = 4; +const TInt KRoundBoundaryEllipse = 5; +const TInt KTuncationCharsWidth = 20; + + +CFreestyleEmailUiAknStatusIndicator* CFreestyleEmailUiAknStatusIndicator::NewL( const TRect& aRect, const CCoeControl* aParent ) + { + CFreestyleEmailUiAknStatusIndicator* self = CFreestyleEmailUiAknStatusIndicator::NewLC( aRect, aParent ); + CleanupStack::Pop( self ); + return self; + } + +CFreestyleEmailUiAknStatusIndicator* CFreestyleEmailUiAknStatusIndicator::NewLC( const TRect& aRect, const CCoeControl* aParent ) + { + CFreestyleEmailUiAknStatusIndicator* self = new (ELeave) CFreestyleEmailUiAknStatusIndicator(); + CleanupStack::PushL( self ); + self->ConstructL( aRect, aParent ); + return self; + } + +CFreestyleEmailUiAknStatusIndicator::~CFreestyleEmailUiAknStatusIndicator() + { + ClearImage(); + ClearText(); + + delete iTimer; + } + +void CFreestyleEmailUiAknStatusIndicator::ShowIndicatorL( CFbsBitmap* aBitmap, + CFbsBitmap* aMaskBitmap, + TDesC* aText, + TInt aDuration ) + { + iTimer->Stop(); + + SetImage( aBitmap, aMaskBitmap ); + SetTextL( aText ); + + MakeVisible( ETrue ); + DrawNow(); + + if ( aDuration >= 0 ) + { + HideIndicator( aDuration ); + } + } + +void CFreestyleEmailUiAknStatusIndicator::SetTextL( TDesC* aText ) + { + SetTextFont(); + + ClearText(); + iText = aText; + if ( iText ) + { + iVisualText = HBufC::NewL( iText->Length() + KAknBidiExtraSpacePerLine ); + CalculateVisualText(); + } + + if ( IsVisible() ) + { + DrawNow(); + } + } + +void CFreestyleEmailUiAknStatusIndicator::HideIndicator( TInt aDelayBeforeHidingInMs ) + { + iTimer->Stop(); + + if ( aDelayBeforeHidingInMs == 0 ) + { + MakeVisible( EFalse ); + } + else + { + iTimer->Start( aDelayBeforeHidingInMs ); + } + } + +CCoeControl* CFreestyleEmailUiAknStatusIndicator::CFreestyleEmailUiAknStatusIndicator::ComponentControl( TInt /*aIndex*/ ) const + { + return NULL; + } + +TInt CFreestyleEmailUiAknStatusIndicator::CountComponentControls() const + { + return 0; + } + +void CFreestyleEmailUiAknStatusIndicator::Draw( const TRect& aRect ) const + { + CWindowGc& gc = SystemGc(); + gc.Clear( aRect ); + + DrawBoundary( aRect ); + DrawImage( iImageRect ); + DrawText( iTextRect ); + } + +void CFreestyleEmailUiAknStatusIndicator::SizeChanged() + { + CalculateLayout( Rect() ); + ScaleImage(); + CalculateVisualText(); + } + +CFreestyleEmailUiAknStatusIndicator::CFreestyleEmailUiAknStatusIndicator() + : iBitmap( NULL ), + iMaskBitmap( NULL ), + iText( NULL ), + iVisualText( NULL ), + iTextFont( NULL ) + { + } + +void CFreestyleEmailUiAknStatusIndicator::ConstructL( const TRect& aRect, const CCoeControl* aParent ) + { + iTimer = CFSEmailUiGenericTimer::NewL( this ); + + if ( !aParent ) + { + CreateWindowL(); + } + else + { + SetContainerWindowL( *aParent ); + } + + SetRect( aRect ); + ActivateL(); + + MakeVisible( EFalse ); + } + +void CFreestyleEmailUiAknStatusIndicator::TimerEventL( CFSEmailUiGenericTimer* /*aTriggeredTimer*/ ) + { + HideIndicator(); + } + +void CFreestyleEmailUiAknStatusIndicator::CalculateLayout( const TRect& aRect ) const + { + TSize imageSize = aRect.Size(); + imageSize.iHeight = imageSize.iHeight - 2 * KImageMargin; + imageSize.iWidth = imageSize.iWidth - 2 * KImageMargin; + if ( imageSize.iWidth > imageSize.iHeight ) + { + imageSize.iWidth = imageSize.iHeight; + } + else + { + imageSize.iHeight = imageSize.iWidth; + } + + TSize textSize = aRect.Size(); + textSize.iHeight = textSize.iHeight - 2 * KTextMargin; + textSize.iWidth = textSize.iWidth - 2 * KTextMargin - 2 * KImageMargin - imageSize.iWidth; + + TLanguage language = User::Language(); + TBidiText::TDirectionality direction = TBidiText::ScriptDirectionality( language ); + if ( direction == TBidiText::ELeftToRight ) + { + TPoint imageLeftTop ( aRect.iTl.iX + KImageMargin, aRect.iTl.iY + KImageMargin ); + iImageRect.SetRect( imageLeftTop, imageSize ); + + TPoint textLeftTop ( aRect.iTl.iX + 2*KImageMargin + imageSize.iWidth + KTextMargin, aRect.iTl.iY + KTextMargin ); + iTextRect.SetRect( textLeftTop, textSize ); + } + else + { + TPoint imageLeftTop ( aRect.iBr.iX - KImageMargin - imageSize.iWidth, aRect.iTl.iY + KImageMargin ); + iImageRect.SetRect( imageLeftTop, imageSize ); + + TPoint textLeftTop ( aRect.iTl.iX + KTextMargin, aRect.iTl.iY + KTextMargin ); + iTextRect.SetRect( textLeftTop, textSize ); + } + } + +void CFreestyleEmailUiAknStatusIndicator::SetTextFont() const + { + if ( iTextFont ) + return; + + const CFont* font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimarySmallFont ); + iTextFont = CONST_CAST( CFont*, font ); + } + +void CFreestyleEmailUiAknStatusIndicator::CalculateVisualText() const + { + if ( iVisualText ) + { + TPtr visualText = iVisualText->Des(); + visualText.Zero(); + TInt MaxWidthInPixels = iTextRect.Size().iWidth - KTuncationCharsWidth; + TInt MaxClippedWidthInPixels = iTextRect.Size().iWidth; + AknBidiTextUtils::ConvertToVisualAndClip( *iText, + visualText, + *iTextFont, + MaxWidthInPixels, + MaxClippedWidthInPixels ); + } + } + +void CFreestyleEmailUiAknStatusIndicator::DrawBoundary( const TRect& aRect ) const + { + CWindowGc& gc = SystemGc(); + gc.SetPenColor( KRgbCyan ); + TSize ellipse( KRoundBoundaryEllipse, KRoundBoundaryEllipse ); + gc.DrawRoundRect( aRect, ellipse); + } + +void CFreestyleEmailUiAknStatusIndicator::DrawImage( const TRect& aRect ) const + { + if ( !iBitmap ) + return; + + CWindowGc& gc = SystemGc(); + if ( iMaskBitmap ) + { + TRect bmpPieceRect(TPoint(0,0), aRect.Size() ); + gc.BitBltMasked( aRect.iTl, iBitmap, bmpPieceRect, iMaskBitmap, EFalse ); + } + else + { + gc.DrawBitmap( aRect, iBitmap ); + } + } + +void CFreestyleEmailUiAknStatusIndicator::DrawText( const TRect& aRect ) const + { + if ( !iVisualText ) + return; + if ( iVisualText->Length() == 0 ) + return; + + TLanguage language = User::Language(); + TBidiText::TDirectionality direction = TBidiText::ScriptDirectionality( language ); + + CGraphicsContext::TTextAlign alignment = CGraphicsContext::ELeft; + if ( direction == TBidiText::ERightToLeft ) + { + alignment = CGraphicsContext::ERight; + } + + CWindowGc& gc = SystemGc(); + gc.UseFont( iTextFont ); + + TInt baseline = aRect.Height() / 2 + iTextFont->FontMaxAscent() / 2; + + gc.SetPenColor(KRgbBlack); + + gc.DrawText( *iVisualText, aRect, baseline, alignment, 0); + } + +void CFreestyleEmailUiAknStatusIndicator::SetImage( CFbsBitmap* aBitmap, CFbsBitmap* aMaskBitmap ) + { + ClearImage(); + iBitmap = aBitmap; + iMaskBitmap = aMaskBitmap; + ScaleImage(); + } + +void CFreestyleEmailUiAknStatusIndicator::ScaleImage() const + { + if ( iBitmap ) + { + AknIconUtils::DisableCompression( iBitmap ); + AknIconUtils::SetSize( iBitmap, iImageRect.Size(), EAspectRatioPreserved ); + } + if ( iMaskBitmap ) + { + AknIconUtils::DisableCompression( iMaskBitmap ); + AknIconUtils::SetSize( iMaskBitmap, iImageRect.Size(), EAspectRatioPreserved ); + } + } + +void CFreestyleEmailUiAknStatusIndicator::ClearImage() + { + delete iBitmap; + iBitmap = NULL; + delete iMaskBitmap; + iMaskBitmap = NULL; + } + +void CFreestyleEmailUiAknStatusIndicator::ClearText() + { + delete iText; + iText = NULL; + + delete iVisualText; + iVisualText = NULL; + } + diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/FreestyleEmailUiAppui.cpp --- a/emailuis/emailui/src/FreestyleEmailUiAppui.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiAppui.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -1539,29 +1539,39 @@ // Start connect automatically if asked by the caller // Disabled if offline or roaming - if ( aAutoSync && !TFsEmailUiUtility::IsOfflineModeL() ) - { - // Create at first auto-connect, autosync monitor will check whether - // it is ok to start auto-connect, e.g. phone is not roaming, searching for net, etc - if ( !iAutoSyncMonitor ) - { - // TRAP following since failing to create auto sync monitor should not prevent user - // from opening mail list, leave only in OOM case. - TRAPD( err, iAutoSyncMonitor = CFSEmailUiAutosyncMonitor::NewL( *this ) ); - if ( err == KErrNoMemory ) - { - User::Leave( err ); - } - } - // Request auto sync if allowed in the current network mode and - // autosyncmonitor has been succesfully created - if ( iAutoSyncMonitor ) - { - iAutoSyncMonitor->StartMonitoring(); - } - } + if ( aAutoSync ) + { + StartMonitoringL(); + } } +void CFreestyleEmailUiAppUi::StartMonitoringL() + { + FUNC_LOG; + // Start connect automatically if asked by the caller + // Disabled if offline or roaming + if ( !TFsEmailUiUtility::IsOfflineModeL() ) + { + // Create at first auto-connect, autosync monitor will check whether + // it is ok to start auto-connect, e.g. phone is not roaming, searching for net, etc + if ( !iAutoSyncMonitor ) + { + // TRAP following since failing to create auto sync monitor should not prevent user + // from opening mail list, leave only in OOM case. + TRAPD( err, iAutoSyncMonitor = CFSEmailUiAutosyncMonitor::NewL( *this ) ); + if ( err == KErrNoMemory ) + { + User::Leave( err ); + } + } + // Request auto sync if allowed in the current network mode and + // autosyncmonitor has been succesfully created + if ( iAutoSyncMonitor ) + { + iAutoSyncMonitor->StartMonitoring(); + } + } + } void CFreestyleEmailUiAppUi::DoAutoConnectL() { @@ -2740,10 +2750,7 @@ void CFSEmailUiAutosyncMonitor::StartMonitoring() { FUNC_LOG; - if ( IsActive() ) - { Cancel(); - } #ifdef __WINS__ // do not try to connect on the emulator iRegisterationStatus = RMobilePhone::ERegisteredOnHomeNetwork; TRequestStatus* status = &iStatus; diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/FreestyleEmailUiAttachmentsListModel.cpp --- a/emailuis/emailui/src/FreestyleEmailUiAttachmentsListModel.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiAttachmentsListModel.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -495,7 +495,13 @@ KFsTreeNoneID, partData }; - attachment.downloadProgress = KComplete; + + // if not fully fetched than restart download; + if (IsCompletelyDownloadedL(attachment)) + attachment.downloadProgress = KComplete; + else + attachment.downloadProgress = KNone; + iAttachments.Append( attachment ); } CleanupStack::PopAndDestroy( &mailParts ); diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/FreestyleEmailUiHtmlViewerContainer.cpp --- a/emailuis/emailui/src/FreestyleEmailUiHtmlViewerContainer.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiHtmlViewerContainer.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -22,6 +22,10 @@ #include #include #include +#include +#include +#include + // #include "CFSMailMessage.h" // @@ -29,6 +33,8 @@ #include #include +#include + #include "FreestyleEmailUiAppui.h" #include "FreestyleEmailUiUtilities.h" #include "FreestyleEmailUiHtmlViewerContainer.h" @@ -37,6 +43,8 @@ #include "FreestyleMessageHeaderHTML.h" #include "FreestyleMessageHeaderURLEventHandler.h" +#include "FreestyleEmailUiAknStatusIndicator.h" +#include "FreestyleEmailUiAttachmentsListModel.h" _LIT( KContentIdPrefix, "cid:" ); _LIT( KCDrive, "c:" ); @@ -72,6 +80,7 @@ _LIT8( KHtmlAmpersand, "&" ); _LIT8( KHtmlQuotation, """ ); _LIT8( KHtmlLinkTag, "" ); +_LIT8( KHtmlLinkTagWWW, "" ); _LIT8( KHtmlLinkEndTag, "" ); _LIT( KURLTypeBody, "body"); @@ -88,8 +97,10 @@ const TReal KOverlayButtonMarginY = 0.01; // 1% const TReal KOverlayButtonSizeP = 0.15; // 15% const TReal KOverlayButtonSizeLs = 0.20; // 25% -const TReal KOverlayButtonPosP = 0.88; -const TReal KOverlayButtonPosLs = 0.85; + + +const TInt KStatusIndicatorHeight = 50; +const TInt KStatusIndicatorXMargin = 50; // --------------------------------------------------------------------------- // Two-phased constructor. @@ -368,7 +379,7 @@ } else { - CFSMailMessagePart* textBodyPart = iMessage->PlainTextBodyPartL();; + CFSMailMessagePart* textBodyPart = iMessage->PlainTextBodyPartL(); if ( textBodyPart ) { @@ -444,6 +455,11 @@ { return iBrCtlInterface; } + case 1: + if ( iAttachmentStatus ) + return iAttachmentStatus; + else + return NULL; default: { return NULL; @@ -458,7 +474,14 @@ TInt CFsEmailUiHtmlViewerContainer::CountComponentControls() const { FUNC_LOG; - return 1; + if ( iAttachmentStatus ) + { + return 2; + } + else + { + return 1; + } } // --------------------------------------------------------------------------- @@ -510,6 +533,12 @@ } UpdateOverlayButtons( IsVisible() ); + + if ( iAttachmentStatus ) + { + TRect rect = CalcAttachmentStatusRect(); + iAttachmentStatus->SetRect( rect ); + } } // --------------------------------------------------------------------------- @@ -1354,11 +1383,29 @@ if ( url.CompareC( KWww ) != KErrNone ) // if token=www., validate format { // www.x RBuf8 urlBuf; - urlBuf.CreateL( KHtmlLinkTag().Length() + url.Length() * 2 - + KHtmlLinkEndTag().Length() + KHtmlLineBreak().Length() ); + TBool wwwLink( EFalse ); + if ( url.Left( KWww().Length() ).CompareF( KWww ) == 0 ) + { + wwwLink = ETrue; + //Hyperlinks beginning with www. needs http:// prefix + urlBuf.CreateL( KHtmlLinkTagWWW().Length() + url.Length() * 2 + + KHtmlLinkEndTag().Length() + KHtmlLineBreak().Length() + KHttp().Length() ); + } + else + { + urlBuf.CreateL( KHtmlLinkTag().Length() + url.Length() * 2 + + KHtmlLinkEndTag().Length() + KHtmlLineBreak().Length() ); + } urlBuf.CleanupClosePushL(); // Format html link - urlBuf.AppendFormat( KHtmlLinkTag, &url ); + if ( wwwLink ) + { + urlBuf.AppendFormat( KHtmlLinkTagWWW, &KHttp, &url ); + } + else + { + urlBuf.AppendFormat( KHtmlLinkTag, &url ); + } urlBuf.Append( url ); urlBuf.Append( KHtmlLinkEndTag ); if ( lineBreakPos != KErrNotFound ) @@ -1444,6 +1491,10 @@ // boundaries, move to next segment nextPos += nextSegment.Length(); nextSegment.Set( aSource.Ptr( nextPos ) ); + if( nextSegment.Length() == 0 ) + { + break; + } lexNextSegment.Assign( nextSegment ); nextNextToken.Set( lexNextSegment.NextToken() ); if ( firstPass ) @@ -1468,11 +1519,31 @@ if ( endOfUrlPos != KErrNotFound ) { // Handle hyperlink that is within 2K limit RBuf8 urlBuf; - urlBuf.CreateL( KHtmlLinkTag().Length() + url.Length() * 2 - + KHtmlLinkEndTag().Length() + KHtmlLineBreak().Length() ); + TBool wwwLink( EFalse ); + + if ( url.Left( KWww().Length() ).CompareF( KWww ) == 0 ) + { + wwwLink = ETrue; + urlBuf.CreateL( KHtmlLinkTagWWW().Length() + url.Length() * 2 + + KHtmlLinkEndTag().Length() + KHtmlLineBreak().Length() + KHttp().Length() ); + } + else + { + urlBuf.CreateL( KHtmlLinkTag().Length() + url.Length() * 2 + + KHtmlLinkEndTag().Length() + KHtmlLineBreak().Length() ); + } + urlBuf.CleanupClosePushL(); - // Format html link - urlBuf.AppendFormat( KHtmlLinkTag, &url ); + // Format html link + if ( wwwLink ) + { + urlBuf.AppendFormat( KHtmlLinkTagWWW, &KHttp, &url ); + } + else + { + urlBuf.AppendFormat( KHtmlLinkTag, &url ); + } + urlBuf.Append( url ); urlBuf.Append( KHtmlLinkEndTag ); urlBuf.Append( KHtmlLineBreak ); @@ -1640,6 +1711,127 @@ SetRect( iAppUi.ClientRect() ); } +void CFsEmailUiHtmlViewerContainer::ShowAttacthmentDownloadStatusL( + TFSProgress::TFSProgressStatus aProgressStatus, + const TAttachmentData& aAttachmentData ) + { + TBool freshDraw = EFalse; + + if ( !iAttachmentStatus ) + { + TRect rect = CalcAttachmentStatusRect(); + iAttachmentStatus = CFreestyleEmailUiAknStatusIndicator::NewL( rect, this ); + freshDraw = ETrue; + } + + if ( !iAttachmentStatus->IsVisible() + || ( aAttachmentData.downloadProgress == KNone ) + || ( aProgressStatus == TFSProgress::EFSStatus_RequestCancelled ) ) + { + freshDraw = ETrue; + } + + TInt duration = KStatusIndicatorDefaultDuration; + if ( ( aAttachmentData.downloadProgress == TFSProgress::EFSStatus_RequestComplete ) + || ( aProgressStatus == TFSProgress::EFSStatus_RequestCancelled ) + || ( aAttachmentData.downloadProgress == KComplete ) ) + { + duration = KStatusIndicatorAutomaticHidingDuration; + } + + HBufC* statusText = NULL; + switch ( aProgressStatus ) + { + case TFSProgress::EFSStatus_Status: + case TFSProgress::EFSStatus_RequestComplete: + { + CDesCArray* descArray = new (ELeave) CDesCArrayFlat( 1 ); + CleanupStack::PushL( descArray ); + descArray->AppendL( aAttachmentData.fileName ); + CArrayFix* intArray = new (ELeave) CArrayFixFlat( 1 ); + CleanupStack::PushL( intArray ); + intArray->AppendL( aAttachmentData.downloadProgress ); + + statusText = StringLoader::LoadL( R_FSE_VIEWER_ATTACHMENTS_LIST_DOWNLOAD, + *descArray, + *intArray ); + CleanupStack::PopAndDestroy( intArray ); + CleanupStack::PopAndDestroy( descArray ); + CleanupStack::PushL( statusText ); + } + break; + + case TFSProgress::EFSStatus_RequestCancelled: + { + statusText = aAttachmentData.fileName.AllocLC(); + } + break; + + default: + statusText = KNullDesC().AllocLC(); + break; + } + + if ( statusText->Length() > 0 ) + { + if ( freshDraw ) + { + CFbsBitmap* image = NULL; + CFbsBitmap* imageMask = NULL; + if ( aProgressStatus == TFSProgress::EFSStatus_RequestCancelled ) + { + iAppUi.FsTextureManager()->ProvideBitmapL(EAttachmentsCancelDownload, image, imageMask ); + } + else + { + iAppUi.FsTextureManager()->ProvideBitmapL(EAttachmentsDownload, image, imageMask ); + } + iAttachmentStatus->ShowIndicatorL( image, imageMask, statusText, duration ); + } + else + { + iAttachmentStatus->SetTextL( statusText ); + if ( duration > -1 ) + { + iAttachmentStatus->HideIndicator( duration ); + } + } + } + + CleanupStack::Pop( statusText ); + } + +TBool CFsEmailUiHtmlViewerContainer::AttacthmentDownloadStatusVisible() + { + if ( iAttachmentStatus ) + { + return iAttachmentStatus->IsVisible(); + } + else + { + return EFalse; + } + } + +void CFsEmailUiHtmlViewerContainer::HideAttacthmentDownloadStatus() + { + if ( iAttachmentStatus ) + { + iAttachmentStatus->MakeVisible( EFalse ); + } + } + +TRect CFsEmailUiHtmlViewerContainer::CalcAttachmentStatusRect() + { + TRect rect = Rect(); + TPoint topLeft = rect.iTl; + TPoint bottomRight = rect.iBr; + + TPoint statusTopLeft( topLeft.iX + KStatusIndicatorXMargin, bottomRight.iY - KStatusIndicatorHeight + 1 ); + TPoint statusBottomRight( bottomRight.iX - KStatusIndicatorXMargin, bottomRight.iY ); + return TRect( statusTopLeft, statusBottomRight ); + } + /** * The body fetch link is cmail://body/fetch. Look for the URL separator * and the presence of cmail and body on the url. diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/FreestyleEmailUiHtmlViewerView.cpp --- a/emailuis/emailui/src/FreestyleEmailUiHtmlViewerView.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiHtmlViewerView.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -56,7 +56,6 @@ #include "FreestyleEmailCenRepHandler.h" #include "FreestyleEmailUiAttachmentsListModel.h" #include "FreestyleEmailUiConstants.h" -#include "FreestyleAttachmentDownloadProgressBar.h" #include "FSEmail.pan" #include "CFSMailCommon.h" @@ -114,7 +113,6 @@ } delete iContainer; delete iAttachmentsListModel; - delete iProgressBar; delete iOpenMessages; iOpenMessages = NULL; @@ -125,9 +123,6 @@ delete iMailBox; iMailBox = NULL; delete iAsyncCallback; - - - } void CFsEmailUiHtmlViewerView::ConstructL() @@ -451,6 +446,7 @@ if ( iContainer ) { + iContainer->HideAttacthmentDownloadStatus(); iContainer->MakeVisible( EFalse ); iAppUi.RemoveFromStack( iContainer ); } @@ -1655,6 +1651,10 @@ else if ( aAttachment.downloadProgress != KComplete ) { DownloadAttachmentL( aAttachment ); + if ( iContainer && !iContainer->AttacthmentDownloadStatusVisible() ) + { + iContainer->ShowAttacthmentDownloadStatusL( TFSProgress::EFSStatus_Status, aAttachment ); + } } else { @@ -1669,6 +1669,11 @@ { TInt savedCount( 0 ); TBool downloadRequired = iAttachmentsListModel->SaveAttachmentL( aAttachment, fileName, savedCount ); + if ( downloadRequired && iContainer && !iContainer->AttacthmentDownloadStatusVisible() ) + { + iContainer->ShowAttacthmentDownloadStatusL( TFSProgress::EFSStatus_Status, aAttachment ); + } + if ( savedCount ) { TFsEmailUiUtility::ShowFilesSavedToFolderNoteL( savedCount ); @@ -1682,6 +1687,18 @@ if ( TFsEmailUiUtility::ShowSaveFolderDialogL( fileName ) ) { TBool downloadRequired = iAttachmentsListModel->SaveAllAttachmentsL( fileName ); + if ( downloadRequired && iContainer && !iContainer->AttacthmentDownloadStatusVisible() ) + { + for ( TInt i = 0; i < iAttachmentsListModel->GetModel().Count(); i++ ) + { + const TAttachmentData& attachment = iAttachmentsListModel->GetModel()[i]; + if ( attachment.downloadProgress < KComplete ) + { + iContainer->ShowAttacthmentDownloadStatusL( TFSProgress::EFSStatus_Status, attachment ); + break; + } + } + } } } @@ -1717,61 +1734,48 @@ { FUNC_LOG; - if ( iMessage ) + if ( !iMessage || !iContainer || ( aEvent.iError != KErrNone ) ) + return; + + TAttachmentData* attachment = NULL; + const RArray& attachments = iAttachmentsListModel->GetModel(); + for ( TInt i=0; i < attachments.Count(); i++ ) { - if ( !iProgressBar ) + if ( attachments[i].partData == aPart ) { - iProgressBar = CFreestyleAttachmentDownloadProgressBar::NewL(); + attachment = CONST_CAST( TAttachmentData*, &iAttachmentsListModel->GetModel()[i] ); + break; } - - for ( TInt i=0; i < iAttachmentsListModel->GetModel().Count(); i++ ) + } + + if ( attachment ) + { + switch ( aEvent.iProgressStatus ) { - if ( iAttachmentsListModel->GetModel()[i].partData == aPart ) + case TFSProgress::EFSStatus_Status: { - TAttachmentData& attachment = CONST_CAST( TAttachmentData&, iAttachmentsListModel->GetModel()[i] ); - - if ( aEvent.iError ) + if ( aEvent.iMaxCount > 0 && aEvent.iCounter > 0 ) { - iProgressBar->HideL(); + attachment->downloadProgress = KComplete * aEvent.iCounter / aEvent.iMaxCount; } else { - switch ( aEvent.iProgressStatus ) - { - case TFSProgress::EFSStatus_Status: - { - if ( aEvent.iMaxCount > 0 && aEvent.iCounter > 0 ) - { - attachment.downloadProgress = KComplete * aEvent.iCounter / aEvent.iMaxCount; - } - else - { - attachment.downloadProgress = KNone; - } - iProgressBar->UpdateL( attachment ); - } - break; - - case TFSProgress::EFSStatus_RequestComplete: - { - attachment.downloadProgress = KComplete; - iProgressBar->UpdateL( attachment ); - } - break; - - case TFSProgress::EFSStatus_RequestCancelled: - { - iProgressBar->HideL(); - } - break; - - default: - break; - } + attachment->downloadProgress = KNone; } - break; + } + break; + + case TFSProgress::EFSStatus_RequestComplete: + { + attachment->downloadProgress = KComplete; } + break; + + default: + break; } + + iContainer->ShowAttacthmentDownloadStatusL( aEvent.iProgressStatus, *attachment ); } } diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp --- a/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -2,9 +2,9 @@ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available -* under the terms of the License "Symbian Foundation License v1.0" +* under the terms of "Eclipse Public License v1.0" * which accompanies this distribution, and is available -* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* at the URL "http://www.eclipse.org/legal/epl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. @@ -97,7 +97,192 @@ _LIT( KMissingPreviewDataMarker, "..." ); static const TInt KMaxItemsFethed = 1000; -static const TInt KCMsgBlock = 100; +static const TInt KCMsgBlock = 15; +static const TInt KCMsgMaxBlock = 120; + +// --------------------------------------------------------------------------- +// Generic method for deleting a pointer and setting it NULL. +// --------------------------------------------------------------------------- +// +template void SafeDelete(T*& ptr) + { + delete ptr; + ptr = NULL; + } + +// CMailListModelUpdater + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CMailListModelUpdater::CMailListModelUpdater() : CActive(EPriorityStandard) + { + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CMailListModelUpdater::~CMailListModelUpdater() + { + iObserver = NULL; + Cancel(); + iSorting.Close(); + } + +// --------------------------------------------------------------------------- +// Returns arrays for sorting parameters. Updater owns the arrays because +// it has to stay alive as long as the iterator is being used. +// --------------------------------------------------------------------------- +// +RArray& CMailListModelUpdater::Sorting() + { + iSorting.Reset(); + return iSorting; + } + +// --------------------------------------------------------------------------- +// Update the mail list model from given iterator. Update progress will be +// informed to the observer. +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::UpdateModelL(MObserver& aObserver, MFSMailIterator* aIterator) + { + Cancel(); + iObserver = &aObserver; + iIterator = aIterator; + Signal(EInitialize); + } + +// --------------------------------------------------------------------------- +// Internal method. Sets new state and signals itself. +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::Signal(TState aState, TInt aError) + { + iState = aState; + iStatus = KRequestPending; + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete(status, aError); + } + +// --------------------------------------------------------------------------- +// Initialization state. Reset update and call UpdateBeginL() for the observer. +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::InitializeL() + { + iBlockSize = KCMsgBlock; + iParentId = KFsTreeRootID; + iId = TFSMailMsgId(); + iItemsFetched = 0; + iObserver->UpdateBeginL(); + Signal(EFetch); + } + +// --------------------------------------------------------------------------- +// Fetch state. Fetch next messages and if there is more messages signal +// fetch state again OR proceed to finalizing state. +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::FetchL() + { + RPointerArray messages(iBlockSize); + CleanupClosePushL(messages); + const TBool moreMessages(iIterator->NextL(iId, iBlockSize, messages)); + iBlockSize = Min(KCMsgMaxBlock, iBlockSize * 2); + if (messages.Count() > 0) + { + iItemsFetched += messages.Count(); + iId = messages[messages.Count() - 1]->GetMessageId(); + iObserver->UpdateProgressL(iParentId, messages); + } + CleanupStack::PopAndDestroy(); // messages.Close() + if (moreMessages && iItemsFetched < KMaxItemsFethed) + { + Signal(EFetch); + } + else + { + Signal(EFinalize); + } + } + +// --------------------------------------------------------------------------- +// Finalizing state. Notify observer that model update has been done and +// free the resources. +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::FinalizeL() + { + iObserver->UpdateCompleteL(); + Reset(); + } + +// --------------------------------------------------------------------------- +// If the state is anything but EIdle, returns ETrue. +// --------------------------------------------------------------------------- +// +TBool CMailListModelUpdater::IsUpdating() const + { + return iState > EIdle; + } + +// --------------------------------------------------------------------------- +// Reset the state to EIdle and free resources. +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::Reset() + { + iSorting.Reset(); + SafeDelete(iIterator); + iState = EIdle; + } + +// --------------------------------------------------------------------------- +// Active objects RunL() +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::RunL() + { + const TInt error(iStatus.Int()); + if (!error) + { + switch (iState) + { + case EInitialize: + InitializeL(); + break; + case EFetch: + FetchL(); + break; + case EFinalize: + default: + FinalizeL(); + break; + } + } + else + { + iObserver->UpdateErrorL(error); + } + } + +// --------------------------------------------------------------------------- +// Update has been cancelled. Inform the observer and free resources. +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::DoCancel() + { + if (iObserver) + { + iObserver->UpdateCancelled(IsUpdating()); + } + Reset(); + } // --------------------------------------------------------------------------- // Static constructor. @@ -139,6 +324,8 @@ BaseConstructL( R_FSEMAILUI_MAIL_LIST_VIEW ); + iMailListModelUpdater = new (ELeave) CMailListModelUpdater(); + // Don't construct this anywhere else than here. // Don't delete this until in the destructor to avoid NULL checks. iModel = CFSEmailUiMailListModel::NewL( &iAppUi ); @@ -282,8 +469,8 @@ : CFsEmailUiViewBase( aMailListControlGroup, *aAppUi ), iEnv( aEnv ), iListMarkItemsState( ETrue ), //Initlly list has no markings - iConsumeStdKeyYes_KeyUp( EFalse ), // use to prevent Call application execution if call for contact processed - iMoveToFolderOngoing( EFalse ) + iMoveToFolderOngoing( EFalse ), + iConsumeStdKeyYes_KeyUp( EFalse ) // use to prevent Call application execution if call for contact processed { FUNC_LOG; } @@ -295,12 +482,8 @@ CFSEmailUiMailListVisualiser::~CFSEmailUiMailListVisualiser() { FUNC_LOG; - if ( iMailFolder ) - { - delete iMailFolder; - iMailFolder = NULL; - } - + SafeDelete(iMailListModelUpdater); + SafeDelete(iMailFolder); delete iTouchManager; delete iStylusPopUpMenu; delete iMailList; @@ -314,35 +497,31 @@ void CFSEmailUiMailListVisualiser::PrepareForExit() { FUNC_LOG; + iMailListModelUpdater->Cancel(); if ( iMsgNoteTimer ) { iMsgNoteTimer->Cancel(); - delete iMsgNoteTimer; - iMsgNoteTimer = NULL; + SafeDelete(iMsgNoteTimer); } if ( iDateChangeTimer ) { iDateChangeTimer->Cancel(); - delete iDateChangeTimer; - iDateChangeTimer = NULL; + SafeDelete(iDateChangeTimer); } if ( iMailListUpdater ) { iMailListUpdater->Stop(); - delete iMailListUpdater; - iMailListUpdater = NULL; + SafeDelete(iMailListUpdater); } if ( iAsyncRedrawer ) { iAsyncRedrawer->Cancel(); - delete iAsyncRedrawer; - iAsyncRedrawer = NULL; + SafeDelete(iAsyncRedrawer); } if ( iAsyncCallback ) { iAsyncCallback->Cancel(); - delete iAsyncCallback; - iAsyncCallback = NULL; + SafeDelete(iAsyncCallback); } if ( iMailList ) { @@ -352,16 +531,10 @@ { iControlBarControl->RemoveObserver( *this ); } - // + SafeDelete(iMailFolder); iTreeItemArray.Reset(); - if ( iMailFolder ) - { - delete iMailFolder; - iMailFolder = NULL; - } // Reset, not delete to avoid NULL checks. iModel->Reset(); - // } // --------------------------------------------------------------------------- @@ -375,6 +548,101 @@ } // --------------------------------------------------------------------------- +// @see CMailListModelUpdater::MObserver::UpdateErrorL +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::UpdateErrorL(TInt aError) + { + FUNC_LOG; + User::Leave(aError); + } + +// --------------------------------------------------------------------------- +// @see CMailListModelUpdater::MObserver::UpdateBeginL +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::UpdateBeginL() + { + FUNC_LOG; + iModel->Reset(); + iTreeItemArray.Reset(); + } + +// --------------------------------------------------------------------------- +// @see CMailListModelUpdater::MObserver::UpdateProgressL +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::UpdateProgressL(TFsTreeItemId& aParentId, RPointerArray& aMessages) + { + FUNC_LOG; + const TInt itemsInModel(iModel->Count()); + CreateModelItemsL(aMessages); + RefreshListItemsL(aParentId, itemsInModel, iModel->Count()); + } + +// --------------------------------------------------------------------------- +// @see CMailListModelUpdater::MObserver::UpdateCompleteL +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::UpdateCompleteL() + { + FUNC_LOG; + if ( !iModel->Count() ) + { + iFocusedControl = EControlBarComponent; + } + else + { + iFocusedControl = EMailListComponent; + if (iMailList->FocusedItem() == KFsTreeNoneID) + { + iMailList->SetFocusedItemL( iTreeItemArray[0].iListItemId ); + } + } + SetListAndCtrlBarFocusL(); + iAppUi.StartMonitoringL(); + } + +// --------------------------------------------------------------------------- +// @see CMailListModelUpdater::MObserver::UpdateCancelled +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::UpdateCancelled(const TBool aForceRefresh) + { + FUNC_LOG; + iForceRefresh = aForceRefresh; + } + +// --------------------------------------------------------------------------- +// Asynchronous mail list model update. +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::UpdateMailListModelAsyncL() + { + FUNC_LOG; + if ( iMailFolder ) + { + TFSMailDetails details( EFSMsgDataEnvelope ); + RArray& sorting(iMailListModelUpdater->Sorting()); + sorting.AppendL( iCurrentSortCriteria ); + if ( iCurrentSortCriteria.iField != EFSMailSortByDate ) + { + // Add date+descending as secondary sort criteria if primary field is something else than date + TFSMailSortCriteria secondarySortCriteria; + secondarySortCriteria.iField = EFSMailSortByDate; + secondarySortCriteria.iOrder = EFSMailDescending; + sorting.AppendL( secondarySortCriteria ); + } + // List all or maximum number of messages + iMailListModelUpdater->UpdateModelL(*this, iMailFolder->ListMessagesL(details, sorting)); + } + else + { + UpdateCompleteL(); + } + } + +// --------------------------------------------------------------------------- // // // --------------------------------------------------------------------------- @@ -382,9 +650,10 @@ void CFSEmailUiMailListVisualiser::UpdateMailListModelL() { FUNC_LOG; + // Make sure asynchronous update is not going on + iMailListModelUpdater->Cancel(); // Reset model with each update iModel->Reset(); - if ( iMailFolder ) { // Update folder if provided, otherwise use current folder @@ -446,15 +715,31 @@ { FUNC_LOG; // New Items - CFSEmailUiMailListModelItem* newItem = NULL; + CFSEmailUiMailListModelItem* newItem(NULL); // Draw first separator if there are messages. if ( aMessages.Count() && iNodesInUse == EListControlSeparatorEnabled ) { + if (iModel->Count()) + { + CFSMailMessage* nextMessage = aMessages[0]; + CFSEmailUiMailListModelItem* previousMessage(static_cast(iModel->Item(iModel->Count() - 1))); + TBool needANewDivider = + !MessagesBelongUnderSameSeparatorL( previousMessage->MessagePtr(), *nextMessage ); + if ( needANewDivider ) + { + newItem = CreateSeparatorModelItemLC( *nextMessage ); + iModel->AppendL( newItem ); + CleanupStack::Pop( newItem ); + } + } + else + { newItem = CreateSeparatorModelItemLC( *aMessages[0] ); iModel->AppendL( newItem ); CleanupStack::Pop( newItem ); } + } // Start appending items for (int i = 0; i < aMessages.Count(); i++) @@ -951,6 +1236,7 @@ { iAppUi.FolderList().HidePopupL(); } + DisableMailList( EFalse ); // inform baseView if view entered with forward navigation TBool forwardNavigation = EFalse; @@ -1116,19 +1402,24 @@ // CHECK IF MODEL NEEDS TO BE UPDATED if ( activationData.iMailBoxId != prevMailBoxId || activationData.iFolderId != prevFolderId || - activationData.iRequestRefresh ) + activationData.iRequestRefresh || + iForceRefresh ) { + iForceRefresh = EFalse; // Set initial sort criteria when folder is changed iCurrentSortCriteria.iField = EFSMailSortByDate; iCurrentSortCriteria.iOrder = EFSMailDescending; SetSortButtonTextAndIconL(); - delete iMailFolder; - iMailFolder = NULL; + SafeDelete(iMailFolder); TRAP_IGNORE( iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( activationData.iMailBoxId, activationData.iFolderId ) ); if ( !iMailFolder ) { + if ( forwardNavigation ) + { + iAppUi.StartMonitoringL(); + } // Safety, try to revert back to standard folder inbox TFSMailMsgId inboxId = iAppUi.GetActiveMailbox()->GetStandardFolderId( EFSInbox ); iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( activationData.iMailBoxId, inboxId ); @@ -1150,9 +1441,6 @@ // Check sync icon timer and sync status ConnectionIconHandling(); - iMailList->HideListL(); - iMailList->ShowListL(); - // REBUILD TREE LIST IF NECESSARY if ( refreshNeeded ) { @@ -1161,25 +1449,38 @@ TFSMailMsgId focused = MsgIdFromListId( iMailList->FocusedItem() ); // Clear any previous items from the screen and then make the view visible + iMailList->BeginUpdate(); iMailList->RemoveAllL(); iTreeItemArray.Reset(); - UpdateMailListModelL(); - RefreshDeferred( &focused ); + iModel->Reset(); + iMailList->EndUpdateL(); + iMailList->ShowListL(); + + // If coming from wizard use synchronous list updating + if (activationData.iReturnAfterWizard) + { + UpdateMailListModelL(); + } + else + { + UpdateMailListModelAsyncL(); + } } - // THE CORRECT FOLDER IS ALREADY OPEN. CHECK IF SOME PARTIAL UPDATE IS NEEDED. else { - // hide & show list to force it to adept to changed screen size + iMailList->ShowListL(); + if (forwardNavigation) + { + iAppUi.StartMonitoringL(); + } SetListAndCtrlBarFocusL(); // ShowListL() makes list focused and this may need to be reverted UnmarkAllItemsL(); - if ( aCustomMessageId == TUid::Uid(KMailSettingsReturnFromPluginSettings) ) { // Better to refresh launcher grid view because mailbox branding might be changed. iAppUi.LauncherGrid().SetRefreshNeeded(); } - // Check the validity of focused message, it may be deleted or // reply/forward, read/unread status might have changed in editor or viewer UpdateItemAtIndexL( HighlightedIndex() ); @@ -1240,14 +1541,19 @@ // void CFSEmailUiMailListVisualiser::ChildDoDeactivate() { - FUNC_LOG; + FUNC_LOG; + if (iMailListModelUpdater) + { + iMailListModelUpdater->Cancel(); + } if ( !iAppUi.AppUiExitOngoing() ) - { - TRAP_IGNORE( { + { + TRAP_IGNORE( { + iMailList->HideListL(); iMailList->SetFocusedL( EFalse ); } ); - iMailTreeListVisualizer->NotifyControlVisibilityChange( EFalse ); - } + iMailTreeListVisualizer->NotifyControlVisibilityChange( EFalse ); + } iThisViewActive = EFalse; } @@ -1761,22 +2067,13 @@ CFSEmailUiMailListModelItem* item( NULL ); SetMailListItemsExtendedL(); - TBool allowRefresh(EFalse); TInt count(0); count = iModel->Count(); for ( TInt i=0; i < count; i++ ) { item = static_cast(iModel->Item(i)); - if ( i == 0 || i == count - 1 ) - {//first item - show scrollbar - //last item - update scrollbar - allowRefresh = ETrue; - } - else - {//rest of the messages - insert without updating - allowRefresh = EFalse; - } + const TBool allowRefresh(i == 0 || (i == count - 1)); // Append separator item text into the list if ( item && item->ModelItemType() == ETypeSeparator ) @@ -1791,6 +2088,39 @@ } } +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::RefreshListItemsL(TFsTreeItemId& aLatestNodeId, const TInt aStartIndex, const TInt aEndIndex) + { + FUNC_LOG; + // IMPLEMENTATION OF FILLING UP THE LIST + iMailList->BeginUpdate(); + CFSEmailUiMailListModelItem* item( NULL ); + if (aLatestNodeId == KFsTreeRootID && !aStartIndex) + { + iMailList->RemoveAllL(); + iTreeItemArray.Reset(); + SetMailListItemsExtendedL(); + } + for ( TInt i = aStartIndex; i < aEndIndex; i++ ) + { + item = static_cast(iModel->Item(i)); + // Append separator item text into the list + if ( item && item->ModelItemType() == ETypeSeparator ) + { + aLatestNodeId = InsertNodeItemL( i, KErrNotFound, EFalse ); + } + // Append mail item into the list + else if ( item && item->ModelItemType() == ETypeMailItem ) + { + InsertListItemL( i, aLatestNodeId, KErrNotFound, EFalse ); + } + } + iMailList->EndUpdateL(); + } void CFSEmailUiMailListVisualiser::SetMailListItemsExtendedL() { @@ -3907,10 +4237,10 @@ // MSK label can now be updated when shift key has been handled SetMskL(); // On KeyUp of EStdKeyYes usually Call application is called - prevent it - if ( iConsumeStdKeyYes_KeyUp && (aEvent.Code() == EEventKeyUp )) + if ( iConsumeStdKeyYes_KeyUp && (aEvent.Code() == EEventKeyUp )) { iConsumeStdKeyYes_KeyUp = EFalse; // in case call button was consumed elsewhere first key up enables calling Call application - if ( EStdKeyYes == scanCode) + if ( EStdKeyYes == scanCode) { result = ETrue; // consume not to switch to Call application when call to contact was processed return result; @@ -5673,6 +6003,9 @@ { CFSEmailUiMailListModelItem* item = static_cast( iModel->Item( i ) ); + // when the item is a separator check whether its MessagePtr is valid (actually it's a reference) + if( &(item->MessagePtr()) != NULL) + { if ( aMessageId == item->MessagePtr().GetMessageId() ) { TModelItemType itemType = item->ModelItemType(); @@ -5692,6 +6025,7 @@ } } } + } return idx; } @@ -5844,8 +6178,8 @@ if ( !iMailFolder || ( iMailFolder && iMailFolder->GetFolderId() != aSelectedFolderId ) ) { - delete iMailFolder; - iMailFolder = NULL; + iMailListModelUpdater->Cancel(); + SafeDelete(iMailFolder); iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( iAppUi.GetActiveMailboxId(), aSelectedFolderId ); if ( !iMailFolder ) @@ -5889,8 +6223,8 @@ //Set touchmanager back to active DisableMailList(EFalse); iAppUi.SetActiveMailboxL( aSelectedMailboxId ); - delete iMailFolder; - iMailFolder = NULL; + iMailListModelUpdater->Cancel(); + SafeDelete(iMailFolder); iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( iAppUi.GetActiveMailboxId(), iAppUi.GetActiveBoxInboxId() ); // Set initial sort criteria when folder has changed @@ -6305,13 +6639,21 @@ void CFSEmailUiMailListVisualiser::ReplyL( CFSMailMessage* aMsgPtr ) { FUNC_LOG; - DoReplyForwardL( KEditorCmdReply, aMsgPtr ); + // Replying not possible from drafts folder + if ( iMailFolder && iMailFolder->GetFolderType() != EFSDraftsFolder ) + { + DoReplyForwardL( KEditorCmdReply, aMsgPtr ); + } } void CFSEmailUiMailListVisualiser::ReplyAllL( CFSMailMessage* aMsgPtr ) { FUNC_LOG; - DoReplyForwardL( KEditorCmdReplyAll, aMsgPtr ); + // Replying all not possible from drafts folder + if ( iMailFolder && iMailFolder->GetFolderType() != EFSDraftsFolder ) + { + DoReplyForwardL( KEditorCmdReplyAll, aMsgPtr ); + } } void CFSEmailUiMailListVisualiser::ForwardL( CFSMailMessage* aMsgPtr ) @@ -6393,8 +6735,8 @@ if ( entryId == currentFolderId ) { // Current folder deleted, try to revert back to standard folder inbox. - delete iMailFolder; - iMailFolder = NULL; + iMailListModelUpdater->Cancel(); + SafeDelete(iMailFolder); TFSMailMsgId inboxId = iAppUi.GetActiveMailbox()->GetStandardFolderId( EFSInbox ); if ( !inboxId.IsNullId() ) { @@ -6433,9 +6775,11 @@ if ( parentFolderId && ( *parentFolderId == currentFolderId ) ) { // Refresh mailfolder to get correct actual data - delete iMailFolder; - iMailFolder = NULL; + /* + iMailListModelUpdater->Cancel(); + SafeDelete(iMailFolder); iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( aMailboxId, currentFolderId ); + */ RemoveMsgItemsFromListIfFoundL( *removedEntries ); } } @@ -6447,8 +6791,8 @@ if ( FolderId().IsNullId() ) { // Refresh mailfolder to standard folder inbox in case of zero id - delete iMailFolder; - iMailFolder = NULL; + iMailListModelUpdater->Cancel(); + SafeDelete(iMailFolder); TFSMailMsgId inboxId = iAppUi.GetActiveMailbox()->GetStandardFolderId( EFSInbox ); if ( !inboxId.IsNullId() ) { @@ -6493,9 +6837,11 @@ else if ( fromFolderId && ( currentFolderId == *fromFolderId ) ) { // Refresh mailfolder to get correct actual data - delete iMailFolder; - iMailFolder = NULL; + /* + iMailListModelUpdater->Cancel(); + SafeDelete(iMailFolder); iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( aMailboxId, currentFolderId ); + */ RemoveMsgItemsFromListIfFoundL( *entries ); } else @@ -6512,14 +6858,16 @@ if ( *parentFolderId == currentFolderId ) { // Refresh mailfolder to get correct actual data - delete iMailFolder; - iMailFolder = NULL; + /* + iMailListModelUpdater->Cancel(); + SafeDelete(iMailFolder); iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( aMailboxId, currentFolderId ); + */ for ( TInt i=0 ; iCount() ; i++ ) { TFSMailMsgId msgId = (*entries)[i]; TInt idx = ItemIndexFromMessageId( msgId ); - if ( idx >= 0 ) + if ( idx != KErrNotFound ) { UpdateItemAtIndexL( idx ); } @@ -7268,6 +7616,7 @@ { FUNC_LOG; CActiveScheduler::Add( this ); + iDayCount = DayCount(); } // ----------------------------------------------------------------------------- @@ -7315,20 +7664,58 @@ void CDateChangeTimer::RunL() { FUNC_LOG; + + if (iStatus.Int() != KErrNone) + { + INFO_1("### CDateChangeTimer::RunL (err=%d) ###", iStatus.Int()); + } + + + TBool dayChanged = EFalse; + TInt dayCount = DayCount(); + if (dayCount != iDayCount) + { + + iDayCount = dayCount; + dayChanged = ETrue; + } + + if ( KErrCancel == iStatus.Int() ) { ; - } - // System time changed? - else if ( KErrAbort == iStatus.Int() ) + } + else if ( KErrAbort == iStatus.Int() ) // System time changed { + if (dayChanged) + { + TRAP_IGNORE( iMailListVisualiser.NotifyDateChangedL() ); + } Start(); } - // Interval is over - else + else // interval is over { // Update mail list and reissue the request for timer event TRAP_IGNORE( iMailListVisualiser.NotifyDateChangedL() ); Start(); } + } + + +TInt CDateChangeTimer::DayCount() + { + TTime now; + now.HomeTime(); + TTime minTime = Time::MinTTime(); + TTimeIntervalDays days = now.DaysFrom(minTime); + return days.Int(); + } + + + + + + + + diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/FreestyleEmailUiViewBase.cpp --- a/emailuis/emailui/src/FreestyleEmailUiViewBase.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiViewBase.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -103,9 +103,8 @@ UpdateToolbarL(); // Make sure Alfred display is of correct size (there is some problems with toolbar) - TRect metricsRect; - AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, metricsRect); - CAlfEnv::Static()->PrimaryDisplay().ForceSetVisibleArea(metricsRect); + iAppUi.AlfEnv().PrimaryDisplay().ForceSetVisibleArea(iAppUi.ClientRect()); + // Finally call child classes activation method TRAPD( error, ChildDoActivateL(aPrevViewId, aCustomMessageId, aCustomMessage) ); diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/FreestyleMessageHeaderHTML.cpp --- a/emailuis/emailui/src/FreestyleMessageHeaderHTML.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/src/FreestyleMessageHeaderHTML.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -2,9 +2,9 @@ * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available -* under the terms of the License "Symbian Foundation License v1.0" +* under the terms of "Eclipse Public License v1.0" * which accompanies this distribution, and is available -* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* at the URL "http://www.eclipse.org/legal/epl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/OverlayControl.cpp --- a/emailuis/emailui/src/OverlayControl.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/src/OverlayControl.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -2,9 +2,9 @@ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available -* under the terms of the License "Symbian Foundation License v1.0" +* under the terms of "Eclipse Public License v1.0" * which accompanies this distribution, and is available -* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* at the URL "http://www.eclipse.org/legal/epl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/ncscomposeview.cpp --- a/emailuis/emailui/src/ncscomposeview.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/src/ncscomposeview.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -515,16 +515,7 @@ SetToolbarItemDimmed( EFsEmailUiTbCmdExpandInsert, dimAllOptions ); SetToolbarItemDimmed( EFsEmailUiTbCmdSend, iContainer->AreAddressFieldsEmpty() ); - if ( (iContainer->IsFocusBcc() || - iContainer->IsFocusCc() || - iContainer->IsFocusTo() ) && !dimAllOptions ) - { - SetToolbarItemDimmed( EFsEmailUiTbCmdAddRecipient, EFalse ); - } - else - { - SetToolbarItemDimmed( EFsEmailUiTbCmdAddRecipient, ETrue ); - } + SetToolbarItemDimmed( EFsEmailUiTbCmdAddRecipient, dimAllOptions ); } } diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/ncscomposeviewcontainer.cpp --- a/emailuis/emailui/src/ncscomposeviewcontainer.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/src/ncscomposeviewcontainer.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -211,7 +211,20 @@ { iFocused = iHeader; } - iFocused->SetFocus( ETrue, aDrawNow ); + if ( iFocused == iHeader ) + { + iHeader->ShowCursor( IsFocused() ); + iFocused->SetFocus( ETrue, aDrawNow ); + } + else if ( iFocused == iMessageField ) + { + iFocused->SetFocus( IsFocused(), aDrawNow ); + } + else + { + iFocused->SetFocus( ETrue, aDrawNow ); + } + iView.HandleContainerChangeRequiringToolbarRefresh(); if ( aDrawNow ) @@ -311,10 +324,24 @@ { if ( iFocused == iHeader ) { + // fix for ESLX-7Y4C2V, dissapearing subject + HBufC* heapBuffer = HBufC::NewL(iHeader->GetSubjectFieldLength()); + TPtr ptr(heapBuffer->Des()); + ptr.Copy(*GetSubjectLC()); + iFocused = iMessageField; iHeader->SetFocus( EFalse, EDrawNow ); iMessageField->SetFocus( ETrue, EDrawNow ); + + if ( iHeader->GetSubjectFieldLength() != heapBuffer->Length() ) + { + iHeader->SetSubjectL( const_cast(*heapBuffer)); + } + + iHeader->SetFocus( ETrue, EDrawNow ); + iHeader->SetFocus( EFalse, EDrawNow ); iView.HandleContainerChangeRequiringToolbarRefresh(); + CleanupStack::PopAndDestroy(); //from GetSubjectLC() } else if ( iFocused == iReadOnlyQuoteField ) { @@ -1519,7 +1546,7 @@ void CNcsComposeViewContainer::AppendToFieldAddressesL( RPointerArray& aAddresses ) { FUNC_LOG; - + FixSemicolonL(); iHeader->AppendToFieldAddressesL(aAddresses); } @@ -1532,7 +1559,7 @@ void CNcsComposeViewContainer::AppendCcFieldAddressesL( RPointerArray& aAddress ) { FUNC_LOG; - + FixSemicolonL(); iHeader->AppendCcFieldAddressesL( aAddress ); } @@ -1545,7 +1572,7 @@ void CNcsComposeViewContainer::AppendBccFieldAddressesL( RPointerArray& aAddress ) { FUNC_LOG; - + FixSemicolonL(); iHeader->AppendBccFieldAddressesL( aAddress ); } diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/ncsheadercontainer.cpp --- a/emailuis/emailui/src/ncsheadercontainer.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/src/ncsheadercontainer.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -199,7 +199,14 @@ { FUNC_LOG; - CCoeControl* focused = FindFocused(); + CCoeControl* focused = iFocused; + + if ( !focused ) + { + focused = FindFocused(); + iFocused = focused; + } + if ( !IsFocused() ) { if ( focused ) @@ -213,7 +220,7 @@ // Remove MSK label when header loses focus TRAP_IGNORE( SetMskL() ); } - else if ( IsFocused() && !focused && !iRALInProgress ) + else if ( IsFocused() && !focused ) { // We're gaining focus from the message body // Set the focus to the last control in the control array @@ -224,6 +231,20 @@ } } +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::ShowCursor +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::ShowCursor( TBool aShow ) + { + CCoeControl* focused = FindFocused(); + if ( focused ) + { + iFocused = focused; + } + iFocused->SetFocus( aShow, EDrawNow ); + } + // ----------------------------------------------------------------------------- // CNcsHeaderContainer::Draw() const // Draws the display @@ -503,8 +524,9 @@ ( aKeyEvent.iCode == EKeyEnter || aKeyEvent.iScanCode == EStdKeyEnter) ) { - ret = FindFocused()->OfferKeyEventL( aKeyEvent, aType ); - return EKeyWasConsumed; + FindFocused()->OfferKeyEventL( aKeyEvent, aType ); + ret = EKeyWasConsumed; + doScroll = ETrue; } } } @@ -1309,13 +1331,9 @@ addressField = static_cast( focused ); HBufC* lookupText = addressField->GetLookupTextLC(); CPbkxRemoteContactLookupServiceUiContext::TResult::TExitReason ex; - // set focus to false for header - the focus should be on popup - focused->SetFocus( EFalse, ENoDrawNow ); CNcsEmailAddressObject* address = ExecuteRemoteSearchL( ex, *lookupText ); iRALInProgress = EFalse; - // set focus back to on - focused->SetFocus( ETrue, ENoDrawNow ); if ( address ) { CleanupStack::PushL( address ); diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/uicomponents/inc/fstreelist.h --- a/emailuis/uicomponents/inc/fstreelist.h Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/uicomponents/inc/fstreelist.h Tue Jan 26 11:45:42 2010 +0200 @@ -53,7 +53,26 @@ typedef RPointerArray RFsTreeListObservers; /** - * CFsTreeList is a component for creating and displaying hierarchical list + * Batch updates for the tree. + */ +class MFsTreeBatchProcessing + { +public: + /** + * Begin batch update. During batch update changes to the world + * will not be updated on screen until the EndUpdateL is called. + */ + virtual void BeginUpdate() = 0; + + /** + * End batch update. All changes done between BeginUpdate and EndUpdateL + * will be shown on screen. + */ + virtual void EndUpdateL() = 0; + }; + +/** + * CFsTreeList is a component for creating and displaying hierarchical list * using tree data structure. * * @code @@ -62,8 +81,20 @@ * * @lib */ -class CFsTreeList : public CBase, MFsTreeVisualizerObserver +class CFsTreeList : public CBase, MFsTreeVisualizerObserver, MFsTreeBatchProcessing { +public: // from MFsTreeBatchProcessing + + /** + * @see MFsTreeBatchProcessing::BeginUpdate + */ + void BeginUpdate(); + + /** + * @see MFsTreeBatchProcessing::EndUpdateL + */ + void EndUpdateL(); + public: // Construction diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/uicomponents/inc/fstreevisualizerbase.h --- a/emailuis/uicomponents/inc/fstreevisualizerbase.h Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/uicomponents/inc/fstreevisualizerbase.h Tue Jan 26 11:45:42 2010 +0200 @@ -73,6 +73,13 @@ * Contains the visual structure of the list. * */ + +enum TUpdatedByPhysic{ + ENotUpdatedByPhisic = 0, + EUpdatedByPhisic, + EUpdatedByPhisicEnd + }; + NONSHARABLE_CLASS( TWorld ) { @@ -333,7 +340,7 @@ /** * This method is called when the viewport changes. */ - virtual void ViewPortUpdatedL( TViewPort& aViewPort ) = 0; + virtual void ViewPortUpdatedL( TViewPort& aViewPort, TUpdatedByPhysic aUpdateByPhysic = ENotUpdatedByPhisic ) = 0; }; @@ -354,7 +361,7 @@ * Center viewport around position aPosition. If aInformUpdate is set to ETrue, observer * will be signalled. */ - void SetCenterPositionL( const TPoint& aPosition, TBool aInformUpdate = ETrue ); + void SetCenterPositionL( const TPoint& aPosition, TBool aInformUpdate = ETrue, TUpdatedByPhysic aUpdateByPhysic = ENotUpdatedByPhisic ); /** * Returns viewport position (i.e. topleft corner). @@ -382,6 +389,11 @@ void GetVisibleItemsL( RArray& aItemsToBeRemoved, RArray& aItemsToBeAdded, TInt& aOffset, TBool& aFullUpdate ); /** + * Get items visible in viewport's area. + */ + void GetVisibleItemsL(RArray& aVisible, TInt& aOffset); + + /** * Returns ETrue if the world is higher than viewport. */ TBool IsScrollBarNeeded() const; @@ -455,7 +467,9 @@ /** * Called when viewport is updated. */ - void UpdatedL(); + void UpdatedL(TUpdatedByPhysic aUpdateByPhysic = ENotUpdatedByPhisic); + + private: // from TWorld::MObserver @@ -1905,7 +1919,7 @@ private: // from TViewPort::MObserver - virtual void ViewPortUpdatedL( TViewPort& aViewPort ); + virtual void ViewPortUpdatedL( TViewPort& aViewPort, TUpdatedByPhysic aUpdateByPhysic = ENotUpdatedByPhisic); // TREE OPTIMIZATIONS diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/uicomponents/src/fstreelist.cpp --- a/emailuis/uicomponents/src/fstreelist.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/uicomponents/src/fstreelist.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -111,6 +111,16 @@ return iTreeControl; } +void CFsTreeList::BeginUpdate() + { + iTreeVisualizer->SetAutoRefreshAtInsert( EFalse ); + } + +void CFsTreeList::EndUpdateL() + { + iTreeVisualizer->SetAutoRefreshAtInsert( ETrue ); + } + // --------------------------------------------------------------------------- // Inserts new item as a child of parent given by Id with the given position. // --------------------------------------------------------------------------- diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/uicomponents/src/fstreeplainonelineitemvisualizer.cpp --- a/emailuis/uicomponents/src/fstreeplainonelineitemvisualizer.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/uicomponents/src/fstreeplainonelineitemvisualizer.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -629,12 +629,11 @@ FUNC_LOG; TInt marqueeSize(0), textWidth(0); - if ( aMarqueeType == EFsTextMarqueeNone ) + if ( aMarqueeType == EFsTextMarqueeNone || !iTextVisual ) { return; } - iTextVisual->SetWrapping(CAlfTextVisual::ELineWrapManual); textWidth = iTextVisual->SubstringExtents(0, iTextVisual->Text().Length()).Width(); diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/uicomponents/src/fstreevisualizerbase.cpp --- a/emailuis/uicomponents/src/fstreevisualizerbase.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/uicomponents/src/fstreevisualizerbase.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -362,38 +362,22 @@ } else if (aY > 0) { - TInt top(0); - TInt bottom(iItems.Count() - 1); - while (top <= bottom) + TInt min(0); + TInt max(iItems.Count() - 1); + while (min <= max) { - TInt middle(top + (bottom - top) / 2); - TInt topCoord(iItems[middle].Top()); - TInt bottomCoord(iItems[middle].Bottom()); - if (aY < topCoord) + const TInt middle(min + (max - min) / 2); + if (aY < iItems[middle].Top()) { - if (bottom == middle) - { - bottom--; - } - else - { - bottom = middle; - } + max = middle - 1; } - else if (aY > bottomCoord) + else if (aY > iItems[middle].Bottom()) { - if (top == middle) - { - top++; - } - else - { - top = middle; - } + min = middle + 1; } else { - aOffset = aY - topCoord; + aOffset = aY - iItems[middle].Top(); aHeight += aOffset; i = middle; break; @@ -542,14 +526,14 @@ // TViewPort::SetCenterPositionL // --------------------------------------------------------------------------- void TViewPort::SetCenterPositionL(const TPoint& aPosition, - TBool aInformUpdate) + TBool aInformUpdate, TUpdatedByPhysic aUpdateByPhysic) { iPosition = TPoint(aPosition.iX - iSize.iWidth / 2, aPosition.iY - iSize.iHeight / 2); // Do validation! if (aInformUpdate) { - UpdatedL(); + UpdatedL(aUpdateByPhysic); } } @@ -607,6 +591,14 @@ } // --------------------------------------------------------------------------- +// TViewPort::GetVisibleItemsL +// --------------------------------------------------------------------------- +void TViewPort::GetVisibleItemsL(RArray& aVisible, TInt& aOffset) + { + iWorld.GetItemsL(aVisible, iPosition.iY, iSize.iHeight, aOffset); + } + +// --------------------------------------------------------------------------- // TViewPort::IsScrollBarNeeded // --------------------------------------------------------------------------- TBool TViewPort::IsScrollBarNeeded() const @@ -617,9 +609,9 @@ // --------------------------------------------------------------------------- // TViewPort::UpdatedL // --------------------------------------------------------------------------- -void TViewPort::UpdatedL() - { - iObserver.ViewPortUpdatedL(*this); +void TViewPort::UpdatedL(TUpdatedByPhysic aUpdateByPhysic) + { + iObserver.ViewPortUpdatedL(*this, aUpdateByPhysic); } // --------------------------------------------------------------------------- @@ -1695,8 +1687,7 @@ if ( visualizer ) { - TBool focused = IsFocusShown(); - visualizer->UpdateL( iTreeData->ItemData( iFocusedItem ), focused, + visualizer->UpdateL( iTreeData->ItemData( iFocusedItem ), IsFocusShown(), iTreeData->Level( iFocusedItem ), iMarkIcon, iMenuIcon, 0 ); } @@ -1792,7 +1783,7 @@ const TBool aSlideIn) { FUNC_LOG; - UpdateViewPortL(); + iVisualizationState = EFsTreeVisible; if (iTreeData->Count() == 0) { iRootVisualizer->ShowL(*iRootLayout); @@ -1800,29 +1791,28 @@ } else { - TBool showFocus = IsFocusShown(); + const TBool showFocus = IsFocusShown(); for (TUint i = 0; i < iVisibleItems.Count(); ++i) { TFsTreeItemId itemId(iVisibleItems[i]); MFsTreeItemVisualizer* visualizer = iTreeData->ItemVisualizer( itemId); - TBool itemFocused( EFalse ); - if( showFocus ) - { - itemFocused = IsItemFocused(itemId); - } - visualizer->UpdateL(iTreeData->ItemData(itemId), itemFocused, - iTreeData->Level(itemId), iMarkIcon, iMenuIcon, - 0); + TBool itemFocused( showFocus && IsItemFocused(itemId) ); + if ( visualizer ) + { + visualizer->UpdateL(iTreeData->ItemData(itemId), itemFocused, + iTreeData->Level(itemId), iMarkIcon, iMenuIcon, + 0); + } } } + UpdateViewPortL(); TInt fadeInTime(KZero), slideInTime(KZero); CFsSlideEffect::TSlideEffectDirection slideInDir( CFsSlideEffect::ESlideNone); - iVisualizationState = EFsTreeVisible; if (aFadeIn) { @@ -2517,7 +2507,11 @@ ApplyListSpecificValuesToItem(itemviz); } } - iWorld.BeginUpdate(); + const TBool isUpdating(iWorld.IsUpdating()); + if (!isUpdating) + { + iWorld.BeginUpdate(); + } iWorld.RemoveAllL(); treeIter = iTreeData->Iterator(KFsTreeRootID, KFsTreeRootID, KFsTreeIteratorSkipCollapsedFlag); @@ -2532,7 +2526,10 @@ } iViewPort.SetPositionL(TPoint(), EFalse); iViewPort.ClearCache(); - iWorld.EndUpdateL(); + if (!isUpdating) + { + iWorld.EndUpdateL(); + } } // --------------------------------------------------------------------------- @@ -2788,10 +2785,13 @@ break; case EFsTreeRemovedAll: { - iRootVisualizer->ShowL(*iRootLayout); - iRootVisualizer->UpdateL(*iRootData, EFalse, 0, iMarkIcon, - iMenuIcon); - //iListLayout->RemoveAndDestroyAllD(); + if (!iWorld.IsUpdating()) + { + iRootVisualizer->ShowL(*iRootLayout); + iRootVisualizer->UpdateL(*iRootData, EFalse, 0, iMarkIcon, + iMenuIcon); + } + iVisibleItems.Reset(); iWorld.RemoveAllL(); iFocusedItem = KFsTreeNoneID; } @@ -3514,38 +3514,42 @@ { FUNC_LOG; TInt listItemsHeight = 0; - MFsTreeItemVisualizer* vis = 0; + MFsTreeItemVisualizer* visualizer = 0; TFsTreeItemId itemId; TInt itemCount = iVisibleItems.Count(); for (TInt index = 0; index < itemCount; ++index) { itemId = iVisibleItems[index]; - vis = iTreeData->ItemVisualizer(itemId); - - if (itemId == iFocusedItem) + visualizer = iTreeData->ItemVisualizer(itemId); + + + if (visualizer) { - if (vis->IsExtendable()) + if (itemId == iFocusedItem) { - listItemsHeight += vis->ExtendedSize().iHeight; + if (visualizer->IsExtendable()) + { + listItemsHeight += visualizer->ExtendedSize().iHeight; + } + else + { + listItemsHeight += visualizer->Size().iHeight; + } + } + else if (itemId == aPrevious && iFocusedItem != aPrevious) + { + listItemsHeight += visualizer->Size().iHeight; + } + else if (visualizer->IsExtended() && visualizer->IsExtendable()) + { + listItemsHeight += visualizer->ExtendedSize().iHeight; } else { - listItemsHeight += vis->Size().iHeight; + listItemsHeight += visualizer->Size().iHeight; } } - else if (itemId == aPrevious && iFocusedItem != aPrevious) - { - listItemsHeight += vis->Size().iHeight; - } - else if (vis->IsExtended() && vis->IsExtendable()) - { - listItemsHeight += vis->ExtendedSize().iHeight; - } - else - { - listItemsHeight += vis->Size().iHeight; - } } return listItemsHeight; @@ -3702,10 +3706,13 @@ for (TUint i = 0; i < iVisibleItems.Count(); ++i) { TFsTreeItemId itemId(iVisibleItems[i]); - MFsTreeItemVisualizer* viz = iTreeData->ItemVisualizer(itemId); - viz->UpdateL(iTreeData->ItemData(itemId), - IsItemFocused(itemId) && IsFocusShown(), + MFsTreeItemVisualizer* visualizer = iTreeData->ItemVisualizer(itemId); + if (visualizer) + { + visualizer->UpdateL(iTreeData->ItemData(itemId), + IsItemFocused(itemId) && IsFocusShown(), iTreeData->Level(itemId), iMarkIcon, iMenuIcon, 0, EFalse); + } } UpdateSelectorVisualL(); } @@ -4826,9 +4833,16 @@ // ViewPort updated // --------------------------------------------------------------------------- // -void CFsTreeVisualizerBase::ViewPortUpdatedL(TViewPort& aViewPort) +void CFsTreeVisualizerBase::ViewPortUpdatedL(TViewPort& aViewPort, TUpdatedByPhysic aUpdateByPhysic) { FUNC_LOG; + + // Only upadte view if the list is visible + if (iVisualizationState != EFsTreeVisible) + { + return; + } + RArray visibleItems; RArray removableItems; TInt scrollOffset; @@ -4841,6 +4855,30 @@ rm = CAlfStatic::Env().RefreshMode(); CAlfStatic::Env().SetRefreshMode(EAlfRefreshModeManual); iListLayout->SetFlag(EAlfVisualFlagFreezeLayout); + + if(aUpdateByPhysic == EUpdatedByPhisicEnd) + { + RArray myVisibleItems; + TInt myOffset; + CleanupClosePushL(myVisibleItems); + aViewPort.GetVisibleItemsL(myVisibleItems, myOffset); + + for (TInt i = 0; i < myVisibleItems.Count(); i++) + { + const TFsTreeItemId itemId(myVisibleItems[i]); + if (itemId != KFsTreeNoneID) + { + MFsTreeItemVisualizer* visualizer = iTreeData->ItemVisualizer( + itemId); + visualizer->UpdateL(iTreeData->ItemData(itemId), + IsItemFocused(itemId) && IsFocusShown(), + iTreeData->Level(itemId), iMarkIcon, iMenuIcon, + 0); + } + } + CleanupStack::PopAndDestroy(); + } + // clear list TInt removed(0); if (fullUpdate) @@ -4856,14 +4894,21 @@ { for (TInt i = 0; i < removableItems.Count(); i++) { - CAlfVisual* visual( - &iTreeData->ItemVisualizer(removableItems[i])->Layout()); - if (iListLayout->FindVisual(visual) != KErrNotFound) + MFsTreeItemVisualizer* itemVisualizer(iTreeData->ItemVisualizer(removableItems[i])); + if (itemVisualizer) { - removed++; + CAlfVisual* visual(&itemVisualizer->Layout()); + if (iListLayout->FindVisual(visual) != KErrNotFound) + { + removed++; + } + itemVisualizer->Hide(); + const TInt index(iVisibleItems.Find(removableItems[i])); + if (index != KErrNotFound) + { + iVisibleItems.Remove(index); + } } - iTreeData->ItemVisualizer(removableItems[i])->Hide(); - iVisibleItems.Remove(iVisibleItems.Find(removableItems[i])); } } @@ -4885,10 +4930,15 @@ CAlfLayout& visualizerLayout(visualizer->Layout()); visualizerLayout.SetSize(tpItemSize); visualizerLayout.PropertySetIntegerL(KPropertyItemId(), itemId); - visualizer->UpdateL(iTreeData->ItemData(itemId), + + if(aUpdateByPhysic != EUpdatedByPhisic) + { + visualizer->UpdateL(iTreeData->ItemData(itemId), IsItemFocused(itemId) && IsFocusShown(), iTreeData->Level(itemId), iMarkIcon, iMenuIcon, 0); + } + visualizerLayout.Brushes()->AppendL(iBorderBrush, EAlfDoesNotHaveOwnership); CAlfBrush* bgBrush(NULL); @@ -4978,7 +5028,7 @@ { FUNC_LOG; TInt error(KErrNone); - TRAP( error, iViewPort.SetCenterPositionL(aNewPosition) ); + TRAP( error, iViewPort.SetCenterPositionL(aNewPosition, ETrue, EUpdatedByPhisic) ); ERROR_1( error, "iViewPort.SetCenterPositionL failed with error: %d", error ); } @@ -4989,6 +5039,9 @@ void CFsTreeVisualizerBase::PhysicEmulationEnded() { FUNC_LOG; + + TRAP_IGNORE( iViewPort.SetCenterPositionL(iViewPort.CenterPosition(), ETrue, EUpdatedByPhisicEnd)); + iFlags.Clear(EPhysicsOn); if (iFlags.IsSet(EUpdatePhysicsAfterSimulationFinished)) { diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssosplugin/inc/ipsplgconnectandrefreshfolderlist.h --- a/ipsservices/ipssosplugin/inc/ipsplgconnectandrefreshfolderlist.h Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssosplugin/inc/ipsplgconnectandrefreshfolderlist.h Tue Jan 26 11:45:42 2010 +0200 @@ -123,6 +123,8 @@ */ void ConstructL( CMsvEntrySelection& aMsvEntry ); + void DisplayLoginFailedDialogL(); + //data private: diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssosplugin/inc/ipsplgimap4connectop.h --- a/ipsservices/ipssosplugin/inc/ipsplgimap4connectop.h Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssosplugin/inc/ipsplgimap4connectop.h Tue Jan 26 11:45:42 2010 +0200 @@ -217,6 +217,8 @@ CIpsPlgEventHandler* iEventHandler; TBool iIsSyncStartedSignaled; + // set to true if connection is already exists + TBool iAlreadyConnected; }; #endif diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssosplugin/inc/ipsplgpop3connectop.h --- a/ipsservices/ipssosplugin/inc/ipsplgpop3connectop.h Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssosplugin/inc/ipsplgpop3connectop.h Tue Jan 26 11:45:42 2010 +0200 @@ -175,6 +175,8 @@ CMsvEntrySelection* iSelection; // not owned CIpsPlgEventHandler* iEventHandler; + // set to true if connection is already exists + TBool iAlreadyConnected; }; #endif diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssosplugin/src/ipsplgconnectandrefreshfolderlist.cpp --- a/ipsservices/ipssosplugin/src/ipsplgconnectandrefreshfolderlist.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssosplugin/src/ipsplgconnectandrefreshfolderlist.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -17,10 +17,13 @@ */ +#include + #include "emailtrace.h" #include "ipsplgheaders.h" #include +#include // For R_FS_MSERVER_* // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- @@ -170,38 +173,41 @@ { FUNC_LOG; MFSMailRequestObserver* observer = NULL; + int err = iStatus.Int(); - if( iStatus.Int() != KErrNone ) + if ( err != KErrNone ) { iState = ECompleted; - CompleteObserver(); + if( err == KErrImapBadLogon ) + { + DisplayLoginFailedDialogL(); + RunError(err); + } + else + { + CompleteObserver(); + } return; - } + } - switch(iState) + TBuf8<1> dummyParam; + switch( iState ) { case EStartConnect: delete iOperation; iOperation = NULL; - iOperation = CIpsPlgImap4ConnectOp::NewL( - iSession, - CActive::EPriorityStandard, - iStatus, - iService, - *iTimer, - iMailboxId, - *observer, - NULL, //FSRequestId - NULL, // Event handler - ETrue, // Plain connect - EFalse ); // No signalling needed ) + InvokeClientMtmAsyncFunctionL( + KIMAP4MTMConnect, + *iMsvEntry, + iService, + dummyParam ); iState = EConnecting; SetActive(); break; case EConnecting: { // We have successfully completed connecting - TBuf8<1> dummyParam; + delete iOperation; iOperation = NULL; InvokeClientMtmAsyncFunctionL( @@ -253,5 +259,33 @@ iState = ECompleted; } +// ---------------------------------------------------------------------------- +// CIpsPlgConnectAndRefreshFolderList::DisplayLoginFailedDialogL() +// ---------------------------------------------------------------------------- +// +void CIpsPlgConnectAndRefreshFolderList::DisplayLoginFailedDialogL() + { + // Get the TMsvEntry for the mailbox, which we use to get its name. + TMsvId serviceId; + TMsvEntry mailboxServiceEntry; + User::LeaveIfError( iSession.GetEntry( iMailboxId.Id(), serviceId, mailboxServiceEntry ) ); + + // Load/construct the strings for the dialog. + HBufC* headerText( NULL ); + headerText = StringLoader::LoadLC( R_FS_MSERVER_MAILBOX_NAME, mailboxServiceEntry.iDetails ); + HBufC* text( NULL ); + text = StringLoader::LoadLC( R_FS_MSERVER_TEXT_LOGIN_FAILED ); + + // Create and display the dialog. + CAknMessageQueryDialog *dlg = new (ELeave) CAknMessageQueryDialog; + dlg->PrepareLC( R_FS_MSERVER_DIALOG_MESSAGE_QUERY ); + dlg->SetHeaderTextL( headerText->Des() ); + dlg->SetMessageTextL( text->Des() ); + dlg->RunLD(); + + CleanupStack::PopAndDestroy( text ); + CleanupStack::PopAndDestroy( headerText ); + } + // End of File diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssosplugin/src/ipsplgimap4connectop.cpp --- a/ipsservices/ipssosplugin/src/ipsplgimap4connectop.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssosplugin/src/ipsplgimap4connectop.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -88,7 +88,8 @@ aSignallingAllowed ), iDoPlainConnect( aDoPlainConnect ), iEventHandler( aEventHandler ), - iIsSyncStartedSignaled( EFalse ) + iIsSyncStartedSignaled( EFalse ), + iAlreadyConnected( EFalse ) { FUNC_LOG; iService = aService; @@ -125,10 +126,20 @@ User::Panic( KIpsPlgIpsConnPanic, KErrNotSupported ); } - iState = EStateStartConnect; - iStatus = KRequestPending; - SetActive(); - CompleteThis(); + if ( tentry.Connected() ) + { + iState = EStateCompleted; + iAlreadyConnected = ETrue; + SetActive(); + CompleteThis(); + } + else + { + iState = EStateStartConnect; + iStatus = KRequestPending; + SetActive(); + CompleteThis(); + } } // ---------------------------------------------------------------------------- @@ -521,6 +532,13 @@ // /*TInt CIpsPlgImap4ConnectOp::GetOperationErrorCodeL( ) { + if ( iAlreadyConnected ) + { + // Connected state was set in CIpsPlgPop3ConnectOp::ConstructL() + // so iOperation is null + return KErrNone; + } + if ( !iOperation ) { return KErrNotFound; diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssosplugin/src/ipsplgmsgmapper.cpp --- a/ipsservices/ipssosplugin/src/ipsplgmsgmapper.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssosplugin/src/ipsplgmsgmapper.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -122,7 +122,10 @@ fsMsg->SetFolderId( TFSMailMsgId( iPlugin.PluginId(), aEntry.Entry().Parent() ) ); - + // ERLN-7YUEX3 + fsMsg->SetMailBoxId(TFSMailMsgId( iPlugin.PluginId(), aEntry.Entry().iServiceId )); + // End ERLN-7YUEX3 + CMsvStore* store( NULL ); if ( aEntry.HasStoreL() ) diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssosplugin/src/ipsplgonlineoperation.cpp --- a/ipsservices/ipssosplugin/src/ipsplgonlineoperation.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssosplugin/src/ipsplgonlineoperation.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -237,7 +237,7 @@ // Initialize the progress data // it would be better to get fs progress from inherited class // by calling FSProgressL method?? - if ( prog.iError == KErrCancel ) + if ( prog.iError == KErrCancel || prog.iError == KErrImapBadLogon ) { prog.iProgressStatus = TFSProgress::EFSStatus_RequestCancelled; } diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssosplugin/src/ipsplgpop3connectop.cpp --- a/ipsservices/ipssosplugin/src/ipsplgpop3connectop.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssosplugin/src/ipsplgpop3connectop.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -285,7 +285,8 @@ iPopulateLimit( KIpsPlgPop3PopulateLimitInitValue ), iForcePopulate( aForcePopulate ), iSelection( NULL ), - iEventHandler( aEventHandler ) + iEventHandler( aEventHandler ), + iAlreadyConnected( EFalse ) { iService = aServiceId; } @@ -339,6 +340,7 @@ if ( tentry.Connected() ) { iState = EConnected; + iAlreadyConnected = ETrue; SetActive(); CompleteThis(); } @@ -443,6 +445,14 @@ TInt CIpsPlgPop3ConnectOp::GetOperationErrorCodeL( ) { FUNC_LOG; + + if ( iAlreadyConnected ) + { + // Connected state was set in CIpsPlgPop3ConnectOp::ConstructL() + // so iOperation is null + return KErrNone; + } + if ( !iOperation ) { return KErrNotFound; diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/src/ipssetuidialog.cpp --- a/ipsservices/ipssossettings/src/ipssetuidialog.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/src/ipssetuidialog.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -29,6 +29,8 @@ #include #include +#include + #include // @@ -894,7 +896,14 @@ CleanupStack::PushL(op); wait->StartAndShowWaitDialogL(); + TInt status = wait->iStatus.Int(); CleanupStack::PopAndDestroy(3, mySelection); // op, wait, myselection + + // Don't open the folder subscription list if we couldn't log on. + if ( status == KErrImapBadLogon ) + { + return EIpsSetUiPageEventResultCancel; + } } iDialog.SetIgnoreOneBackKey(EFalse); // // diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/data/IpsSosTestApp.rss --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/data/IpsSosTestApp.rss Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/data/IpsSosTestApp.rss Tue Jan 26 11:45:42 2010 +0200 @@ -1,3 +1,19 @@ +/* +* Copyright (c) 2009 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: +* +*/ /* * ============================================================================ * Name : ipssostestapp.rss diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/data/IpsSosTestApp_reg.rss --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/data/IpsSosTestApp_reg.rss Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/data/IpsSosTestApp_reg.rss Tue Jan 26 11:45:42 2010 +0200 @@ -1,3 +1,19 @@ +/* +* Copyright (c) 2009 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: +* +*/ #include #include diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/group/bld.inf --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/group/bld.inf Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/group/bld.inf Tue Jan 26 11:45:42 2010 +0200 @@ -1,3 +1,19 @@ +/* +* Copyright (c) 2009 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: +* +*/ /* * ============================================================================ * Name : bld.inf diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/group/ipssostestapp.mmp --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/group/ipssostestapp.mmp Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/group/ipssostestapp.mmp Tue Jan 26 11:45:42 2010 +0200 @@ -1,3 +1,19 @@ +/* +* Copyright (c) 2009 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: +* +*/ /* * ============================================================================ * Name : ipssostestapp.mmp diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/TESTAPPApp.h --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/TESTAPPApp.h Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/TESTAPPApp.h Tue Jan 26 11:45:42 2010 +0200 @@ -1,3 +1,19 @@ +/* +* Copyright (c) 2009 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: +* +*/ /* * ============================================================================ * Name : CTestAppApp from TestAppApp.h diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/TESTAPPAppUi.h --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/TESTAPPAppUi.h Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/TESTAPPAppUi.h Tue Jan 26 11:45:42 2010 +0200 @@ -1,3 +1,19 @@ +/* +* Copyright (c) 2009 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: +* +*/ /* * ============================================================================ * Name : CTestAppAppUi from TestAppAppUi.h diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/TESTAPPContainer.h --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/TESTAPPContainer.h Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/TESTAPPContainer.h Tue Jan 26 11:45:42 2010 +0200 @@ -1,3 +1,19 @@ +/* +* Copyright (c) 2009 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: +* +*/ /* * ============================================================================ * Name : CTestAppContainer from TestAppContainer.h diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/TESTAPPDocument.h --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/TESTAPPDocument.h Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/TESTAPPDocument.h Tue Jan 26 11:45:42 2010 +0200 @@ -1,3 +1,19 @@ +/* +* Copyright (c) 2009 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: +* +*/ /* * ============================================================================ * Name : CTestAppDocument from TestAppDocument.h diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/ipssostestapp.loc --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/ipssostestapp.loc Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/ipssostestapp.loc Tue Jan 26 11:45:42 2010 +0200 @@ -1,3 +1,19 @@ +/* +* Copyright (c) 2009 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: +* +*/ /* * ============================================================================ * Name : ipssostestapp.loc diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/testapp.hrh --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/testapp.hrh Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/inc/testapp.hrh Tue Jan 26 11:45:42 2010 +0200 @@ -1,3 +1,19 @@ +/* +* Copyright (c) 2009 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: +* +*/ /* * ============================================================================ * Name : TestApp resource header file TestApp.hrh diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/install/ipssostestapp.pkg --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/install/ipssostestapp.pkg Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/install/ipssostestapp.pkg Tue Jan 26 11:45:42 2010 +0200 @@ -1,3 +1,18 @@ +; +; Copyright (c) 2009 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: +; ; ; Installation file for TestApp application ; diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/src/TESTAPPApp.cpp --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/src/TESTAPPApp.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/src/TESTAPPApp.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -1,3 +1,19 @@ +/* +* Copyright (c) 2009 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: +* +*/ /* * ============================================================================ * Name : CTestAppApp from TestAppApp.cpp diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/src/TESTAPPAppUi.cpp --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/src/TESTAPPAppUi.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/src/TESTAPPAppUi.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -1,3 +1,19 @@ +/* +* Copyright (c) 2009 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: +* +*/ /* * ============================================================================ * Name : CTestAppAppUi from TestAppAppUi.cpp diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/src/TESTAPPContainer.cpp --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/src/TESTAPPContainer.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/src/TESTAPPContainer.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -1,15 +1,21 @@ /* -* ============================================================================ -* Name : CTestAppContainer from TestAppContainer.h -* Part of : TestApp -* Created : 08.10.2004 by Jalemine -* Implementation notes: -* Initial content was generated by Series 60 AppWizard. -* Version : -* Copyright: Digia -* ============================================================================ +* Copyright (c) 2009 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: +* */ + // INCLUDE FILES #include "TestAppContainer.h" #include diff -r 5253a20d2a1e -r a4d6f1ea0416 ipsservices/ipssossettings/tsrc/IpsSosTestApp/src/TESTAPPDocument.cpp --- a/ipsservices/ipssossettings/tsrc/IpsSosTestApp/src/TESTAPPDocument.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/ipsservices/ipssossettings/tsrc/IpsSosTestApp/src/TESTAPPDocument.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -1,3 +1,19 @@ +/* +* Copyright (c) 2009 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: +* +*/ /* * ============================================================================ * Name : CTestAppDocument from TestAppDocument.h diff -r 5253a20d2a1e -r a4d6f1ea0416 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerdescriptionfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerdescriptionfield.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerdescriptionfield.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -2,9 +2,9 @@ * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available -* under the terms of the License "Symbian Foundation License v1.0" +* under the terms of "Eclipse Public License v1.0" * which accompanies this distribution, and is available -* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* at the URL "http://www.eclipse.org/legal/epl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution.