meetingrequest/mrentry/src/cesmrfsmailboxutils.cpp
changeset 0 8466d47a6819
child 8 e1b6206813b4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrentry/src/cesmrfsmailboxutils.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,402 @@
+/*
+* Copyright (c) 2007-2009 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:  ESMR FS mailbox utilities implementation
+*
+*/
+
+
+#include "emailtrace.h"
+#include "cesmrfsmailboxutils.h"
+#include "esmrhelper.h"
+#include "esmrinternaluid.h"
+
+#include <calentry.h>
+#include "CFSMailClient.h"
+#include "CFSMailBox.h"
+#include <caluser.h>
+
+// Unnamed namespace for local definitions
+namespace {
+
+// Definition for email address comparison
+const TInt KEqualEmailAddress( 0 );
+
+// ---------------------------------------------------------------------------
+// Cleanup operation for RPointerArray.
+// @param aArray Pointer to RPointerArray.
+// ---------------------------------------------------------------------------
+//
+void MailboxPointerArrayCleanup( TAny* aArray )
+    {
+    RPointerArray<CFSMailBox>* entryArray =
+        static_cast<RPointerArray<CFSMailBox>*>( aArray );
+
+    entryArray->ResetAndDestroy();
+    entryArray->Close();
+    }
+
+/**
+ * Listes all FS mailboxes. On return aMailboxes contains FS mailboxes
+ * @param aMailClient FS mail client
+ * @aMailboxes Reference to mailboxes
+ */
+void ListMailBoxesL(
+        CFSMailClient& aMailClient,
+        RPointerArray<CFSMailBox>& aMailboxes )
+    {
+    TFSMailMsgId msgId;
+    aMailClient.ListMailBoxes(
+            msgId,
+            aMailboxes );
+    }
+}
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRFsMailboxUtils::CESMRFsMailboxUtils
+// ---------------------------------------------------------------------------
+//
+inline CESMRFsMailboxUtils::CESMRFsMailboxUtils(
+        CMRMailboxUtils& aMailboxUtils )
+:   iMRMailboxUtils( aMailboxUtils )
+    {
+    FUNC_LOG;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRFsMailboxUtils::~CESMRFsMailboxUtils
+// ---------------------------------------------------------------------------
+//
+CESMRFsMailboxUtils::~CESMRFsMailboxUtils()
+    {
+    FUNC_LOG;
+    if ( iMailClient )
+        {
+        iMailClient->Close();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRFsMailboxUtils::NewL
+// ---------------------------------------------------------------------------
+//
+CESMRFsMailboxUtils* CESMRFsMailboxUtils::NewL(
+            CMRMailboxUtils& aMailboxUtils )
+    {
+    FUNC_LOG;
+    CESMRFsMailboxUtils* self =
+            new (ELeave) CESMRFsMailboxUtils( aMailboxUtils );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRFsMailboxUtils::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CESMRFsMailboxUtils::ConstructL()
+    {
+    FUNC_LOG;
+    // Do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRFsMailboxUtils::SetPhoneOwnerL
+// ---------------------------------------------------------------------------
+//
+TInt CESMRFsMailboxUtils::SetPhoneOwnerL(
+            CCalEntry& aCalEntry,
+            TMsvId aPrimaryBox )
+    {
+    FUNC_LOG;
+    TInt err( iMRMailboxUtils.SetPhoneOwnerL( aCalEntry, aPrimaryBox ) );
+
+    // Check that phone owner was set correctly
+    if ( err == KErrNotFound )
+        {
+        // Check if phone owner can be set using FS mailboxes
+        // Loop throug all mailboxes in this plug-in
+        RPointerArray<CFSMailBox> mailboxes;
+        CleanupStack::PushL(
+                TCleanupItem(
+                        MailboxPointerArrayCleanup,
+                        &mailboxes    ) );
+
+        ListMailBoxesL(
+                MailClientL(),
+                mailboxes );
+
+        TInt dummyIndex( -1 ); // don't care
+        CCalUser* phoneOwner = PhoneOwnerL( aCalEntry, mailboxes, dummyIndex );
+
+        if ( phoneOwner )
+            {
+            aCalEntry.SetPhoneOwnerL( phoneOwner );
+            err = KErrNone;
+            }
+        CleanupStack::PopAndDestroy( &mailboxes );
+        }
+    return err;
+    }
+
+// ----------------------------------------------------------------------------
+// CESMRFsMailboxUtils::SetPhoneOwnerL
+// ----------------------------------------------------------------------------
+//
+TInt CESMRFsMailboxUtils::SetPhoneOwnerL(
+    CCalEntry& aCalEntry,
+    CFSMailClient& aMailClient,
+    CFSMailMessage& aMailMessage )
+    {
+    FUNC_LOG;
+    TInt err( KErrNotFound );
+    
+    TFSMailMsgId mailboxId( aMailMessage.GetMailBoxId() );
+    CFSMailBox* mailbox = aMailClient.GetMailBoxByUidL( mailboxId );
+
+    if ( !mailbox )
+        {
+        return KErrNotFound;
+        }
+    
+    CleanupStack::PushL( mailbox );
+
+    TPtrC mailboxOwnerAddName(
+            mailbox->OwnMailAddress().GetEmailAddress() );
+    
+    CCalUser* po = NULL;
+    CCalUser* organizer = aCalEntry.OrganizerL();
+
+    if ( organizer &&  
+         KEqualEmailAddress == organizer->Address().CompareF(mailboxOwnerAddName) )
+        {
+        po = organizer;
+        }
+    else
+        {
+        RPointerArray<CCalAttendee>& attendees = aCalEntry.AttendeesL();
+        TInt attendeeCount( attendees.Count() );
+
+        for( TInt i(0); i < attendeeCount && !po; ++i )
+            {
+            CCalAttendee* attendee = attendees[i];
+            TPtrC attendeeAddr( attendee->Address() );
+            if ( KEqualEmailAddress == attendeeAddr.CompareF(mailboxOwnerAddName) )
+                {
+                po = attendee;
+                }
+            }
+        }    
+    
+    if ( po )
+        {
+        aCalEntry.SetPhoneOwnerL( po );
+        err = KErrNone;
+        }
+    
+    CleanupStack::PopAndDestroy( mailbox );
+    
+    return err;
+    }
+
+// ----------------------------------------------------------------------------
+// CESMRFsMailboxUtils::FSEmailPluginForEntryL
+// ----------------------------------------------------------------------------
+//
+TESMRMailPlugin CESMRFsMailboxUtils::FSEmailPluginForEntryL( 
+        const CCalEntry& aEntry )
+    {
+    FUNC_LOG;
+    RPointerArray<CFSMailBox> mailboxes;
+    CleanupStack::PushL(
+            TCleanupItem(
+                    MailboxPointerArrayCleanup,
+                    &mailboxes    ) );
+
+    ListMailBoxesL(
+            MailClientL(),
+            mailboxes );    
+    
+    CCalUser* phoneOwner = aEntry.PhoneOwnerL();
+    TPtrC poMailAddress( phoneOwner->Address() );
+    
+    CFSMailBox* fsEmailMailbox = NULL;
+    TInt mailboxCount( mailboxes.Count() );
+    for (TInt j(0); j < mailboxCount && !fsEmailMailbox; ++j )
+        {        
+        TPtrC mailboxOwnerAddName(
+                mailboxes[j]->OwnMailAddress().GetEmailAddress() );
+        
+        if ( KEqualEmailAddress == mailboxOwnerAddName.CompareF(poMailAddress) )
+            {
+            // Correct mailbox is found
+            fsEmailMailbox = mailboxes[j];
+            }
+        }    
+    
+    TESMRMailPlugin plugin( EESMRUnknownPlugin );
+    
+    if ( fsEmailMailbox )
+        {
+        // Mailbox was found --> We need to resolve mailboxes plug-in
+        TFSMailMsgId mailboxId( fsEmailMailbox->GetId( ) );
+        TUid pluginId( mailboxId.PluginId() );
+
+        if ( TUid::Uid( KEasFreestylePlugin ) == pluginId )
+            {
+            plugin = EESMRActiveSync;
+            }
+        else if ( TUid::Uid( KIntellisync ) == pluginId )
+            {
+            plugin = EESMRIntelliSync;
+            }
+        else if ( TUid::Uid( KFSEmailPop3 ) == pluginId ||
+                TUid::Uid( KFSEmailImap4 ) == pluginId )
+            {
+            plugin = EESMRImapPop;
+            }        
+        }
+    
+    CleanupStack::PopAndDestroy( &mailboxes );    
+    return plugin;
+    }
+
+// ----------------------------------------------------------------------------
+// CESMRFsMailboxUtils::FSEmailMailBoxForEntryL
+// ----------------------------------------------------------------------------
+//
+TFSMailMsgId CESMRFsMailboxUtils::FSEmailMailBoxForEntryL( 
+        const CCalEntry& aEntry )
+    {
+    FUNC_LOG;
+    RPointerArray<CFSMailBox> mailboxes;
+    CleanupStack::PushL(
+            TCleanupItem( MailboxPointerArrayCleanup, &mailboxes ) );
+
+    ListMailBoxesL( MailClientL(), mailboxes );    
+    
+    CCalUser* phoneOwner = aEntry.PhoneOwnerL();
+    TPtrC poMailAddress( phoneOwner->Address() );
+    
+    CFSMailBox* fsEmailMailbox = NULL;
+    TInt mailboxCount( mailboxes.Count() );
+    for (TInt j(0); j < mailboxCount && !fsEmailMailbox; ++j )
+        {        
+        TPtrC mailboxOwnerAddName(
+                mailboxes[j]->OwnMailAddress().GetEmailAddress() );
+        
+        if ( KEqualEmailAddress == 
+             mailboxOwnerAddName.CompareF( poMailAddress ) )
+            {
+            // Correct mailbox is found
+            fsEmailMailbox = mailboxes[j];
+            }
+        }
+    
+    TFSMailMsgId retVal; // default ctor constructs a null id.
+    
+    if ( fsEmailMailbox )
+        {
+        retVal = fsEmailMailbox->GetId();
+        }
+
+    CleanupStack::PopAndDestroy( &mailboxes );
+    return retVal;
+    }
+
+// ----------------------------------------------------------------------------
+// CESMRFsMailboxUtils::PhoneOwnerL
+// ----------------------------------------------------------------------------
+//
+CCalUser* CESMRFsMailboxUtils::PhoneOwnerL(
+    const CCalEntry& aCalEntry,
+    const RPointerArray<CFSMailBox>& aMailBoxes,
+    TInt& aMatchIndex )
+    {
+    FUNC_LOG;
+    aMatchIndex = -1; // no match yet
+
+    // 1. test if phone owner is organizer:
+    CCalUser* organizer = aCalEntry.OrganizerL(); // ownership not transf.
+    if ( organizer )
+        {
+        if ( IsPhoneOwnerL( *organizer, aMailBoxes, aMatchIndex ) )
+            {
+            return organizer;
+            }
+        }
+
+    // 2. test if phone owner is attendee:
+    RPointerArray<CCalAttendee>& attendees = aCalEntry.AttendeesL();
+    TInt attCount( attendees.Count() );
+    for ( TInt i( 0 );i < attCount; ++i )
+        {
+        CCalUser* att = static_cast<CCalUser*>(attendees[i]);
+        if ( IsPhoneOwnerL( *att, aMailBoxes, aMatchIndex ) )
+            {
+            return att;
+            }
+        }
+
+    // Matching attendee was not found:
+    return NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// CESMRFsMailboxUtils::IsPhoneOwnerL
+// ----------------------------------------------------------------------------
+//
+TBool CESMRFsMailboxUtils::IsPhoneOwnerL(
+    const CCalUser& aUser,
+    const RPointerArray<CFSMailBox>& aMailBoxes,
+    TInt& aMatchIndex )
+    {
+    FUNC_LOG;
+    TPtrC addr = ESMRHelper::AddressWithoutMailtoPrefix( aUser.Address() );
+    aMatchIndex = -1; // no match yet
+    TInt boxCount( aMailBoxes.Count() );
+    for ( TInt i( 0 ); i < boxCount; ++i )
+        {
+        TPtrC mailboxOwnerAddName(
+                aMailBoxes[i]->OwnMailAddress().GetEmailAddress() );
+
+        if ( addr.CompareF( mailboxOwnerAddName ) == KEqualEmailAddress )
+            {
+            // first match is enough:
+            aMatchIndex = i;
+            return ETrue;
+            }
+        }
+    return EFalse; // no match
+    }
+
+// ----------------------------------------------------------------------------
+// CESMRFsMailboxUtils::MailClientL
+// ----------------------------------------------------------------------------
+//
+CFSMailClient& CESMRFsMailboxUtils::MailClientL()
+    {
+    FUNC_LOG;
+    if ( !iMailClient )
+        {
+        iMailClient = CFSMailClient::NewL();
+        }
+    return *iMailClient;
+    }
+
+// EOF
+