diff -r e7aa27f58ae1 -r e1b6206813b4 emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp --- a/emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp Tue Feb 02 00:02:40 2010 +0200 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp Fri Feb 19 22:37:30 2010 +0200 @@ -24,18 +24,27 @@ #include #include #include +#include +#include +#include +#include #include "emailtrace.h" -#include "CFSMailClient.h" -#include "CFSMailBox.h" -#include "CFSMailFolder.h" +#include "cfsmailclient.h" +#include "cfsmailbox.h" +#include "cfsmailfolder.h" #include "cmailcpshandler.h" #include "cmailcpssettings.h" #include "cmailcpsif.h" #include "cmailmessagedetails.h" #include "cmailmailboxdetails.h" +#include "cmailexternalaccount.h" #include "cmailcpsifconsts.h" #include "FreestyleEmailUiConstants.h" +#include "cmailpluginproxy.h" +#include "cmailhandlerpluginpanic.h" + +using namespace EmailInterface; // --------------------------------------------------------- // CMailCpsHandler::CMailCpsHandler @@ -81,7 +90,8 @@ iSettings = CMailCpsSettings::NewL( MailClient() ); InitializeL(); - + InitializeExternalAccountsL(); + iSettings->StartObservingL( this ); } @@ -95,6 +105,7 @@ delete iLiwIf; delete iSettings; iAccountsArray.ResetAndDestroy(); + iExternalPlugins.ResetAndDestroy(); } // --------------------------------------------------------- @@ -164,6 +175,120 @@ } // --------------------------------------------------------- +// CMailCpsHandler::InitializeExternalAccountsL +// --------------------------------------------------------- +// +void CMailCpsHandler::InitializeExternalAccountsL() + { + FUNC_LOG; + // Read external account data from settings + RPointerArray extAccounts; + CleanupClosePushL( extAccounts ); + iSettings->GetExtMailboxesL( extAccounts ); + + // Delete removed plugins + RemoveUnusedPluginsL( extAccounts ); + + // Instantiate new plugins + AddNewPluginsL( extAccounts ); + + // Set accounts under correct pluginProxies + SelectAndUpdateExtAccountsL( extAccounts ); + + __ASSERT_DEBUG( extAccounts.Count() == 0, Panic( ECmailHandlerPluginPanicNoFailedState ) ); + CleanupStack::PopAndDestroy(); + } + +// --------------------------------------------------------- +// CMailCpsHandler::RemoveUnusedPluginsL +// --------------------------------------------------------- +// +void CMailCpsHandler::RemoveUnusedPluginsL( RPointerArray& aAccounts ) + { + FUNC_LOG; + for ( TInt i = 0; i < iExternalPlugins.Count(); i++ ) + { + if ( !IsPluginInArray( iExternalPlugins[i]->PluginId(), aAccounts ) ) + { + // all plugin's accounts have been removed from widget settings, unloading resources + CMailPluginProxy* proxy = iExternalPlugins[i]; + iExternalPlugins.Remove(i--); // also change the loop index + delete proxy; + } + } + } + +// --------------------------------------------------------- +// CMailCpsHandler::AddNewPluginsL +// --------------------------------------------------------- +// +void CMailCpsHandler::AddNewPluginsL( RPointerArray& aAccounts ) + { + FUNC_LOG; + for ( TInt i = 0; i < aAccounts.Count(); i++ ) + { + if ( !IsPluginInArray( aAccounts[i]->PluginId(), iExternalPlugins ) ) + { + // new plugin instantiation + INFO_1("Instantiating plugin 0x%x", aAccounts[i]->PluginId() ); + CMailPluginProxy* proxy = CMailPluginProxy::NewL( aAccounts[i]->PluginId(), *iLiwIf ); + CleanupStack::PushL( proxy ); + iExternalPlugins.AppendL( proxy ); + CleanupStack::Pop( proxy ); + } + } + } + +// --------------------------------------------------------- +// CMailCpsHandler::UpdateExtAccountsL +// --------------------------------------------------------- +// +void CMailCpsHandler::SelectAndUpdateExtAccountsL( RPointerArray& aAccounts ) + { + FUNC_LOG; + for ( TInt i = 0; i < iExternalPlugins.Count(); i++ ) + { + iExternalPlugins[i]->SelectAndUpdateAccountsL( aAccounts ); + } + } + +// --------------------------------------------------------- +// CMailCpsHandler::IsPluginInArray +// --------------------------------------------------------- +// +TBool CMailCpsHandler::IsPluginInArray( const TInt aPluginId, RPointerArray& aAccounts ) + { + FUNC_LOG; + TBool found( EFalse ); + for ( TInt i = 0; i < aAccounts.Count(); i++ ) + { + if ( aAccounts[i]->PluginId() == aPluginId ) + { + found = ETrue; + } + } + return found; + } + +// --------------------------------------------------------- +// CMailCpsHandler::IsPluginInArray +// --------------------------------------------------------- +// +TBool CMailCpsHandler::IsPluginInArray( const TInt aPluginId, RPointerArray& aPlugins ) + { + FUNC_LOG; + TBool found( EFalse ); + for ( TInt i = 0; i < aPlugins.Count(); i++ ) + { + if ( aPlugins[i]->PluginId() == aPluginId ) + { + found = ETrue; + } + } + return found; + } + +// --------------------------------------------------------- // CMailCpsHandler::CreateMailboxDetailsL // --------------------------------------------------------- // @@ -186,6 +311,7 @@ Reset(); // Trying to keep callback interface non-leaving TRAP_IGNORE( InitializeL() ); + TRAP_IGNORE( InitializeExternalAccountsL() ); // Update widget contents after settings change TRAP_IGNORE( UpdateFullL() ); } @@ -215,24 +341,30 @@ FUNC_LOG; TInt row(1); // start from first row TInt mailbox(0); - + TBool found( EFalse ); + // try to find mailbox with matching contentId for ( mailbox = 0; mailbox < iAccountsArray.Count(); mailbox++ ) - { - TInt compare = aContentId.Compare(*iAccountsArray[mailbox]->iWidgetInstance); - if (!compare) + { + if ( !aContentId.Compare( *iAccountsArray[mailbox]->iWidgetInstance ) ) { + INFO_1("iAccountsArray.Count() == %d", iAccountsArray.Count()); + found = ETrue; break; } } - // Update fields from left to right - UpdateMailBoxIconL( mailbox, aInstance, row ); - UpdateMailboxNameL( mailbox, aInstance, row ); - UpdateIndicatorIconL( mailbox, aInstance, row ); - row++; - UpdateMessagesL( mailbox, aInstance, 1, row); - row++; - UpdateMessagesL( mailbox, aInstance, 2, row); + // if contentId found from array, update the mailbox + if ( found ) + { + // Update fields from left to right + UpdateMailBoxIconL( mailbox, aInstance, row ); + UpdateMailboxNameL( mailbox, aInstance, row ); + UpdateIndicatorIconL( mailbox, aInstance, row ); + row++; + UpdateMessagesL( mailbox, aInstance, 1, row); + row++; + UpdateMessagesL( mailbox, aInstance, 2, row); + } } // --------------------------------------------------------- @@ -601,18 +733,18 @@ TFSMailMsgId mailBoxId; mailBoxId = iAccountsArray[aMailBoxNumber]->iMailboxId; - if ( GetUnseenCountL(mailBoxId) > 0 ) + if ( iSettings->GetNewMailState( mailBoxId ) ) { iLiwIf->PublishIndicatorIconL( aWidgetInstance, aRowNumber, - EMbmCmailhandlerpluginQgn_indi_ai_eplg_unread ); + EMbmCmailhandlerpluginQgn_stat_message_mail_uni ); } else if( !IsOutboxEmptyL(mailBoxId) ) { iLiwIf->PublishIndicatorIconL( aWidgetInstance, aRowNumber, - EMbmCmailhandlerpluginQgn_prop_mce_outbox_small); + EMbmCmailhandlerpluginQgn_indi_cmail_outbox_msg); } else { @@ -704,11 +836,13 @@ case TFSEventMailboxRenamed: { HandleMailboxRenamedEventL( aMailbox ); + UpdateFullL(); break; } case TFSEventMailboxDeleted: { HandleMailboxDeletedEventL( aMailbox ); + UpdateFullL(); break; } case TFSEventMailboxSettingsChanged: @@ -720,11 +854,13 @@ case TFSEventNewMail: { HandleNewMailEventL( aMailbox, aParam1, aParam2 ); + UpdateFullL(); break; } case TFSEventMailDeleted: { HandleMailDeletedEventL( aMailbox, aParam1, aParam2 ); + UpdateFullL(); break; } case TFSEventMailChanged: @@ -742,7 +878,6 @@ break; } } - UpdateFullL(); } // --------------------------------------------------------- @@ -831,6 +966,7 @@ // Remove from cenrep iSettings->RemoveMailboxL( aMailbox ); + iSettings->ToggleWidgetNewMailIconL( EFalse, aMailbox ); break; } } @@ -844,6 +980,9 @@ TFSMailMsgId aMailbox, TAny* aParam1, TAny* aParam2 ) { FUNC_LOG; + + iSettings->ToggleWidgetNewMailIconL( ETrue, aMailbox ); + // Basic assertions if ( !aParam1 || !aParam2 ) { @@ -1589,28 +1728,38 @@ { FUNC_LOG; - TUid mailBoxUid; - mailBoxUid.iUid = iSettings->GetMailboxUidByContentId(aContentId); - TFSMailMsgId mailBoxId; - mailBoxId.SetId(mailBoxUid.iUid); - TUid pluginUid; - pluginUid.iUid = iSettings->GetPluginUidByContentId(aContentId); - mailBoxId.SetPluginId(pluginUid); - CFSMailBox* mailBox = MailClient().GetMailBoxByUidL( mailBoxId ); - CleanupStack::PushL( mailBox ); - if ( mailBox ) + TInt nativeMailboxId( iSettings->GetMailboxUidByContentId( aContentId ) ); + // Is the contentId related to internal mailbox or external? + if( nativeMailboxId ) { - TFSMailMsgId inboxFolderId = mailBox->GetStandardFolderId( EFSInbox ); + TUid mailBoxUid; + mailBoxUid.iUid = nativeMailboxId; - TMailListActivationData tmp; - tmp.iFolderId = inboxFolderId; - tmp.iMailBoxId = mailBoxId; - const TPckgBuf pkgOut( tmp ); - iEnv->EikAppUi()->ActivateViewL( TVwsViewId(KUidEmailUi, KMailListId), - KStartListWithFolderId, - pkgOut); + TFSMailMsgId mailBoxId; + mailBoxId.SetId(mailBoxUid.iUid); + TUid pluginUid; + pluginUid.iUid = iSettings->GetPluginUidByContentId(aContentId); + mailBoxId.SetPluginId(pluginUid); + CFSMailBox* mailBox = MailClient().GetMailBoxByUidL( mailBoxId ); + CleanupStack::PushL( mailBox ); + if ( mailBox ) + { + TFSMailMsgId inboxFolderId = mailBox->GetStandardFolderId( EFSInbox ); + + TMailListActivationData tmp; + tmp.iFolderId = inboxFolderId; + tmp.iMailBoxId = mailBoxId; + const TPckgBuf pkgOut( tmp ); + iEnv->EikAppUi()->ActivateViewL( TVwsViewId(KUidEmailUi, KMailListId), + KStartListWithFolderId, + pkgOut); + } + CleanupStack::PopAndDestroy( mailBox ); } - CleanupStack::PopAndDestroy( mailBox ); + else + { + LaunchExtAppL( aContentId ); + } } // ----------------------------------------------------------------------------- @@ -1625,6 +1774,55 @@ viewUid, KNullDesC8); } + +// ----------------------------------------------------------------------------- +// CMailCpsHandler::LaunchExtAppL() +// ----------------------------------------------------------------------------- +// +void CMailCpsHandler::LaunchExtAppL( const TDesC& aContentId ) + { + FUNC_LOG; + CMailPluginProxy* plugin = GetExtPluginL( aContentId ); + if ( plugin ) + { + plugin->LaunchExtAppL( aContentId ); + } + } + +// ----------------------------------------------------------------------------- +// CMailCpsHandler::GetExtPluginL +// ----------------------------------------------------------------------------- +// +CMailPluginProxy* CMailCpsHandler::GetExtPluginL( const TDesC& aContentId ) + { + FUNC_LOG; + CMailPluginProxy* plugin( NULL ); + for( TInt i = 0; i < iExternalPlugins.Count(); i++ ) + { + if ( iExternalPlugins[i]->HasAccount( aContentId ) ) + { + plugin = iExternalPlugins[i]; + } + } + return plugin; + } + +// ----------------------------------------------------------------------------- +// CMailCpsHandler::UpdateExtAccountL +// ----------------------------------------------------------------------------- +// +void CMailCpsHandler::UpdateExtAccountL( const TDesC& aContentId ) + { + FUNC_LOG; + // Look up plugin that handles this account + CMailPluginProxy* plugin = GetExtPluginL( aContentId ); + if ( plugin ) + { + // Publish its data + plugin->UpdateAccountL( aContentId ); + } + } + // --------------------------------------------------------------------------- // CMailCpsHandler::AssociateWidget // --------------------------------------------------------------------------- @@ -1652,13 +1850,50 @@ } // --------------------------------------------------------------------------- +// CMailCpsHandler::TotalMailboxCount +// --------------------------------------------------------------------------- +// +TInt CMailCpsHandler::TotalMailboxCountL() + { + FUNC_LOG; + return TotalIntMailboxCount() + TotalExtMailboxCountL(); + } + +// --------------------------------------------------------------------------- // CMailCpsHandler::GetMailboxCount // --------------------------------------------------------------------------- // -TInt CMailCpsHandler::GetMailboxCount() +TInt CMailCpsHandler::TotalIntMailboxCount() + { + FUNC_LOG; + return iSettings->TotalIntMailboxCount(); + } + +// --------------------------------------------------------- +// CMailCpsHandler::TotalExtMailboxCount +// --------------------------------------------------------- +// +TInt CMailCpsHandler::TotalExtMailboxCountL() { FUNC_LOG; - return iSettings->GetTotalMailboxCount(); + TInt totalMailboxCount( 0 ); + TUid interfaceUid = TUid::Uid( KEmailObserverInterfaceUid ); + RImplInfoPtrArray plugins; + CleanupClosePushL( plugins ); + REComSession::ListImplementationsL( interfaceUid, plugins); + + for ( TInt i = 0; i < plugins.Count(); i++ ) + { + TUid implUid = plugins[i]->ImplementationUid(); + INFO_1("Instantiating plugin %d", implUid.iUid); + EmailInterface::CEmailObserverPlugin* plugin = + EmailInterface::CEmailObserverPlugin::NewL( implUid, this ); + MEmailData& data( plugin->EmailDataL() ); + totalMailboxCount += data.MailboxesL().Count(); + } + + CleanupStack::PopAndDestroy(); // plugins + return totalMailboxCount; } // --------------------------------------------------------------------------- @@ -1681,7 +1916,7 @@ if (!iSettings->FindFromContentIdListL(aContentId)) { iSettings->AddToContentIdListL(aContentId); - if (GetMailboxCount()) + if ( TotalMailboxCountL() ) { LaunchWidgetSettingsL(aContentId); } @@ -1719,3 +1954,10 @@ return ret; } +// --------------------------------------------------------------------------- +// CMailCpsHandler::EmailObserverEvent +// --------------------------------------------------------------------------- +void CMailCpsHandler::EmailObserverEvent( EmailInterface::MEmailData& /*aData*/ ) + { + // Nothing to do + }