diff -r 000000000000 -r f979ecb2b13e meetingrequestengines/mrmailboxutils/src/cmrmailboxutilsimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequestengines/mrmailboxutils/src/cmrmailboxutilsimpl.cpp Tue Feb 02 10:12:19 2010 +0200 @@ -0,0 +1,545 @@ +/* +* Copyright (c) 2005 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: Provides methods for Meeting request mailbox utils ECom implementation. +* +*/ + + +// INCLUDES + +#include "cmrmailboxutilsimpl.h" +#include "cmrutilsmsvhelper.h" +#include "cmrutilssettingsmgr.h" +#include "cmrmailboxinfo.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// CONSTANTS + +namespace +{ + +const TInt KObserverGranularity = 1; // in most cases 0 or 1 observer +_LIT( KMailtoMatchPattern, "mailto:*" ); // this is never localized +const TInt KMailtoLength = 7; // "mailto:" length + +} + +// ========================= MEMBER FUNCTIONS ================================ + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::NewL +// Symbian two-phased constructor. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +CMRMailboxUtilsImpl* CMRMailboxUtilsImpl::NewL( CMsvSession* aMsvSession ) + { + CMRMailboxUtilsImpl* self = new( ELeave ) CMRMailboxUtilsImpl(); + CleanupStack::PushL( self ); + self->ConstructL( aMsvSession ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::CMRMailboxUtilsImpl +// Default constructor +// ---------------------------------------------------------------------------- +// +CMRMailboxUtilsImpl::CMRMailboxUtilsImpl() + : iObservers( KObserverGranularity ) + { + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::~CMRMailboxUtilsImpl +// Destructor. +// ---------------------------------------------------------------------------- +// +CMRMailboxUtilsImpl::~CMRMailboxUtilsImpl() + { + FeatureManager::UnInitializeLib(); + + iObservers.Close(); + delete iMsvHelper; + delete iSettingsMgr; + delete iCmailHandler; + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::ConstructL +// +// 2nd phase constructor. +// ---------------------------------------------------------------------------- +// +void CMRMailboxUtilsImpl::ConstructL( CMsvSession* aMsvSession ) + { + FeatureManager::InitializeLibL(); + + iSettingsMgr = CMRUtilsSettingsMgr::NewL(); + iMsvHelper = CMRUtilsMsvHelper::NewL( aMsvSession, *this ); + + if ( FeatureManager::FeatureSupported( KFeatureIdFfEmailFramework ) ) + { + // Create this only when CMail is present + _LIT8( KCMail, "CMAIL" ); + TPtrC8 cmail( KCMail ); + iCmailHandler = + CMRMBUtilsMBInfoHandler::NewL( + cmail, + *this ); + } + } + + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::GetDefaultMRMailBoxL +// ---------------------------------------------------------------------------- +// +TInt CMRMailboxUtilsImpl::GetDefaultMRMailBoxL( TMailboxInfo& aBoxInfo ) + { + aBoxInfo.iEntryId = KMsvNullIndexEntryId; + TMsvId candidateId( KMsvNullIndexEntryId ); + TInt retVal = iSettingsMgr->GetDefaultMRMailBoxL( candidateId ); + + if ( iCmailHandler ) + { + TInt cmailId; + MMRMBUtilsSettings* cmailSettings = + iCmailHandler->SettingsMgr(); + + if ( cmailSettings ) + { + cmailSettings->GetDefaultMailboxSettingsL( cmailId ); + if ( cmailId ) + { + candidateId = cmailId; + } + } + } + + if ( retVal == KErrNone ) + { + // try to read mailbox info + const CMRMailBoxInfo* info = iMsvHelper->MRMailBoxInfoL( candidateId ); + + if ( !info && iCmailHandler ) + { + // Tru getting mailbox information using extension + info = iCmailHandler->MRMailBoxInfoL( candidateId ); + } + + if ( !info ) + { + // default doesn't exist anymore, try to set another one + RArray mailBoxes; + CleanupClosePushL( mailBoxes ); + ListMailBoxesL( mailBoxes ); + + if ( mailBoxes.Count() > 0 ) + { + candidateId = mailBoxes[0].iEntryId; + if ( SetDefaultMRMailBoxL( candidateId ) == KErrNone ) + { + // setting succeeded, read data of the new default mailbox + info = iMsvHelper->MRMailBoxInfoL( candidateId ); + if ( !info && iCmailHandler ) + { + // Try getting mailbox information using extension + info = iCmailHandler->MRMailBoxInfoL( candidateId ); + } + } + } + + // mailboxes + CleanupStack::PopAndDestroy(); // codescanner::cleanup + } + + if ( info ) + { + // After all the steps we have found a valid MR mailbox, + // give it to the caller then + aBoxInfo.iName.Set( info->Name() ); + aBoxInfo.iEmailAddress.Set( info->Address() ); + aBoxInfo.iMtmUid = info->MtmUid(); + aBoxInfo.iEntryId = info->EntryId(); + } + else + { + // We only return KErrNone or KErrNotFound based on the first + // GetDefaultMRMailBoxL() check, later errors cause a leave + User::Leave( KErrGeneral ); + } + } + + return retVal; + } + + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::SetDefaultMRMailBoxL +// ---------------------------------------------------------------------------- +// +TInt CMRMailboxUtilsImpl::SetDefaultMRMailBoxL( TMsvId aDefaultBox ) + { + TInt retVal = iSettingsMgr->SetDefaultMRMailBoxL( aDefaultBox ); + + if ( iCmailHandler ) + { + const CMRMailBoxInfo* info = + iCmailHandler->MRMailBoxInfoL( aDefaultBox); + + if ( info ) + { + // This is CMAIL box + MMRMBUtilsSettings* cmailSettings = + iCmailHandler->SettingsMgr(); + + if ( cmailSettings ) + { + cmailSettings->SetDefaultMailboxSettingL( aDefaultBox ); + } + } + } + + NotifyObserversL( MMRMailboxUtilsObserver::EMRDefaultSet ); + return retVal; + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::ListMailBoxesL +// ---------------------------------------------------------------------------- +// +void CMRMailboxUtilsImpl::ListMailBoxesL( RArray& aMailBoxes ) + { + iMsvHelper->ListMRMailBoxesL( aMailBoxes ); + if ( iCmailHandler ) + { + iCmailHandler->ListMRMailBoxesL( aMailBoxes ); + } + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::GetSourceMtmUidL +// ---------------------------------------------------------------------------- +// +TInt CMRMailboxUtilsImpl::GetSourceMtmUidL( + const CCalEntry& aCalEntry, + TUid& aMtmUid ) + { + TInt retVal( KErrNotFound ); + + RArray mailboxes; + CleanupClosePushL( mailboxes ); + ListMailBoxesL( mailboxes ); + + TInt matchIndex( KErrNotFound ); + // Ownership of phone owner is not transferred: + CCalUser* owner = PhoneOwnerL( aCalEntry, mailboxes, matchIndex ); + if ( owner && KErrNotFound != matchIndex ) + { + // Array contains itself out-of-bounds check + aMtmUid = mailboxes[matchIndex].iMtmUid; // codescanner::accessArrayElementWithoutCheck2 + retVal = KErrNone; + } + + CleanupStack::PopAndDestroy(); // mailboxes + return retVal; + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::ThisAttendeeL +// ---------------------------------------------------------------------------- +// +CCalAttendee* CMRMailboxUtilsImpl::ThisAttendeeL( const CCalEntry& aCalEntry ) + { + CCalAttendee* thisAtt = NULL; + CCalUser* phoneOwner = aCalEntry.PhoneOwnerL(); // ownership not transf. + + if ( phoneOwner ) + { + RPointerArray& attendees = aCalEntry.AttendeesL(); + TInt attCount( attendees.Count() ); + for ( TInt i( 0 );i < attCount; ++i ) + { + CCalAttendee* att = attendees[i]; + if ( att && phoneOwner == att ) + { + // first match is enough: + thisAtt = att; + break; + } + } + } + return thisAtt; // ownership not transferred, may be also NULL + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::IsOrganizerL +// ---------------------------------------------------------------------------- +// +TBool CMRMailboxUtilsImpl::IsOrganizerL( const CCalEntry& aCalEntry ) + { + TBool retVal( EFalse ); + CCalUser* organizer = aCalEntry.OrganizerL(); // ownership not transf. + CCalUser* phoneOwner = aCalEntry.PhoneOwnerL(); // ownership not transf. + + if ( organizer && phoneOwner && organizer == phoneOwner ) + { + retVal = ETrue; + } + return retVal; + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::SetPhoneOwnerL +// ---------------------------------------------------------------------------- +// +TInt CMRMailboxUtilsImpl::SetPhoneOwnerL( + CCalEntry& aCalEntry, + TMsvId /*aPrimaryBox*/ ) + { + TInt retVal( KErrNone ); + CCalUser* phoneOwner = aCalEntry.PhoneOwnerL(); // ownership not transf. + + // TODO: we should optimize the lookup, by: + // prioritising the mailbox where entry received + calendar mr mailbox + // prioritising mailbox which causes last match (cache last match) + + if ( !phoneOwner ) + { + RArray mailboxes; + CleanupClosePushL( mailboxes ); + // TODO: handle aPrimaryBox! + ListMailBoxesL( mailboxes ); + + // Match email addresses to organizer + attendee list addresses: + TInt dummyIndex( -1 ); // don't care + phoneOwner = PhoneOwnerL( aCalEntry, mailboxes, dummyIndex ); + + if ( phoneOwner ) + { + aCalEntry.SetPhoneOwnerL( phoneOwner ); + } + else + { + retVal = KErrNotFound; + } + + CleanupStack::PopAndDestroy(); // mailboxes + } + return retVal; + } + +// --------------------------------------------------------- +// CMRMailboxUtilsImpl::AddressWithoutMailtoPrefix +// --------------------------------------------------------- +// +TPtrC CMRMailboxUtilsImpl::AddressWithoutMailtoPrefix( const TDesC& aAddress ) + { + TPtrC addrWithoutPrefix; + if ( aAddress.MatchF( KMailtoMatchPattern ) != KErrNotFound ) + { + addrWithoutPrefix.Set( aAddress.Mid( KMailtoLength ) ); + } + else + { + addrWithoutPrefix.Set( aAddress ); + } + return addrWithoutPrefix; + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::PhoneOwnerL +// ---------------------------------------------------------------------------- +// +CCalUser* CMRMailboxUtilsImpl::PhoneOwnerL( + const CCalEntry& aCalEntry, + const RArray& aMailBoxes, + TInt& aMatchIndex ) + { + 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& attendees = aCalEntry.AttendeesL(); + TInt attCount( attendees.Count() ); + for ( TInt i( 0 );i < attCount; ++i ) + { + CCalUser* att = attendees[i]; + if ( IsPhoneOwnerL( *att, aMailBoxes, aMatchIndex ) ) + { + return att; + } + } + + // Matching attendee was not found: + return NULL; + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::IsPhoneOwnerL +// ---------------------------------------------------------------------------- +// +TBool CMRMailboxUtilsImpl::IsPhoneOwnerL( + const CCalUser& aUser, + const RArray& aMailBoxes, + TInt& aMatchIndex ) + { + TPtrC addr = AddressWithoutMailtoPrefix( aUser.Address() ); + aMatchIndex = -1; // no match yet + TInt boxCount( aMailBoxes.Count() ); + for ( TInt i( 0 ); i < boxCount; ++i ) + { + TPtrC boxAddr = aMailBoxes[i].iEmailAddress; + if ( addr.CompareF( boxAddr ) == 0 ) + { + // first match is enough: + aMatchIndex = i; + return ETrue; + } + } + return EFalse; // no match + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::AddObserverL +// ---------------------------------------------------------------------------- +// +void CMRMailboxUtilsImpl::AddObserverL( MMRMailboxUtilsObserver& aObserver ) + { + iObservers.InsertInAddressOrderL( &aObserver ); + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::RemoveObserver +// ---------------------------------------------------------------------------- +// +void CMRMailboxUtilsImpl::RemoveObserver( MMRMailboxUtilsObserver& aObserver ) + { + TInt index = iObservers.FindInAddressOrder( &aObserver ); + if ( index != KErrNotFound ) + { + iObservers.Remove( index ); + } + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::MsvSessionL +// ---------------------------------------------------------------------------- +// +CMsvSession& CMRMailboxUtilsImpl::MsvSessionL() + { + return iMsvHelper->MsvSessionL(); + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::HandleSessionEventL +// ---------------------------------------------------------------------------- +// +void CMRMailboxUtilsImpl::HandleSessionEventL( + TMsvSessionEvent aEvent, + TAny* aArg1, + TAny* /*aArg2*/, + TAny* /*aArg3*/ ) + { + CMsvEntrySelection* entries = static_cast( aArg1 ); + switch ( aEvent ) + { + case EMsvEntriesCreated: + { + NotifyObserversL( MMRMailboxUtilsObserver::EMRMailboxCreated ); + break; + } + case EMsvEntriesChanged: + { + TMsvId defaultId; + TInt err = iSettingsMgr->GetDefaultMRMailBoxL( defaultId ); + if ( err == KErrNone && + entries->Find( defaultId ) != KErrNotFound ) + { // default changed + NotifyObserversL( MMRMailboxUtilsObserver::EMRDefaultChanged ); + } + else + { + NotifyObserversL( MMRMailboxUtilsObserver::EMRMailboxChanged ); + } + break; + } + case EMsvEntriesDeleted: + { + TMsvId defaultId; + TInt err = iSettingsMgr->GetDefaultMRMailBoxL( defaultId ); + if ( err == KErrNone && + entries->Find( defaultId ) != KErrNotFound ) + { // default deleted + NotifyObserversL( MMRMailboxUtilsObserver::EMRDefaultDeleted ); + } + else + { + NotifyObserversL( MMRMailboxUtilsObserver::EMRMailboxDeleted ); + } + break; + } + default: + { // not interested in other even types + break; + } + } + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::HandleMRMailboxEventL +// ---------------------------------------------------------------------------- +// +void CMRMailboxUtilsImpl::HandleMRMailboxEventL( + MMRMailboxUtilsObserver::TEventType aType ) + { + NotifyObserversL( aType ); + } + +// ---------------------------------------------------------------------------- +// CMRMailboxUtilsImpl::NotifyObserversL +// ---------------------------------------------------------------------------- +// +void CMRMailboxUtilsImpl::NotifyObserversL( + MMRMailboxUtilsObserver::TEventType aEvent ) + { + TInt count( iObservers.Count() ); + for ( TInt i( 0 ); i < count; ++i ) + { + TRAP_IGNORE( iObservers[i]->HandleMRMailboxEventL( aEvent ) ); + } + } + +// End of file