diff -r d189ee25cf9d -r 3533d4323edc meetingrequest/mrgui/src/cesmraddressinfohandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/src/cesmraddressinfohandler.cpp Wed Sep 01 12:28:57 2010 +0100 @@ -0,0 +1,532 @@ +/* +* Copyright (c) 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 Address info handler implementation +* +*/ + +// Includes +#include "emailtrace.h" +#include "cesmraddressinfohandler.h" + +#include +#include +#include +#include +#include +#include +#include + +//Virtual Phonebook +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cesmrdynamicitemselectionlist.h" +#include "cesmrlocationpluginhandler.h" + +namespace { //codescanner::namespace +/** + * Cleanup helpers for RPointerArrays + */ +template +class CleanupResetAndDestroy + { + +public: + + inline static void PushL( T& aRef ) + { + CleanupStack::PushL( TCleanupItem( &ResetAndDestroy, &aRef ) ); + } + +private: + inline static void ResetAndDestroy( TAny* aPtr ) + { + static_cast< T*>( aPtr )->ResetAndDestroy(); + } + }; + +template +inline void CleanupResetAndDestroyPushL( T& aRef ) + { + CleanupResetAndDestroy::PushL( aRef ); + } + +// Tabulator for address selection list formatting +_LIT( KTab, "\t" ); + +} //namespace + +// --------------------------------------------------------------------------- +// CESMRAddressInfoHandler::NewL +// --------------------------------------------------------------------------- +// +CESMRAddressInfoHandler* CESMRAddressInfoHandler::NewL() + { + FUNC_LOG; + CESMRAddressInfoHandler* self = + new (ELeave) CESMRAddressInfoHandler; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CESMRAddressInfoHandler::CESMRAddressInfoHandler +// --------------------------------------------------------------------------- +// +CESMRAddressInfoHandler::CESMRAddressInfoHandler() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CESMRAddressInfoHandler::~CESMRAddressInfoHandler +// --------------------------------------------------------------------------- +// +CESMRAddressInfoHandler::~CESMRAddressInfoHandler() + { + FUNC_LOG; + delete iWait; + delete iServiceHandler; + delete iLinksSet; + delete iLinkOperationFetch; + iAddressGeneralFields.Reset(); + iAddressHomeFields.Reset(); + iAddressWorkFields.Reset(); + + iCompleteAddresses.ResetAndDestroy(); + + iESMRStatic.Close(); + } + +// --------------------------------------------------------------------------- +// CESMRAddressInfoHandler::ConstructL +// --------------------------------------------------------------------------- +// +void CESMRAddressInfoHandler::ConstructL() + { + FUNC_LOG; + iWait = new( ELeave ) CActiveSchedulerWait; + + iESMRStatic.ConnectL(); + CESMRContactManagerHandler& contactManagerHandler = iESMRStatic.ContactManagerHandlerL(); + + iContactManager = &contactManagerHandler.GetContactManager(); + + //start service handler and add the interests of this class + iServiceHandler = CAiwServiceHandler::NewL(); + iServiceHandler->AttachL( R_CONTACT_SELECTION_INTEREST ); + + //setup contact field arrays + iAddressGeneralFields.AppendL( R_VPBK_FIELD_TYPE_ADDRLABELGEN ); + iAddressGeneralFields.AppendL( R_VPBK_FIELD_TYPE_ADDRSTREETGEN ); + iAddressGeneralFields.AppendL( R_VPBK_FIELD_TYPE_ADDRLOCALGEN ); + iAddressGeneralFields.AppendL( R_VPBK_FIELD_TYPE_ADDRCOUNTRYGEN ); + + iAddressWorkFields.AppendL( R_VPBK_FIELD_TYPE_ADDRLABELWORK ); + iAddressWorkFields.AppendL( R_VPBK_FIELD_TYPE_ADDRSTREETWORK ); + iAddressWorkFields.AppendL( R_VPBK_FIELD_TYPE_ADDRLOCALWORK ); + iAddressWorkFields.AppendL( R_VPBK_FIELD_TYPE_ADDRCOUNTRYWORK ); + + iAddressHomeFields.AppendL( R_VPBK_FIELD_TYPE_ADDRLABELHOME ); + iAddressHomeFields.AppendL( R_VPBK_FIELD_TYPE_ADDRSTREETHOME ); + iAddressHomeFields.AppendL( R_VPBK_FIELD_TYPE_ADDRLOCALHOME ); + iAddressHomeFields.AppendL( R_VPBK_FIELD_TYPE_ADDRCOUNTRYHOME ); + } + +// --------------------------------------------------------------------------- +// CESMRAddressInfoHandler::HandleNotifyL +// --------------------------------------------------------------------------- +// +TInt CESMRAddressInfoHandler::HandleNotifyL( TInt aCmdId, //codescanner::intleaves + TInt aEventId, + CAiwGenericParamList& aEventParamList, + const CAiwGenericParamList& /*aInParamList*/) + { + FUNC_LOG; + if ( iLinksSet ) + { + delete iLinksSet; + iLinksSet = NULL; + } + + if ( iLinkOperationFetch ) + { + delete iLinkOperationFetch; + iLinkOperationFetch = NULL; + } + TInt result = 0; + + if ((aCmdId == KAiwCmdSelect) && aEventId == KAiwEventCompleted ) + { + TInt index = 0; + const TAiwGenericParam* param = + aEventParamList.FindFirst(index, EGenericParamContactLinkArray); + if (param) + { + TPtrC8 contactLinks = param->Value().AsData(); + + iLinksSet = iContactManager->CreateLinksLC( contactLinks ); + CleanupStack::Pop(); //codescanner::cleanup + if ( iLinksSet->Count() ) + { + iLinkOperationFetch = iContactManager-> + RetrieveContactL( iLinksSet->At(0), *this ); + } + } + + } + else if ( aEventId == KAiwEventError ) + { + if ( iWait->IsStarted()) + { + // Stop iWait so editor dialog continues + iWait->AsyncStop(); + } + } + else if ( (aEventId == KAiwEventQueryExit) ) + { + if ( iWait->IsStarted()) + { + // Stop iWait so editor dialog continues + iWait->AsyncStop(); + } + // We don't need to check outParams, or do anything special during the exit + result = ETrue; + } + else if ( aEventId == KAiwEventOutParamCheck ) + { + // Parameters don't need to be checked + result = 1; + } + else if ( aEventId == KAiwEventCanceled ) + { + if ( iWait->IsStarted()) + { + // Stop iWait so editor dialog continues + iWait->AsyncStop(); + } + } + + return result; + } + +// --------------------------------------------------------------------------- +// CESMRAddressInfoHandler::SearchAddressFromContacts +// --------------------------------------------------------------------------- +// +TBool CESMRAddressInfoHandler::SearchAddressFromContactsL( MESMRCalEntry& aEntry ) + { + FUNC_LOG; + if( !(iWait->IsStarted()) ) + { + iEntry = &aEntry; + iEntryUpdated = EFalse; + + TUint fetchFlags = 0; + + CAiwGenericParamList& inParamList = iServiceHandler->InParamListL(); + inParamList.AppendL( + TAiwGenericParam( + EGenericParamContactSelectionData, + TAiwVariant(TAiwSingleEntrySelectionDataV2Pckg( + TAiwSingleEntrySelectionDataV2(). + SetFlags( fetchFlags ))))); + + iServiceHandler->ExecuteServiceCmdL( + KAiwCmdSelect, + inParamList, + iServiceHandler->OutParamListL(), + 0, + this); + iWait->Start(); // codescanner::callActiveObjectWithoutCheckingOrStopping + } + + return iEntryUpdated; + } + +// --------------------------------------------------------------------------- +// CESMRAddressInfoHandler::VPbkSingleContactOperationComplete +// --------------------------------------------------------------------------- +// +void CESMRAddressInfoHandler::VPbkSingleContactOperationComplete( + MVPbkContactOperationBase& aOperation, + MVPbkStoreContact* aContact ) + { + FUNC_LOG; + TRAP_IGNORE( VPbkSingleContactOperationCompleteL( aOperation, aContact ) ); + if ( iWait->IsStarted() ) + { + // Stop iWait so editor dialog continues + iWait->AsyncStop(); + } + + } + +// --------------------------------------------------------------------------- +// CESMRAddressInfoHandler::VPbkSingleContactOperationFailed +// --------------------------------------------------------------------------- +// +void CESMRAddressInfoHandler::VPbkSingleContactOperationFailed( + MVPbkContactOperationBase& /*aOperation*/, + TInt /*aError*/ ) + { + FUNC_LOG; + if ( iWait->IsStarted() ) + { + iWait->AsyncStop(); + } + } + +// --------------------------------------------------------------------------- +// CESMRAddressInfoHandler::VPbkSingleContactOperationCompleteL +// --------------------------------------------------------------------------- +// +void CESMRAddressInfoHandler::VPbkSingleContactOperationCompleteL( + MVPbkContactOperationBase& aOperation, + MVPbkStoreContact* aContact ) + { + FUNC_LOG; + if ( iLinkOperationFetch == &aOperation ) + { + CleanupDeletePushL( aContact ); + + if( iCompleteAddresses.Count() ) + { + iCompleteAddresses.ResetAndDestroy(); + } + + RPointerArray homeAddress; + CleanupResetAndDestroyPushL( homeAddress ); + RPointerArray workAddress; + CleanupResetAndDestroyPushL( workAddress ); + RPointerArray generalAddress; + CleanupResetAndDestroyPushL( generalAddress ); + + GetContactFieldsL( iAddressHomeFields, homeAddress, aContact ); + GetContactFieldsL( iAddressWorkFields, workAddress, aContact ); + GetContactFieldsL( iAddressGeneralFields, generalAddress, aContact ); + + FormatAddressL( homeAddress, EHomeAddress ); + FormatAddressL( workAddress, EWorkAddress ); + FormatAddressL( generalAddress, EGeneralAddress ); + + + + // Contact has more than one addresses, address selection + // dialog need to be shown. + if ( iCompleteAddresses.Count() > 1 ) + { + // Show address selection dialog + CESMRDynamicItemSelectionList* query = + CESMRDynamicItemSelectionList::NewL(); + CleanupStack::PushL( query ); + TInt index = + query->ExecuteL( + iCompleteAddresses, + CESMRDynamicItemSelectionList::EESMRAddressSelectionList ); + CleanupStack::PopAndDestroy( query ); + if ( index >= 0 && ( index < iCompleteAddresses.Count() ) ) + { + UpdateEntryL( index ); + } + } + + // Contact has only one address + else if ( iCompleteAddresses.Count() == 1 ) + { + UpdateEntryL( 0 ); + } + + // Contact doesn't have any address, information note is shown + else if ( iCompleteAddresses.Count() == 0 ) + { + HBufC* noAddressBuf = + StringLoader::LoadL( R_MEET_REQ_NO_ADDRESS_FOUND ); + CleanupStack::PushL( noAddressBuf ); + CAknInformationNote* infNote = + new (ELeave) CAknInformationNote(); + infNote->ExecuteLD( *noAddressBuf ); + // note will be deleted automatically + // and pointer will be set to NULL after execution + CleanupStack::PopAndDestroy( noAddressBuf ); + } + + CleanupStack::PopAndDestroy( &generalAddress ); + CleanupStack::PopAndDestroy( &workAddress ); + CleanupStack::PopAndDestroy( &homeAddress ); + + CleanupStack::PopAndDestroy( aContact ); + } + } + +// --------------------------------------------------------------------------- +// CESMRAddressInfoHandler::GetContactFieldsL +// --------------------------------------------------------------------------- +// +void CESMRAddressInfoHandler::GetContactFieldsL( RArray& aFieldIds, + RPointerArray& aNumbers, + MVPbkStoreContact* aContact) + { + FUNC_LOG; + for (TInt i = 0; i < aFieldIds.Count(); i++ ) + { + const MVPbkFieldType* myContactDataField = + iContactManager->FieldTypes().Find( aFieldIds[i] ); + + CVPbkBaseContactFieldTypeIterator* itrNumber = + CVPbkBaseContactFieldTypeIterator::NewLC( *myContactDataField, + aContact->Fields() ); + + // Iterate through each of the data fields + while ( itrNumber->HasNext() ) + { + const MVPbkBaseContactField* field = itrNumber->Next(); + + if ( (field->FieldData()).DataType() == EVPbkFieldStorageTypeText ) + { + HBufC* toAppend = MVPbkContactFieldTextData::Cast( + field->FieldData() ).Text().AllocL(); + + aNumbers.Append( toAppend ); + } + } + CleanupStack::PopAndDestroy( itrNumber ); + } + } + +// ---------------------------------------------------------------------------- +// CESMRAddressInfoHandler::FormatAddressL +// ---------------------------------------------------------------------------- +// +void CESMRAddressInfoHandler::FormatAddressL( RPointerArray& aAddresses, + CESMRAddressInfoHandler::TAddressType aAddressType ) + { + FUNC_LOG; + if ( aAddresses.Count() > 0 ) + { + HBufC* addressTitle = NULL; + switch ( aAddressType ) + { + case EHomeAddress: + { + addressTitle = StringLoader::LoadL( R_MEET_REQ_HOME_ADDRESS ); + break; + } + case EWorkAddress: + { + addressTitle = StringLoader::LoadL( R_MEET_REQ_WORK_ADDRESS ); + break; + } + case EGeneralAddress: + { + addressTitle = + StringLoader::LoadL( R_MEET_REQ_GENERAL_ADDRESS ); + break; + } + default: + { + User::Leave( KErrGeneral ); + } + } + CleanupStack::PushL( addressTitle); + + CPtrCArray* addressPtr = + new( ELeave ) CPtrCArray( aAddresses.Count()); + CleanupStack::PushL( addressPtr ); + + for (TInt i = 0; i < aAddresses.Count(); i++ ) + { + addressPtr->AppendL( aAddresses[i]->Des() ); + } + HBufC* streetAddress = NULL; + switch ( aAddresses.Count()) + { + case EFormatOneItem: + { + streetAddress = aAddresses[0]->AllocL(); + break; + } + case EFormatTwoItems: + { + streetAddress = StringLoader:: + LoadL( R_MEET_REQ_ADDRESS_FROM_CONTACTS_TWO_ITEMS, + *addressPtr ); + break; + } + case EFormatThreeItems: + { + streetAddress = StringLoader:: + LoadL( R_MEET_REQ_ADDRESS_FROM_CONTACTS_THREE_ITEMS, + *addressPtr ); + break; + } + case EFormatFourItems: + { + streetAddress = StringLoader:: + LoadL( R_MEET_REQ_ADDRESS_FROM_CONTACTS_FORMAT, + *addressPtr ); + break; + } + default: + { + User::Leave( KErrGeneral ); + } + } + + CleanupStack::PopAndDestroy( addressPtr ); + CleanupStack::PushL( streetAddress ); + streetAddress = streetAddress->ReAllocL( + streetAddress->Length() + addressTitle->Length() +1 ); + // streetAddress item before reallocation need to be + // removed from cleanupstack. + CleanupStack::Pop(); //codescanner::cleanup + CleanupStack::PushL( streetAddress ); + + + streetAddress->Des().Insert( 0, KTab ); + streetAddress->Des().Insert( 0, *addressTitle ); + iCompleteAddresses.Append( streetAddress ); + CleanupStack::Pop( streetAddress ); + CleanupStack::PopAndDestroy( addressTitle ); + } + } + +// --------------------------------------------------------------------------- +// CESMRAddressInfoHandler::UpdateEntryL +// --------------------------------------------------------------------------- +// +void CESMRAddressInfoHandler::UpdateEntryL( TInt aIndex ) + { + FUNC_LOG; + TInt offset = iCompleteAddresses[aIndex]->Find( KTab ); //codescanner::accessArrayElementWithoutCheck2 + TPtrC address( iCompleteAddresses[aIndex]->Mid( offset + 1) ); //codescanner::accessArrayElementWithoutCheck2 + TBool replaced; + iEntryUpdated = + CESMRLocationPluginHandler::UpdateEntryLocationL( + *iEntry, + address, + EFalse, + replaced ); + } + +//EOF +