email/imum/Utils/Src/ImumInMailboxUtilitiesImpl.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Utils/Src/ImumInMailboxUtilitiesImpl.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,575 @@
+/*
+* Copyright (c) 2006 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:  ImumInMailboxUtilitiesImpl.cpp
+*
+*/
+
+
+#include <e32base.h>
+#include <SendUiConsts.h>
+#include <msvapi.h>                         // CMsvSession
+#include <msvstd.hrh>                       // Constants
+#include <mtudreg.h>                        // CMtmUiDataRegistry
+#include <cemailaccounts.h>                 // CEmailAccounts
+#include <iapprefs.h>                       // CImIAPPreferences
+
+#include "ImumInMailboxUtilitiesImpl.h"
+#include "ImumInMailboxServicesImpl.h"
+#include "ImumInternalApiImpl.h"
+#include "ImumMboxManager.h"                // CImumMboxManager
+#include "ImumMboxScheduler.h"              // CImumMboxSchdeuler
+#include "ImumUtilsLogging.h"
+#include "muiuemailtools.h"
+#include "ComDbUtl.h"
+
+// CONSTANTS
+_LIT( KImumInImapInboxName,"INBOX");
+
+// ================ CLASS CONSTRUCTION ================
+
+// ---------------------------------------------------------------------------
+// CImumInMailboxUtilitiesImpl::CImumInMailboxUtilitiesImpl()
+// ---------------------------------------------------------------------------
+//
+CImumInMailboxUtilitiesImpl::CImumInMailboxUtilitiesImpl(
+    CImumInternalApiImpl& aMailboxApi )
+    :
+    iMailboxApi( aMailboxApi )
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::CImumInMailboxUtilitiesImpl, 0, KLogInApi );
+    IMUM_IN();
+    IMUM_OUT();
+    }
+
+// ---------------------------------------------------------------------------
+// CImumInMailboxUtilitiesImpl::~CImumInMailboxUtilitiesImpl()
+// ---------------------------------------------------------------------------
+//
+CImumInMailboxUtilitiesImpl::~CImumInMailboxUtilitiesImpl()
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::~CImumInMailboxUtilitiesImpl, 0, KLogInApi );
+    IMUM_IN();
+
+    delete iMtmUiDataRegistry;
+    iMtmUiDataRegistry = NULL;
+
+    IMUM_OUT();
+    }
+
+// ---------------------------------------------------------------------------
+// CImumInMailboxUtilitiesImpl::NewL()
+// ---------------------------------------------------------------------------
+//
+CImumInMailboxUtilitiesImpl* CImumInMailboxUtilitiesImpl::NewL(
+    CImumInternalApiImpl& aMailboxApi )
+    {
+    IMUM_STATIC_CONTEXT( CImumInMailboxUtilitiesImpl::NewL, 0, utils, KLogInApi );
+    IMUM_IN();
+
+    CImumInMailboxUtilitiesImpl* self = NewLC( aMailboxApi );
+    CleanupStack::Pop( self );
+
+    IMUM_OUT();
+
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CImumInMailboxUtilitiesImpl::NewLC()
+// ---------------------------------------------------------------------------
+//
+CImumInMailboxUtilitiesImpl* CImumInMailboxUtilitiesImpl::NewLC(
+    CImumInternalApiImpl& aMailboxApi )
+    {
+    IMUM_STATIC_CONTEXT( CImumInMailboxUtilitiesImpl::NewLC, 0, utils, KLogInApi );
+    IMUM_IN();
+
+    CImumInMailboxUtilitiesImpl* self =
+        new ( ELeave ) CImumInMailboxUtilitiesImpl( aMailboxApi );
+    CleanupStack::PushL( self );
+
+    self->ConstructL();
+
+    IMUM_OUT();
+
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CImumInMailboxUtilitiesImpl::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CImumInMailboxUtilitiesImpl::ConstructL()
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::ConstructL, 0, KLogInApi );
+    IMUM_IN();
+
+    iMtmUiDataRegistry = CMtmUiDataRegistry::NewL( iMailboxApi.MsvSession() );
+
+    IMUM_OUT();
+    }
+
+// ================ INTERFACE IMPLEMENTATION ================
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxUtilities.
+// CImumInMailboxUtilitiesImpl::DefaultMailbox()
+// ---------------------------------------------------------------------------
+//
+TMsvId CImumInMailboxUtilitiesImpl::DefaultMailboxId(
+    const TBool aForceGet ) const
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::DefaultMailboxId, 0, KLogInApi );
+    IMUM_IN();
+
+    TMsvId defaultId = KMsvUnknownServiceIndexEntryId;
+
+    //Should not leave, defaultId is just unknown
+    TRAP_IGNORE( defaultId = DefaultMailboxIdL( aForceGet ) );
+
+    IMUM1(0,"Default mailbox: 0x%x", defaultId );
+    IMUM_OUT();
+
+    return defaultId;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxUtilities.
+// CImumInMailboxUtilitiesImpl::IsMailMtm()
+// ---------------------------------------------------------------------------
+//
+TBool CImumInMailboxUtilitiesImpl::IsMailMtm(
+    const TUid& aMtm,
+    const TBool& aAllowExtended ) const
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::IsMailMtm, 0, KLogInApi );
+    IMUM_IN();
+
+    // Basic mail mtm's
+    TBool basicMtms =
+        ( aMtm == KSenduiMtmSmtpUid ) ||
+        ( aMtm == KSenduiMtmPop3Uid ) ||
+        ( aMtm == KSenduiMtmImap4Uid );
+
+    // Extended mail mtm's
+    // Check if mailbox is 3rd party mailbox.
+    TBool extendedMtms = EFalse;
+    
+    if( aAllowExtended && !basicMtms )
+    	{
+        // We donīt know 3rd party mailbox uid values so technology type
+        // is compared instead.
+    	if( iMtmUiDataRegistry->IsPresent( aMtm ) )
+    	    {
+            const TUid& technologyType =
+                iMtmUiDataRegistry->TechnologyTypeUid( aMtm );
+            extendedMtms = ( KSenduiTechnologyMailUid == technologyType );
+    	    }
+    	}
+
+    IMUM_OUT();
+
+    // Returns ETrue, if the id is any of the following
+    return basicMtms || ( aAllowExtended && extendedMtms );
+    }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxUtilities.
+// CImumInMailboxUtilitiesImpl::IsMailbox()
+// ---------------------------------------------------------------------------
+//
+TBool CImumInMailboxUtilitiesImpl::IsMailbox( const TMsvId aMailboxId ) const
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::IsMailbox, 0, KLogInApi );
+    IMUM_IN();
+
+    // First get the entry and make sure it is a service
+    TBool isMailbox = EFalse;
+    TMsvId serviceId;
+    TMsvEntry entry;
+    if ( !iMailboxApi.MsvSession().GetEntry( aMailboxId, serviceId, entry ) &&
+          entry.iType.iUid == KUidMsvServiceEntryValue )
+        {
+        // Get the technology type of the entry
+        const TUid& technologyType =
+            iMtmUiDataRegistry->TechnologyTypeUid( entry.iMtm );
+
+        // Match with mail technology type
+        isMailbox = ( KSenduiTechnologyMailUid == technologyType );
+        }
+
+    IMUM_OUT();
+
+    return isMailbox;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxUtilities.
+// CImumInMailboxUtilitiesImpl::IsMailbox()
+// ---------------------------------------------------------------------------
+//
+TBool CImumInMailboxUtilitiesImpl::IsMailbox(
+    const TMsvEntry& aEntry ) const
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::IsMailbox, 0, KLogInApi );
+    IMUM_IN();
+
+    // At first, make sure the entry is a service
+    if ( aEntry.iType.iUid == KUidMsvServiceEntryValue )
+        {
+        // Get the technology type of the entry
+        const TUid& technologyType =
+            iMtmUiDataRegistry->TechnologyTypeUid( aEntry.iMtm );
+
+        // Match with mail technology type
+        return ( KSenduiTechnologyMailUid == technologyType );
+        }
+
+    IMUM_OUT();
+
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxUtilities.
+// CImumInMailboxUtilitiesImpl::GetMailboxL()
+// ---------------------------------------------------------------------------
+//
+TMsvEntry CImumInMailboxUtilitiesImpl::GetMailboxEntryL(
+    const TMsvId aMailboxId,
+    const TImumInMboxRequest& aType,
+    const TBool aServiceCheck ) const
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::GetMailboxEntryL, 0, KLogInApi );
+    IMUM_IN();
+
+    // Get the entry based on mailbox id
+    TMsvId serviceId;
+    TMsvEntry entry;
+    User::LeaveIfError( iMailboxApi.MsvSession().GetEntry(
+        aMailboxId, serviceId, entry ) );
+
+    // Make sure the id is mailbox
+    if ( !( aServiceCheck && !IsMailbox( entry ) ) )
+        {
+        // Continue handling, if successful
+        if ( aType != ERequestCurrent )
+            {
+            TInt32 mtm = entry.iMtm.iUid;
+
+            // Get related entry, if:
+            // Mailbox type is smtp and pop3 or imap4 is wanted OR
+            // Mailbox type is pop3 or imap4 and smtp is wanted
+            if ( aType == ERequestSending && mtm != KSenduiMtmSmtpUidValue ||
+                 aType == ERequestReceiving && mtm == KSenduiMtmSmtpUidValue )
+                {
+                User::LeaveIfError( iMailboxApi.MsvSession().GetEntry(
+                    entry.iRelatedId, serviceId, entry ) );
+                }
+            }
+        }
+    else
+        {
+        User::Leave( KErrUnknown );
+        }
+
+    IMUM_OUT();
+
+    return entry;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxUtilities.
+// CImumInMailboxUtilitiesImpl::GetMailboxEntriesL()
+// ---------------------------------------------------------------------------
+//
+const TUid& CImumInMailboxUtilitiesImpl::GetMailboxEntriesL(
+    const TMsvId aMailboxId,
+    RMsvEntryArray& aEntries,
+    const TBool aResetArray ) const
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::GetMailboxEntriesL, 0, KLogInApi );
+    IMUM_IN();
+
+    // Reset the array on request
+    if ( aResetArray )
+        {
+        aEntries.Reset();
+        }
+
+    // Get the entries
+    aEntries.Append( GetMailboxEntryL( aMailboxId, ERequestReceiving ) );
+    aEntries.Append( GetMailboxEntryL( aMailboxId, ERequestSending ) );
+
+    IMUM_OUT();
+
+    // return the mtm id
+    return aEntries[0].iMtm;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxUtilities.
+// CImumInMailboxUtilitiesImpl::IsInbox()
+// ---------------------------------------------------------------------------
+//
+TBool CImumInMailboxUtilitiesImpl::IsInbox(
+    const TMsvEntry& aFolderEntry ) const
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::IsInbox, 0, KLogInApi );
+    IMUM_IN();
+
+    TBool isInbox( EFalse );
+    if ( aFolderEntry.iDetails.CompareF( KImumInImapInboxName ) == 0 )
+        {
+        // If parent is Mailbox service, then this is IMAP4 protocol inbox,
+        // otherwise it is something else...
+        TMsvId serviceId;
+        TMsvEntry entry;
+        TInt error = iMailboxApi.MsvSession().GetEntry(
+            aFolderEntry.Parent(), serviceId, entry );
+        if ( ( error == KErrNone ) && ( entry.Id() == serviceId ) )
+            {
+            isInbox = ETrue;
+            }
+        }
+
+    IMUM_OUT();
+
+    return isInbox;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxUtilities.
+// CImumInMailboxUtilitiesImpl::HasWlanConnectionL()
+// ---------------------------------------------------------------------------
+//
+TBool CImumInMailboxUtilitiesImpl::HasWlanConnectionL(
+    const TMsvId aMailboxId ) const
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::HasWlanConnectionL, 0, KLogInApi );
+    IMUM_IN();
+
+    // Connecting to WLAN accesspoint is allowed to offline mode also,
+    // so return ETrue if WLAN access point
+    TBool wlanIap = EFalse;
+
+    CEmailAccounts* account = CEmailAccounts::NewLC();
+    CImIAPPreferences* iapPreferences = CImIAPPreferences::NewLC();
+
+    TMsvId serviceId;
+    TMsvEntry mailbox;
+    TInt error = iMailboxApi.MsvSession().GetEntry( aMailboxId,
+    												serviceId,
+    												mailbox );
+
+    // In some cases the mailId is passed to this method instead of the actual mailboxId so we
+    // need to check the owningService as well.
+    CMsvEntry* owningEntry = iMailboxApi.MsvSession().GetEntryL(aMailboxId);
+    CleanupStack::PushL( owningEntry );
+    TMsvId owningService = owningEntry->OwningService();
+    CleanupStack::PopAndDestroy( owningEntry );
+
+    // Make sure that the entry belongs to mailbox
+    if ( !IsMailbox( mailbox ) )
+    	{
+    	if ( !IsMailbox( owningService ) )
+        	{
+        	IMUM0(0, "Not a mailbox");
+        	error = KErrNotSupported;
+        	}
+        }
+
+    if ( error == KErrNone )
+        {
+        IMUM0(0, "Retrieving preferences");
+        error = CImumMboxManager::GetIapPreferencesL(
+            serviceId,
+            *account,
+            *iapPreferences,
+            iMailboxApi,
+            ( mailbox.iMtm == KSenduiMtmSmtpUid ) );
+        }
+
+    if ( error == KErrNone && iapPreferences->NumberOfIAPs() )
+        {
+        IMUM0(0, "Accesspoints exist");
+        TImIAPChoice iap = iapPreferences->IAPPreference( 0 );
+
+        // Do not allow always ask
+        if ( iap.iIAP > 0 )
+            {
+            CMsvCommDbUtilities* dbUtils = CMsvCommDbUtilities::NewLC();
+
+            TRAPD( error, wlanIap = dbUtils->IsWlanAccessPointL( iap.iIAP ) );
+            // If access point item is not found, force always ask
+            if ( error )
+                {
+                CImumMboxManager::ForceAlwaysAskL(
+                    serviceId,
+                    *account,
+                    *iapPreferences,
+                    iMailboxApi,
+                    EFalse );
+                wlanIap = ETrue;
+                }
+            CleanupStack::PopAndDestroy(); // dbUtils
+            }
+        else
+            {
+            // Return ETrue for the always ask
+            wlanIap = ETrue;
+            }
+        }
+    CleanupStack::PopAndDestroy( 2, account ); // CSI: 47 # iapPreferences, account.
+
+    IMUM_OUT();
+    return wlanIap;
+    }
+
+// ----------------------------------------------------------------------------
+// From class MImumInMailboxUtilities.
+// CImumInMailboxUtilitiesImpl::HasSubscribedFoldersL()
+// ----------------------------------------------------------------------------
+//
+TBool CImumInMailboxUtilitiesImpl::HasSubscribedFoldersL(
+    const TMsvId aFolderId ) const
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::HasSubscribedFoldersL, 0, KLogInApi );
+    IMUM_IN();
+
+    // Make sure the id is receiving
+    TMsvEntry rcv = iMailboxApi.MailboxUtilitiesL().GetMailboxEntryL(
+        aFolderId,
+        MImumInMailboxUtilities::ERequestReceiving,
+        EFalse );
+
+    // Get the folder entry
+    CMsvEntry* folderEntry = iMailboxApi.MsvSession().GetEntryL( rcv.Id() );
+    CleanupStack::PushL( folderEntry );
+
+    // Subscribed folders are hidden entries before the first sync
+    TMsvSelectionOrdering order = folderEntry->SortType();
+    order.SetShowInvisibleEntries( ETrue );
+    folderEntry->SetSortTypeL( order );
+
+    TBool found( EFalse );
+
+    // Search through all the folders and locate the subscribed ones
+    const TInt count = folderEntry->Count();
+    for ( TInt loop = 0; !found && loop < count; loop++ )
+        {
+        TMsvEmailEntry mailEntry = ( *folderEntry )[ loop ];
+        if ( mailEntry.iType.iUid == KUidMsvFolderEntryValue )
+            {
+            if ( mailEntry.LocalSubscription() && !IsInbox( mailEntry ) )
+                {
+                found = ETrue;
+                }
+            else
+                {
+                // Go into the folder to search the new entry
+                found = HasSubscribedFoldersL( mailEntry.Id() );
+                }
+            }
+        }
+
+    CleanupStack::PopAndDestroy( folderEntry );
+
+    IMUM_OUT();
+
+    return found;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxUtilities.
+// CImumInMailboxUtilitiesImpl::IsAlwaysOnlineOnL()
+// ---------------------------------------------------------------------------
+//
+void CImumInMailboxUtilitiesImpl::QueryAlwaysOnlineStateL(
+    const TMsvId aMailboxId,
+    TInt64& aAlwaysOnlineStatus ) const
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::QueryAlwaysOnlineStateL, 0, KLogInApi );
+    IMUM_IN();
+
+    // Query the result from the scheduler utility
+    CImumMboxScheduler* scheduler = CImumMboxScheduler::NewLC(
+        iMailboxApi, aMailboxId );
+    aAlwaysOnlineStatus = scheduler->QueryAlwaysOnlineStateL();
+
+    // Cleanup
+    CleanupStack::PopAndDestroy( scheduler );
+    scheduler = NULL;
+
+    IMUM_OUT();
+    }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxUtilities.
+// CImumInMailboxUtilitiesImpl::NextAlwaysOnlineIntervalL()
+// ---------------------------------------------------------------------------
+//
+void CImumInMailboxUtilitiesImpl::NextAlwaysOnlineIntervalL(
+    const TMsvId aMailboxId,
+    TInt64& aAlwaysOnlineStatus,
+    TTimeIntervalSeconds& aSeconds ) const
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::NextAlwaysOnlineIntervalL, 0, KLogInApi );
+    IMUM_IN();
+
+    // Query the result from the scheduler utility
+    CImumMboxScheduler* scheduler = CImumMboxScheduler::NewLC(
+        iMailboxApi, aMailboxId );
+    aAlwaysOnlineStatus = scheduler->SecondsToNextMark( aSeconds );
+
+    // Cleanup
+    CleanupStack::PopAndDestroy( scheduler );
+    scheduler = NULL;
+
+    IMUM_OUT();
+    }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxUtilities.
+// CImumInMailboxUtilitiesImpl::DefaultMailboxIdL()
+// ---------------------------------------------------------------------------
+//
+TMsvId CImumInMailboxUtilitiesImpl::DefaultMailboxIdL(
+    const TBool aForceGet ) const
+    {
+    IMUM_CONTEXT( CImumInMailboxUtilitiesImpl::DefaultMailboxIdL, 0, KLogInApi );
+    IMUM_IN();
+
+    // The system must have default mtm for mailboxes, so find one
+    TUid defaultMtm = KSenduiMtmSmtpUid;
+
+    TMsvId defaultId = MuiuEmailTools::DefaultSendingMailboxL(
+        iMailboxApi.MsvSession(), defaultMtm );
+
+    // There's no such of thing, so force find any.
+    // This may be true in case the message store has been swapped between
+    // the phone and memorycard. Forcing default mailbox makes it possible
+    // to write and send emails without problems.
+    if ( aForceGet && defaultId == KMsvUnknownServiceIndexEntryId )
+        {
+        // Find first valid mailbox
+        iMailboxApi.MailboxServicesL().SetDefaultMailboxL( 0 );
+        defaultId = MuiuEmailTools::DefaultSendingMailboxL(
+            iMailboxApi.MsvSession(), defaultMtm );
+        }
+
+    IMUM_OUT();
+    return defaultId;
+    }
+