diff -r e7aa27f58ae1 -r e1b6206813b4 emailservices/emailserver/cmailhandlerplugin/src/cmailpluginproxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailpluginproxy.cpp Fri Feb 19 22:37:30 2010 +0200 @@ -0,0 +1,483 @@ +/* +* 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" +* 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: This file implements class CMailMailboxDetails. +* +*/ + +#include // icons +#include +#include + +#include +#include +#include +#include + +#include "emailtrace.h" +#include "cmailpluginproxy.h" +#include "cmailexternalaccount.h" +#include "cmailcpsif.h" +#include "cmailcpsutils.h" + +using namespace EmailInterface; + +// --------------------------------------------------------- +// CMailPluginProxy::NewL +// --------------------------------------------------------- +// +CMailPluginProxy* CMailPluginProxy::NewL( + const TInt aPluginId, + CMailCpsIf& aPublisher ) + { + FUNC_LOG; + CMailPluginProxy* self = new(ELeave) CMailPluginProxy( aPluginId, aPublisher ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------- +// CMailPluginProxy::CMailPluginProxy +// --------------------------------------------------------- +// +CMailPluginProxy::CMailPluginProxy( + const TInt aPluginId, + CMailCpsIf& aPublisher ) : + iPluginId( aPluginId ), + iPublisher( aPublisher ) + { + FUNC_LOG; + } + +// --------------------------------------------------------- +// CMailPluginProxy::~CMailPluginProxy +// --------------------------------------------------------- +// +CMailPluginProxy::~CMailPluginProxy() + { + FUNC_LOG; + delete iPlugin; + TRAP_IGNORE( RemoveAccountsL() ); + iAccounts.ResetAndDestroy(); + } + +// --------------------------------------------------------- +// CMailPluginProxy::ConstructL +// --------------------------------------------------------- +// +void CMailPluginProxy::ConstructL() + { + FUNC_LOG; + TUid implUid = TUid::Uid( iPluginId ); + iPlugin = EmailInterface::CEmailObserverPlugin::NewL( implUid, this ); + } + +// --------------------------------------------------------- +// CMailPluginProxy::EmailObserverEvent +// --------------------------------------------------------- +// +void CMailPluginProxy::EmailObserverEvent( MEmailData& /*aData*/ ) + { + FUNC_LOG; + TRAP_IGNORE( PublishAccountsL() ); + } + +// --------------------------------------------------------- +// CMailPluginProxy::PluginId +// --------------------------------------------------------- +// +TInt CMailPluginProxy::PluginId() + { + FUNC_LOG; + return iPluginId; + } + +// --------------------------------------------------------- +// CMailPluginProxy::RemoveAccountsL +// --------------------------------------------------------- +// +void CMailPluginProxy::RemoveAccountsL() + { + FUNC_LOG; + while ( iAccounts.Count() ) + { + ResetAccountL( iAccounts[0]->ContentId() ); + delete iAccounts[0]; + iAccounts.Remove(0); + } + } + +// --------------------------------------------------------- +// CMailPluginProxy::ResetAccountL +// --------------------------------------------------------- +// +void CMailPluginProxy::ResetAccountL( const TDesC& aContentId ) + { + FUNC_LOG; + TInt instId = ResolveWidgetInstance( aContentId ); + if ( instId >= 0 ) + { + TFSMailMsgId dummy; + iPublisher.PublishMailboxIconL( instId, KNullDesC ); + iPublisher.PublishActiveMailboxNameL( instId, 1, KNullDesC, 0, dummy, dummy ); + iPublisher.PublishIndicatorIconL( instId, 1, KNullIcon ); + + ResetMessageRowL( instId, 2 ); // 1st message row + ResetMessageRowL( instId, 3 ); // 2nd.. + } + } + +// --------------------------------------------------------- +// CMailPluginProxy::ResetMessageRowL +// --------------------------------------------------------- +// +void CMailPluginProxy::ResetMessageRowL( const TInt aWidgetInstanceId, const TInt aRow ) + { + FUNC_LOG; + TFSMailMsgId dummy; + iPublisher.PublishMailboxIconL( aWidgetInstanceId, aRow, KNullIcon, dummy ); + iPublisher.PublishMailDetailL( aWidgetInstanceId, aRow, KNullDesC, ESender ); + iPublisher.PublishMailDetailL( aWidgetInstanceId, aRow, KNullDesC, ETime ); + } + +// --------------------------------------------------------- +// CMailPluginProxy::SelectOwnAccountsL +// --------------------------------------------------------- +// +void CMailPluginProxy::SelectOwnAccountsL( RPointerArray& aAccounts ) + { + FUNC_LOG; + for ( TInt i = 0; i < aAccounts.Count(); i++ ) + { + if ( aAccounts[i]->PluginId() == iPluginId ) + { + // own account, take ownership + iAccounts.AppendL( aAccounts[i] ); + aAccounts.Remove(i); + i--; // update loop indexing + } + } + } + +// --------------------------------------------------------- +// CMailPluginProxy::PublishAccountsL +// --------------------------------------------------------- +// +void CMailPluginProxy::PublishAccountsL() + { + FUNC_LOG; + // Loops through all external accounts of this plugin (that are configured + // to be published), and calls publish on them + for ( TInt i = 0; i < iAccounts.Count(); i++ ) + { + TInt instId = ResolveWidgetInstance( iAccounts[i]->ContentId() ); + if ( instId != KErrNotFound && iPublisher.AllowedToPublish( instId ) ) + { + PublishAccountL( instId, iAccounts[i]->MailboxId() ); + } + else + { + INFO("Correct widget not found, not publishing.."); + } + } + } + +// --------------------------------------------------------- +// CMailPluginProxy::PublishAccountL +// --------------------------------------------------------- +// +void CMailPluginProxy::PublishAccountL( const TInt aWidgetInstanceId, const TInt aMailboxId ) + { + FUNC_LOG; + // Loops through plugin's mailbox array and finds matching mailbox + MEmailData& data( iPlugin->EmailDataL() ); + RPointerArray mailboxes = data.MailboxesL(); + for ( TInt j = 0; j < mailboxes.Count(); j++ ) + { + if ( mailboxes[j]->MailboxId() == aMailboxId ) + { + PublishAccountL( aWidgetInstanceId, *(mailboxes[j]) ); + } + } + } + +// --------------------------------------------------------- +// CMailPluginProxy::PublishAccountL +// --------------------------------------------------------- +// +void CMailPluginProxy::PublishAccountL( const TInt aWidgetInstanceId, MMailboxData& aMailboxData ) + { + FUNC_LOG; + // 1st row + PublishFirstRowL( aWidgetInstanceId, aMailboxData ); + + // message rows + TInt msgCount = aMailboxData.LatestMessagesL().Count(); + for ( TInt i = 0; i < KMaxMsgCount; i++ ) + { + if ( msgCount > i ) + { + // enough messages for this row + PublishMessageRowL( aWidgetInstanceId, *(aMailboxData.LatestMessagesL()[i]), i+2 ); // message-rows start from 2 + } + else + { + // make sure this row is empty + TFSMailMsgId dummy; + iPublisher.PublishMailboxIconL( aWidgetInstanceId, i+2, KNullIcon, dummy ); + iPublisher.PublishMailDetailL( aWidgetInstanceId, i+2, KNullDesC, ESender ); + iPublisher.PublishMailDetailL( aWidgetInstanceId, i+2, KNullDesC, ETime ); + } + } + } + +// --------------------------------------------------------- +// CMailPluginProxy::PublishMessageL +// --------------------------------------------------------- +// +void CMailPluginProxy::PublishMessageRowL( const TInt aWidgetInstanceId, EmailInterface::MMessageData& aMessageData, const TInt aRow ) + { + FUNC_LOG; + TFSMailMsgId dummy; + TInt iconId = TMailCpsUtils::ResolveIcon( + aMessageData.Unread(), + aMessageData.CalendarMsg(), + aMessageData.Attachments(), + aMessageData.Priority(), + aMessageData.Replied(), + aMessageData.Forwarded() ); + + iPublisher.PublishMailboxIconL( aWidgetInstanceId, aRow, iconId, dummy ); + iPublisher.PublishMailDetailL( aWidgetInstanceId, aRow, aMessageData.Sender(), ESender ); + HBufC* timeString = CMailCpsHandler::GetMessageTimeStringL( aMessageData.TimeStamp() ); + CleanupStack::PushL( timeString ); + iPublisher.PublishMailDetailL( aWidgetInstanceId, aRow, *timeString, ETime ); + CleanupStack::PopAndDestroy( timeString ); + } + +// --------------------------------------------------------- +// CMailPluginProxy::PublishFirstRowL +// --------------------------------------------------------- +// +void CMailPluginProxy::PublishFirstRowL( const TInt aWidgetInstanceId, EmailInterface::MMailboxData& aMailboxData ) + { + FUNC_LOG; + HBufC* firstLineText = ConstructMailboxNameWithMessageCountLC( aMailboxData ); + TInt indicator = ResolveIndicatorIcon( aMailboxData ); + iPublisher.PublishMailboxIconL( aWidgetInstanceId, aMailboxData.BrandingIcon() ); + iPublisher.PublishMailboxNameL( aWidgetInstanceId, *firstLineText, KTriggerEmailUi8 ); + iPublisher.PublishIndicatorIconL( aWidgetInstanceId, 1, indicator ); + CleanupStack::PopAndDestroy( firstLineText ); + } + +// --------------------------------------------------------- +// CMailPluginProxy::ConstructMailboxNameWithMessageCountLC +// --------------------------------------------------------- +// +HBufC* CMailPluginProxy::ConstructMailboxNameWithMessageCountLC( MMailboxData& aMailboxData ) + { + FUNC_LOG; + HBufC* mailboxAndCount( NULL ); + TInt unreadCount = UnreadCountL( aMailboxData ); + if ( unreadCount > 0 ) + { + // Arrays must be used when loc string contains indexed parameters + CDesCArrayFlat* strings = new CDesCArrayFlat( 1 ); + CleanupStack::PushL( strings ); + strings->AppendL( aMailboxData.Name() ); // replace "%0U" with mailbox name + + CArrayFix* ints = new(ELeave) CArrayFixFlat( 1 ); + CleanupStack::PushL( ints ); + ints->AppendL( unreadCount ); // replace "%1N" with number of unread messages + + mailboxAndCount = StringLoader::LoadL( R_EMAILWIDGET_TEXT_MAILBOX_AND_MAILCOUNT, *strings, *ints ); + CleanupStack::PopAndDestroy(ints); + CleanupStack::PopAndDestroy(strings); + CleanupStack::PushL( mailboxAndCount ); + } + else + { + // if 0 messages, first line text is pure mailbox name + mailboxAndCount = aMailboxData.Name().AllocLC(); + } + INFO_1("first line: %S", mailboxAndCount); + return mailboxAndCount; + } + +// --------------------------------------------------------- +// CMailPluginProxy::UnreadCountL +// --------------------------------------------------------- +// +TInt CMailPluginProxy::UnreadCountL( EmailInterface::MMailboxData& aMailboxData ) + { + FUNC_LOG; + TInt count( 0 ); + for ( TInt i = 0; i < aMailboxData.LatestMessagesL().Count(); i++ ) + { + if ( aMailboxData.LatestMessagesL()[i]->Unread() ) + { + count++; + } + } + return count; + } + +// --------------------------------------------------------------------------- +// CMailPluginProxy::ResolveIndicatorIcon +// --------------------------------------------------------------------------- +// +TInt CMailPluginProxy::ResolveIndicatorIcon( EmailInterface::MMailboxData& aMailboxData ) + { + FUNC_LOG; + TInt indicator( 0 ); + if ( aMailboxData.Unseen() ) + { + indicator = EMbmCmailhandlerpluginQgn_stat_message_mail_uni; + } + else if ( !aMailboxData.IsOutboxEmpty() ) + { + indicator = EMbmCmailhandlerpluginQgn_indi_cmail_outbox_msg; + } + else + { + indicator = KNullIcon; + } + return indicator; + } + +// --------------------------------------------------------------------------- +// CMailPluginProxy::ResolveWidgetInstance +// --------------------------------------------------------------------------- +// +TInt CMailPluginProxy::ResolveWidgetInstance( const TDesC& aContentId ) + { + FUNC_LOG; + TInt id( KErrNotFound ); + for ( TInt i = 0; i < iPublisher.iInstIdList.Count(); i++ ) + { + if ( aContentId.Compare( *(iPublisher.iInstIdList[i]) ) == 0 ) + { + id = i; + } + } + return id; + } + +// --------------------------------------------------------------------------- +// CMailPluginProxy::HasAccount +// --------------------------------------------------------------------------- +// +TBool CMailPluginProxy::HasAccount( const TDesC& aContentId ) + { + FUNC_LOG; + TBool found( EFalse ); + for ( TInt i = 0; i < iAccounts.Count(); i++ ) + { + if ( !( iAccounts[i]->ContentId().Compare( aContentId ) ) ) + { + found = ETrue; + } + } + return found; + } + +// --------------------------------------------------------------------------- +// CMailPluginProxy::LaunchExtAppL +// --------------------------------------------------------------------------- +// +void CMailPluginProxy::LaunchExtAppL( const TDesC& aContentId ) + { + FUNC_LOG; + MMailboxData& mailbox = GetMailboxDataL( GetMailboxId( aContentId ) ); + MEmailLaunchParameters& launchParams = mailbox.LaunchParameters(); + + CEikonEnv* env = CEikonEnv::Static(); + TVwsViewId view( launchParams.ApplicationUid(), launchParams.ViewId() ); + if ( launchParams.CustomMessageId().iUid == 0 ) + { + env->EikAppUi()->ActivateViewL( view, launchParams.CustomMessageId(), launchParams.CustomMessage() ); + } + else + { + env->EikAppUi()->ActivateViewL( view ); + } + } + +// --------------------------------------------------------------------------- +// CMailPluginProxy::ResolveMailboxId +// --------------------------------------------------------------------------- +// +TInt CMailPluginProxy::GetMailboxId( const TDesC& aContentId ) + { + FUNC_LOG; + TInt mailboxId( 0 ); + for ( TInt i = 0; i < iAccounts.Count(); i++ ) + { + if ( !(iAccounts[i]->ContentId().Compare( aContentId )) ) + { + mailboxId = iAccounts[i]->MailboxId(); + } + } + return mailboxId; + } + +// --------------------------------------------------------------------------- +// CMailPluginProxy::GetMailboxDataL +// --------------------------------------------------------------------------- +// +EmailInterface::MMailboxData& CMailPluginProxy::GetMailboxDataL( TInt aMailboxId ) + { + FUNC_LOG; + TInt index( KErrNotFound ); + RPointerArray mailboxes = iPlugin->EmailDataL().MailboxesL(); + for ( TInt i = 0; i < mailboxes.Count(); i++ ) + { + if ( mailboxes[i]->MailboxId() == aMailboxId ) + { + index = i; + } + } + + if ( index == KErrNotFound ) + { + User::Leave( KErrNotFound ); + } + + return *(mailboxes[index]); + } + +// --------------------------------------------------------------------------- +// CMailPluginProxy::SelectAndUpdateAccountsL +// --------------------------------------------------------------------------- +// +void CMailPluginProxy::SelectAndUpdateAccountsL( RPointerArray& aAccounts ) + { + FUNC_LOG; + RemoveAccountsL(); + SelectOwnAccountsL( aAccounts ); + PublishAccountsL(); + } + +// --------------------------------------------------------------------------- +// CMailPluginProxy::UpdateAccountL +// --------------------------------------------------------------------------- +// +void CMailPluginProxy::UpdateAccountL( const TDesC& aContentId ) + { + FUNC_LOG; + PublishAccountL( + ResolveWidgetInstance( aContentId ), + GetMailboxId( aContentId ) ); + }