ipsservices/nmipssettings/src/nmipssettingsmanagerfactory.cpp
changeset 18 578830873419
child 68 83cc6bae1de8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ipsservices/nmipssettings/src/nmipssettingsmanagerfactory.cpp	Fri Apr 16 14:51:52 2010 +0300
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 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:
+*
+*/
+
+#include <cemailaccounts.h>
+
+#include "nmipssettingsmanagerfactory.h"
+#include "nmipsimap4settingsmanager.h"
+#include "nmipspop3settingsmanager.h"
+#include "nmcommon.h"
+
+/*!
+    \class NmIpsSettingsManagerFactory
+    \brief The class verify the mailbox type and return the appropriate settings manager
+*/
+
+// ======== MEMBER FUNCTIONS ========
+
+/*!
+    Static factory function that creates the appropriate settingsmanager.
+    \param mailboxId Id of the mailbox.
+    \return <code>NmIpsImap4SettingsManager</code> if Imap4 mailbox otherwise 
+            <code>NmIpsPop3SettingsManager</code> if Pop3 mailbox
+*/
+NmIpsSettingsManagerBase *NmIpsSettingsManagerFactory::createSettingManager(const NmId &mailboxId)
+{
+    NmIpsSettingsManagerBase *settingManager = 0;  
+    TImapAccount imapAccount;
+    TPopAccount popAccount;
+    
+    QScopedPointer<CEmailAccounts> emailAccounts;
+    TRAPD(err, emailAccounts.reset(CEmailAccounts::NewL()));
+    
+    if (err == KErrNone) {
+        bool isImapAccount = false;        
+        isImapAccount = isImap4MailAccount(*emailAccounts, mailboxId, imapAccount);
+        if (isImapAccount) { 
+            settingManager = new NmIpsImap4SettingsManager(mailboxId, emailAccounts.data(), imapAccount);
+            (void)emailAccounts.take();
+        } else {
+            bool isPopAccount = false;
+            isPopAccount = isPop3MailAccount(*emailAccounts, mailboxId, popAccount);
+            if (isPopAccount) {
+                settingManager = new NmIpsPop3SettingsManager(mailboxId, emailAccounts.data(), popAccount);
+                (void)emailAccounts.take();
+            }
+        }
+    }
+    return settingManager;
+}
+
+/*!
+    Function first search for all the Imap mailboxes, then it checks if one the mailboxes
+    matches the mailbox id.
+    \param emailAccounts CEmailAccounts that will be used to manipulate the mailbox.
+    \param mailboxId Id of the mailbox.
+    \param imapAccount TImapAccount reference for returning the Imap mailbox if found.
+    \return <code>true</code> if the Imap4 mailbox were found otherwise <code>false</code>
+*/
+bool NmIpsSettingsManagerFactory::isImap4MailAccount(CEmailAccounts &emailAccounts, 
+    const NmId &mailboxId, TImapAccount &imapAccount)
+{
+    bool result = false;
+    RArray<TImapAccount> imapAccounts;
+    TRAPD(err, emailAccounts.GetImapAccountsL( imapAccounts ));
+    if (err == KErrNone) {
+        TInt accountCount( imapAccounts.Count() );        
+        for ( TInt accountIndex( 0 ); accountIndex < accountCount; ++accountIndex ) {
+            // mailboxId.mId contains exactly same value as account.iImapAccountId 
+            // when refering to same mailbox.
+            TImapAccount account = imapAccounts[accountIndex];
+            if ( account.iImapService == mailboxId.id32()) {
+                imapAccount = account;
+                result = true; //is imap4 box
+                break;
+            }
+        } 
+    }  
+    return result;
+}
+
+/*!
+    Function first search for all the Pop mailboxes, then it checks if one the mailboxes
+    matches the mailbox id.
+    \param emailAccounts CEmailAccounts that will be used to manipulate the mailbox.
+    \param mailboxId Id of the mailbox.
+    \param popAccount TPopAccount reference for returning the pop mailbox if found.
+    \return <code>true</code> if the Pop3 mailbox were found otherwise <code>false</code>
+*/
+bool NmIpsSettingsManagerFactory::isPop3MailAccount(CEmailAccounts &emailAccounts, 
+    const NmId &mailboxId, TPopAccount &popAccount)
+{
+    bool result = false;
+    RArray<TPopAccount> popAccounts;
+    TRAPD(err, emailAccounts.GetPopAccountsL(popAccounts));
+    if (err == KErrNone) {
+        TInt accountCount = popAccounts.Count();          
+        for (TInt i = 0; i < accountCount; ++i) {
+            // mailboxId.mId contains exactly same value as account.iPopAccountId 
+            // when refering to same mailbox.
+            TPopAccount account = popAccounts[i];
+            if (popAccounts[i].iPopService == mailboxId.id32()) {
+                popAccount = account;
+                result = true; //is pop3 box
+                break;
+            }        
+        }
+    }
+    return result;
+}
+