diff -r e7aa27f58ae1 -r e1b6206813b4 emailuis/widget/emailwidgetsettings/src/emailwidgetsettingslistviewcontainer.cpp --- a/emailuis/widget/emailwidgetsettings/src/emailwidgetsettingslistviewcontainer.cpp Tue Feb 02 00:02:40 2010 +0200 +++ b/emailuis/widget/emailwidgetsettings/src/emailwidgetsettingslistviewcontainer.cpp Fri Feb 19 22:37:30 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2009 - 2010 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" @@ -20,28 +20,33 @@ #include #include #include -#include +#include #include #include +#include +#include #include "emailtrace.h" #include "emailwidgetsettingslistview.h" #include "cmailwidgetcenrepkeys.h" -#include "CFSMailClient.h" +#include "cfsmailclient.h" using namespace AknLayout; +using namespace EmailInterface; const TInt KMaxMailboxCount = 18; +const TInt KMaxExternalBoxCount = 10; _LIT( KDissociated,"0"); const TInt KMaxDescLen = 256; const TUid KUidWizardApp = { 0x10281c96 }; const TUid KUidEmailWizardView = { 0x10281C9A }; _LIT( KMifPath, "z:\\resource\\apps\\emailwidgetsettings.mif"); +_LIT( KMifPrefix, "mif(" ); // ======== MEMBER FUNCTIONS ======== // --------------------------------------------------------------------------- -// +// CEmailWidgetSettingsListViewContainer::CEmailWidgetSettingsListViewContainer // --------------------------------------------------------------------------- // CEmailWidgetSettingsListViewContainer::CEmailWidgetSettingsListViewContainer() @@ -50,7 +55,7 @@ } // --------------------------------------------------------------------------- -// +// CEmailWidgetSettingsListViewContainer::ConstructL // --------------------------------------------------------------------------- // void CEmailWidgetSettingsListViewContainer::ConstructL(CEmailWidgetSettingsListView* aView, @@ -69,24 +74,27 @@ } // --------------------------------------------------------------------------- -// +// CEmailWidgetSettingsListViewContainer::CreateListBoxL // --------------------------------------------------------------------------- // void CEmailWidgetSettingsListViewContainer::CreateListBoxL(MEikListBoxObserver* aObserver) { - FUNC_LOG; - TInt count = iMailboxes->MailboxCount(); + FUNC_LOG; + + + TInt nativeMailboxCount = iMailboxes->MailboxCount(); iListBox = new(ELeave) CAknSingleGraphicStyleListBox; iListBox->SetContainerWindowL( *this); iListBox->ConstructL( this, EAknListBoxSelectionList ); - iAccountNames = new (ELeave) CDesCArrayFlat(count + 1); - iDomains = new (ELeave) CDesCArrayFlat(count); - if (count) - { - iAccountIds = new ( ELeave ) CArrayFixFlat(count); - } - for (TInt i = 0; i < count; i++) + + iAccountNames = new (ELeave) CDesCArrayFlat(nativeMailboxCount + 1); // +1 for creating new mailbox + iDomains = new (ELeave) CDesCArrayFlat(1); + iAccountIds = new ( ELeave ) CArrayFixFlat(1); + + // First items on the selection list are native mailboxes. + // Append name, domain and id information to the arrays. + for (TInt i = 0; i < nativeMailboxCount; i++) { TBuf name; TBuf domain; @@ -98,6 +106,56 @@ iDomains->AppendL(domain); iAccountIds->AppendL(id); } + + // Continue with external mailboxes. + // List plugins implementing the interface. + TUid interfaceUid = TUid::Uid( KEmailObserverInterfaceUid ); + RImplInfoPtrArray pluginArray; + REComSession::ListImplementationsL( interfaceUid, pluginArray); + + const TInt pluginCount = pluginArray.Count(); + INFO_1("***** NUMBER OF plugins == %d", pluginCount); + for ( TInt ii = 0; ii < pluginCount; ii++ ) + { + TUid implUid = pluginArray[ii]->ImplementationUid(); + + // load external email client plugin + INFO_1("***** BEFORE instantiating plugin %d", implUid.iUid); + EmailInterface::CEmailObserverPlugin* plugin = EmailInterface::CEmailObserverPlugin::NewL( implUid, this ); + CleanupStack::PushL( plugin ); + INFO("***** AFTER instantiating plugin "); + + // list mailboxes of the plugin + MEmailData& data( plugin->EmailDataL() ); + RPointerArray extMailboxes = data.MailboxesL(); + + const TInt extMailboxCount = extMailboxes.Count(); + + for ( TInt jj = 0; jj < extMailboxCount; jj++ ) + { + // Append mailbox name using indexed format ( e.g. "1\tMailboxName\t\t" ) + TBuf name; + name.AppendNum(nativeMailboxCount + 1 + jj); + name.Append(_L("\t")); + name.Append(extMailboxes[jj]->Name()); + name.Append(_L("\t\t")); + iAccountNames->AppendL(name); + + // Instead of domain information, external mail clients are requested + // to provide a string containing a mif file path and icon/mask numbers. + // The provided string is stored to domain list. + iDomains->AppendL( extMailboxes[jj]->BrandingIcon()); + + + // Combine plugin uid and mailbox id and add to the list. + TFSMailMsgId uid( implUid, extMailboxes[jj]->MailboxId() ); + iAccountIds->AppendL( uid ); + } + CleanupStack::PopAndDestroy(plugin); + plugin = NULL; + } + pluginArray.ResetAndDestroy(); + HBufC* createNewMailbox = StringLoader::LoadLC(R_EMAILWIDGETSETTINGS_CREATE_NEW_MAILBOX); iAccountNames->AppendL(createNewMailbox->Des()); CleanupStack::PopAndDestroy(createNewMailbox); @@ -110,11 +168,13 @@ iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto); iListBox->SetListBoxObserver(aObserver); + SetupListIconsL(); + } // --------------------------------------------------------------------------- -// +// CEmailWidgetSettingsListViewContainer::SetupListIconsL // --------------------------------------------------------------------------- // void CEmailWidgetSettingsListViewContainer::SetupListIconsL() @@ -124,10 +184,12 @@ CleanupClosePushL(*mailClient); MFSMailBrandManager& brandManager = mailClient->GetBrandManagerL(); - TInt count = iMailboxes->MailboxCount(); + TInt count = iAccountIds->Count(); + CArrayPtr* icons = new(ELeave) CArrayPtrFlat( count + 1 ); CleanupStack::PushL( icons ); - + + // Add "new mailbox" icon to the list AppendIconL(icons, EMbmEmailwidgetsettingsQgn_prop_cmail_new_mailbox, EMbmEmailwidgetsettingsQgn_prop_cmail_new_mailbox_mask); @@ -138,15 +200,54 @@ if (brandIcon) { + // Add branded mailbox icon to the list icons->AppendL(brandIcon); } else { - AppendIconL(icons, EMbmEmailwidgetsettingsQgn_indi_cmail_drop_email_account, - EMbmEmailwidgetsettingsQgn_indi_cmail_drop_email_account_mask); + TInt err(KErrNotFound); + + // Check if domain list item contains mif file path (instead of domain) + // Path follows the format: "mif(z:\\resource\\apps\\myemailplugin.mif N1 N2)" + + TBufC temp( iDomains->MdcaPoint(i) ); + if( temp.Find(KMifPrefix) == 0 ) + { + TInt p1 = KMifPrefix().Length(); + TInt p2 = temp.Locate(' ') + 1; + TInt p3 = temp.LocateReverse(' ') + 1; + TInt end = temp.Length() - 1; + + TInt p1Len = p2-p1-1; + TInt p2Len = p3-p2-1; + TInt p3Len = end-p3; + + // negative lengths not allowed + if ( p1Len > 0 && p2Len > 0 && p3Len > 0 ) + { + TBufC mifPath(temp.Mid( p1, p1Len )); + TBufC<16> iconString(temp.Mid( p2, p2Len )); + TBufC<16> maskString(temp.Mid( p3, p3Len )); + + TLex lexIcon(iconString); + TLex lexMask(maskString); + TInt icon(0), mask(0); + lexIcon.Val(icon); + lexMask.Val(mask); + + // Add 3rd party mailbox icon to the list + err = AppendExternalIconL( icons, mifPath, icon, mask ); + } + } + if ( err ) + { + // Add default mailbox icon to the list + AppendIconL(icons, EMbmEmailwidgetsettingsQgn_indi_cmail_drop_email_account, + EMbmEmailwidgetsettingsQgn_indi_cmail_drop_email_account_mask); + } } } - + // clear any previous icon array CAknIconArray* oldIconArray = static_cast(iListBox->ItemDrawer()->ColumnData()->IconArray()); if (oldIconArray) @@ -158,7 +259,7 @@ } // ----------------------------------------------------------------------------- -// CFeedsTopicContainer::AppendIconL +// CEmailWidgetSettingsListViewContainer::AppendIconL // // Loads and appends an icon to the icon array. // ----------------------------------------------------------------------------- @@ -184,6 +285,40 @@ CleanupStack::Pop(newIcon); } +// ----------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::AppendExternalIconL +// +// Loads and appends an 3rd party icon to the icon array. +// ----------------------------------------------------------------------------- +// +TInt CEmailWidgetSettingsListViewContainer::AppendExternalIconL( + CArrayPtr* aIcons, + const TDesC& aMifPath, + const TInt aFileBitmapId, + const TInt aFileMaskId) + { + FUNC_LOG; + CGulIcon* newIcon; + CFbsBitmap* newIconBmp; + CFbsBitmap* newIconMaskBmp; + // Trap when faulty mif path, missing graphic file, etc. + TRAPD( err, AknIconUtils::CreateIconL( newIconBmp, newIconMaskBmp, aMifPath, + aFileBitmapId, + aFileMaskId ) ); + if (!err) + { + CleanupStack::PushL(newIconBmp); + CleanupStack::PushL(newIconMaskBmp); + newIcon = CGulIcon::NewL(newIconBmp, newIconMaskBmp); + CleanupStack::Pop(newIconMaskBmp); + CleanupStack::Pop(newIconBmp); + CleanupStack::PushL(newIcon); + aIcons->AppendL(newIcon); + CleanupStack::Pop(newIcon); + } + return err; + } + // --------------------------------------------------------------------------- // CEmailWidgetSettingsListViewContainer::CreateCbaL // --------------------------------------------------------------------------- @@ -210,6 +345,7 @@ delete iAccountNames; delete iDomains; delete iAccountIds; + REComSession::FinalClose(); } // --------------------------------------------------------------------------- @@ -220,9 +356,9 @@ { FUNC_LOG; TRect mainPaneRect; - AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); - TRect listBoxRect(mainPaneRect.Size()); - iListBox->SetRect(listBoxRect); + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); + TRect listBoxRect(mainPaneRect.Size()); + iListBox->SetRect(listBoxRect); } // --------------------------------------------------------------------------- @@ -291,7 +427,8 @@ // void CEmailWidgetSettingsListViewContainer::SaveSelectedL() { - FUNC_LOG; + FUNC_LOG; + if (CurrentIndex() == iAccountNames->Count() - 1) { LaunchEmailWizardL(); @@ -306,21 +443,47 @@ } CRepository* cenRep = CRepository::NewL( KCRUidCmailWidget ); + // Check whether selected box is native or external mailbox + TInt index = CurrentIndex(); + TInt nativeBoxCount = iMailboxes->MailboxCount(); + + TBool nativeBox(ETrue); + if ( index >= nativeBoxCount ) + { + nativeBox = EFalse; + } + if ( cenRep ) { - TInt setId (GetSettingToAssociateL(args->Arg(1))); + TInt setId ( GetSettingToAssociateL(args->Arg(1), nativeBox, cenRep) ); if (setId >= 0) { - TUint32 errorKey; TFSMailMsgId msgId = (*iAccountIds)[CurrentIndex()]; TInt id = msgId.Id(); TUid pluginId = msgId.PluginId(); TInt pId(pluginId.iUid); - cenRep->StartTransaction(CRepository::EConcurrentReadWriteTransaction); - cenRep->Set( KCMailMailboxIdBase+setId, id ); - cenRep->Set( KCMailPluginIdBase+setId, pId ); - cenRep->Set( KCMailWidgetContentIdBase+setId, args->Arg(1) ); + TInt ret = cenRep->StartTransaction(CRepository::EConcurrentReadWriteTransaction); + + if ( nativeBox ) + { + ResetExtAccountWithSameId( args->Arg(1), cenRep ); + + ret = cenRep->Set( KCMailMailboxIdBase+setId, id ); + ret = cenRep->Set( KCMailPluginIdBase+setId, pId ); + ret = cenRep->Set( KCMailWidgetContentIdBase+setId, args->Arg(1) ); + } + else // external mailbox + { + ResetNatAccountWithSameId( args->Arg(1), cenRep ); + + ret = cenRep->Set( KCMailExtMailboxBase+setId, id ); + ret = cenRep->Set( KCMailExtMailboxBase+KCMailExtPluginIdOffset+setId, pId ); + ret = cenRep->Set( KCMailExtMailboxBase+KCMailExtWidgetCidOffset+setId, args->Arg(1) ); + } + + TUint32 errorKey( 0 ); cenRep->CommitTransaction(errorKey); + INFO_1("Errorkey == %d", errorKey); } } delete cenRep; @@ -328,42 +491,99 @@ } // --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::ResetExtAccountWithSameId +// --------------------------------------------------------------------------- +// +void CEmailWidgetSettingsListViewContainer::ResetExtAccountWithSameId( const TDesC& aContentId, CRepository* aCenRep ) + { + FUNC_LOG; + for ( TInt i = 0; i < KMaxExternalBoxCount; i++ ) + { + TBuf<10> value; + TInt ret = aCenRep->Get( KCMailExtMailboxBase+KCMailExtWidgetCidOffset+i, value ); + if ( !value.Compare( aContentId ) ) + { + // found + ret = aCenRep->Set(KCMailExtMailboxBase+i, 0); + ret = aCenRep->Set(KCMailExtMailboxBase+KCMailExtPluginIdOffset+i, 0); + ret = aCenRep->Set(KCMailExtMailboxBase+KCMailExtWidgetCidOffset+i, KDissociated); + } + } + } + +// --------------------------------------------------------------------------- +// CEmailWidgetSettingsListViewContainer::ResetNatAccountWithSameId +// --------------------------------------------------------------------------- +void CEmailWidgetSettingsListViewContainer::ResetNatAccountWithSameId( const TDesC& aContentId, CRepository* aCenRep ) + { + FUNC_LOG; + for ( TInt i = 0; i < KMaxMailboxCount; i++ ) + { + TBuf<10> value; + TInt ret = aCenRep->Get( KCMailWidgetContentIdBase+i, value ); + if ( !value.Compare( aContentId ) ) + { + // found + ret = aCenRep->Set(KCMailMailboxIdBase+i, 0); + ret = aCenRep->Set(KCMailPluginIdBase+i, 0); + ret = aCenRep->Set(KCMailWidgetContentIdBase+i, KDissociated); + } + } + } + +// --------------------------------------------------------------------------- // CEmailWidgetSettingsListViewContainer::GetSettingToAssociateL // --------------------------------------------------------------------------- // -TInt CEmailWidgetSettingsListViewContainer::GetSettingToAssociateL(const TDesC& aCid) +TInt CEmailWidgetSettingsListViewContainer::GetSettingToAssociateL(const TDesC& aCid, + const TBool aNativeBox, + CRepository* aCenRep) { FUNC_LOG; + TUint32 keyBase; + TInt mailboxCount; + if (aNativeBox) + { + keyBase = KCMailWidgetContentIdBase; + mailboxCount = KMaxMailboxCount; + } + else // external mailbox + { + keyBase = KCMailExtMailboxBase + KCMailExtWidgetCidOffset; + mailboxCount = KMaxExternalBoxCount; + } + TInt ret(KErrNotFound); - CRepository* cenRep = CRepository::NewL( KCRUidCmailWidget ); - for (TInt i = 0; i < KMaxMailboxCount; i++) + + // Search selected widget content id from cenrep settings + for (TInt i = 0; i < mailboxCount; i++) { TBuf value; - TUint32 key(KCMailWidgetContentIdBase+i); - cenRep->Get( key, value ); + aCenRep->Get( keyBase+i, value ); TInt result = value.Compare(aCid); if (!result) { + // Content id found ret = i; break; } } if (ret < 0 ) { - for (TInt i = 0; i < KMaxMailboxCount; i++) + // Content id not found. Search first free space. + for (TInt i = 0; i < mailboxCount; i++) { TBuf value; - TUint32 key(KCMailWidgetContentIdBase+i); - cenRep->Get( key, value ); + aCenRep->Get( keyBase+i, value ); TInt result = value.Compare(KDissociated); if (!result) { + // Free space found ret = i; break; } } } - delete cenRep; return ret; } @@ -385,4 +605,10 @@ } } +void CEmailWidgetSettingsListViewContainer::EmailObserverEvent( + EmailInterface::MEmailData& /*aEmailData*/ ) + { + FUNC_LOG; + } + // End of File