emailuis/widget/emailwidgetsettings/src/emailwidgetsettingslistviewcontainer.cpp
branchRCL_3
changeset 8 e1b6206813b4
parent 1 12c456ceeff2
--- 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 <eikmop.h>
 #include <bacline.h>
 #include <StringLoader.h>
-#include <akniconarray.h>
+#include <AknIconArray.h>
 #include <emailwidgetsettings.rsg>
 #include <emailwidgetsettings.mbg>
+#include <emailobserverinterface.hrh>
+#include <memaildata.h>
 
 #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<TFSMailMsgId>(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<TFSMailMsgId>(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<KMaxDescLen> name;
         TBuf<KMaxDescLen> 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<MMailboxData> 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<KMaxDescLen> 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<CGulIcon>* icons = new(ELeave) CArrayPtrFlat<CGulIcon>( 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<KMaxDescLen> 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<KMaxDescLen>  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<CAknIconArray*>(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<CGulIcon>* 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<KMaxDescLen> 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<KMaxDescLen> 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