emailservices/emailserver/cmailhandlerplugin/src/cmailpluginproxy.cpp
branchRCL_3
changeset 8 e1b6206813b4
child 10 f5907b1a1053
--- /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 <cmailhandlerplugin.mbg> // icons
+#include <StringLoader.h>
+#include <emailwidget.rsg>
+
+#include <memaildata.h>
+#include <emailobserverplugin.h>
+#include <memailmailboxdata.h>
+#include <memailapplaunchdata.h>
+
+#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<CMailExternalAccount>& 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<MMailboxData> 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<TInt>* ints = new(ELeave) CArrayFixFlat<TInt>( 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<MMailboxData> 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<CMailExternalAccount>& aAccounts )
+    {
+    FUNC_LOG;
+    RemoveAccountsL();
+    SelectOwnAccountsL( aAccounts );
+    PublishAccountsL();
+    }
+
+// ---------------------------------------------------------------------------
+// CMailPluginProxy::UpdateAccountL
+// ---------------------------------------------------------------------------
+//
+void CMailPluginProxy::UpdateAccountL( const TDesC& aContentId )
+    {
+    FUNC_LOG;
+    PublishAccountL(
+        ResolveWidgetInstance( aContentId ), 
+        GetMailboxId( aContentId ) );
+    }