diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/UIServices/src/CPbk2AiwSelectionProvider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/UIServices/src/CPbk2AiwSelectionProvider.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,525 @@ +/* +* Copyright (c) 2005-2007 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: Phonebook 2 selection service AIW provider. +* +*/ + + +#include "CPbk2AiwSelectionProvider.h" + +// Phonebook 2 +#include "CPbk2ServerAppConnection.h" +#include + +// Virtual Phonebook +#include +#include + +// System includes +#include +#include +#include +#include +#include + +// Debugging headers +#include + +/// Unnamed namespace for local definitions +namespace { + +/** + * Verifies whether the given command id is handled here. + * This should be done by AIW. + * + * @param aCmdId The command id to check. + * @return ETrue if command is handled by this provider. + */ +inline TBool IsCorrectAiwCmd( const TInt aCmdId ) + { + TBool ret = EFalse; + switch ( aCmdId ) + { + case KAiwCmdSelect: + { + ret = ETrue; + break; + } + + default: + { + // Do nothing + break; + } + } + return ret; + } + +} /// namespace + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::CPbk2AiwSelectionProvider +// -------------------------------------------------------------------------- +// +CPbk2AiwSelectionProvider::CPbk2AiwSelectionProvider() + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2AiwSelectionProvider::CPbk2AiwSelectionProvider(0x%x)"), this ); + } + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::~CPbk2AiwSelectionProvider +// -------------------------------------------------------------------------- +// +CPbk2AiwSelectionProvider::~CPbk2AiwSelectionProvider() + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2AiwSelectionProvider::~CPbk2AiwSelectionProvider(0x%x)"), this ); + delete iConnection; + delete iEventParamList; + delete iConfigurationPackage; + delete iInstructionsPackage; + delete iContactViewFilterBuffer; + delete iDefaultPrioritiesBuffer; + } + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::NewL +// -------------------------------------------------------------------------- +// +CPbk2AiwSelectionProvider* CPbk2AiwSelectionProvider::NewL() + { + CPbk2AiwSelectionProvider* self = + new ( ELeave ) CPbk2AiwSelectionProvider; + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::InitialiseL +// -------------------------------------------------------------------------- +// +void CPbk2AiwSelectionProvider::InitialiseL + ( MAiwNotifyCallback& /*aFrameworkCallback*/, + const RCriteriaArray& /*aInterest*/ ) + { + // Nothing needs to be done + } + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::HandleServiceCmdL +// -------------------------------------------------------------------------- +// +void CPbk2AiwSelectionProvider::HandleServiceCmdL + ( const TInt& aCmdId, const CAiwGenericParamList& aInParamList, + CAiwGenericParamList& /*aOutParamList*/, TUint aCmdOptions /*= 0*/, + const MAiwNotifyCallback* aCallback /* = NULL*/ ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2AiwSelectionProvider::HandleServiceCmdL(0x%x)"), this ); + if ( IsCorrectAiwCmd( aCmdId ) ) + { + if ( !aCallback ) + { + // The callback is mandatory + User::Leave( KErrArgument ); + } + + if ( !iConnection ) + { + iConnection = CPbk2ServerAppConnection::NewL( *this ); + } + else if( iConnection->IsActive() ) + { + + if ( aCmdOptions & KAiwOptCancel ) + { + // Client wants to cancel existing service + iConnection->CancelFetch(); + } + + // Request is already active for the same client, do nothing + // as Phonebook supports only one request per client at a time. + return; + } + + iCallback = aCallback; + iInParamList = &aInParamList; + + if ( !iEventParamList ) + { + iEventParamList = CAiwGenericParamList::NewL(); + } + + CreateInstructionPackageL( aInParamList ); + ValidateInstructionPackageL(); + CreateConfigurationPackageL( aInParamList ); + + // Launch + iConnection->LaunchFetchL + ( iConfigurationPackage, iInstructionsPackage ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::OperationCompleteL +// -------------------------------------------------------------------------- +// +void CPbk2AiwSelectionProvider::OperationCompleteL + ( const TDesC8& aContactLinks, TInt /*aExtraResultData*/, + const TDesC& aField ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2AiwSelectionProvider::OperationCompleteL(0x%x)"), this ); + iEventParamList->Reset(); + iEventParamList->AppendL( + TAiwGenericParam( EGenericParamContactLinkArray, + TAiwVariant( aContactLinks ) ) ); + + iEventParamList->AppendL( + TAiwGenericParam( EGenericParamContactFieldData, + TAiwVariant( aField ) ) ); + + if ( iCallback ) + { + // Must cast this because of AIW bug + const_cast( iCallback )->HandleNotifyL + ( KAiwCmdSelect, KAiwEventCompleted, *iEventParamList, + *iInParamList ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::OperationCanceledL +// -------------------------------------------------------------------------- +// +void CPbk2AiwSelectionProvider::OperationCanceledL() + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2AiwSelectionProvider::OperationCanceledL(0x%x)"), this ); + iEventParamList->Reset(); + + // Must cast this because of AIW bug + const_cast( iCallback )->HandleNotifyL + ( KAiwCmdSelect, KAiwEventCanceled, *iEventParamList, + *iInParamList ); + } + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::OperationErrorL +// -------------------------------------------------------------------------- +// +void CPbk2AiwSelectionProvider::OperationErrorL( TInt aError ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2AiwSelectionProvider::OperationErrorL(0x%x, %d)"), this, aError ); + iEventParamList->Reset(); + iEventParamList->AppendL( + TAiwGenericParam( EGenericParamError, + TAiwVariant( aError ) ) ); + + // Must cast this because of AIW bug + const_cast( iCallback )->HandleNotifyL + ( KAiwCmdSelect, KAiwEventError, *iEventParamList, + *iInParamList ); + } + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::OkToExitL +// -------------------------------------------------------------------------- +// +TBool CPbk2AiwSelectionProvider::OkToExitL + ( TInt /*aCommandId*/, TPbk2ExitCommandParams aExitParameter ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2AiwSelectionProvider::OkToExitL(0x%x)"), this ); + TBool okToExit = ETrue; + + iEventParamList->Reset(); + iEventParamList->AppendL( + TAiwGenericParam( EGenericParamApplication, + TAiwVariant( aExitParameter ) ) ); + + // Must cast this because of AIW design error + okToExit = const_cast( iCallback ) + ->HandleNotifyL( KAiwCmdSelect, KAiwEventQueryExit, + *iEventParamList, *iInParamList ); + + return okToExit; + } + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::AcceptSelectionL +// -------------------------------------------------------------------------- +// +TBool CPbk2AiwSelectionProvider::AcceptSelectionL + ( TInt aNumberOfSelectedContacts, HBufC8& /*aContactLink*/ ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2AiwSelectionProvider::AcceptSelectionL(0x%x)"), this ); + iEventParamList->Reset(); + iEventParamList->AppendL( + TAiwGenericParam( EGenericParamSelectedCount, + TAiwVariant(aNumberOfSelectedContacts ) ) ); + TBool acceptOutput = const_cast(iCallback)-> + HandleNotifyL( KAiwCmdSelect, KAiwEventOutParamCheck, + *iEventParamList, *iInParamList ); + + return acceptOutput; + } + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::PackParameterToBufferL +// -------------------------------------------------------------------------- +// +HBufC8* CPbk2AiwSelectionProvider::PackParameterToBufferL + ( TGenericParamId aParamId, + const CAiwGenericParamList& aInParamList) const + { + HBufC8* result = NULL; + + TInt paramIndex = 0; + const TAiwGenericParam* paramData = + aInParamList.FindFirst( paramIndex, aParamId ); + + if ( paramData && paramData->Value().AsData().Ptr() ) + { + result = paramData->Value().AsData().AllocL(); + } + else if ( paramData && paramData->Value().AsDes().Ptr() ) + { + // Data was given as 16-bit, transform it into 8-bit + const TInt size( paramData->Value().AsDes().Size() ); + result = HBufC8::NewL( size ); + result->Des().Copy( paramData->Value().AsDes() ); + } + + return result; + } + + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::CreateConfigurationPackageL +// -------------------------------------------------------------------------- +// +void CPbk2AiwSelectionProvider::CreateConfigurationPackageL + ( const CAiwGenericParamList& aInParamList ) + { + // Store URIs + HBufC8* storeUriBuffer = PackParameterToBufferL + ( EGenericParamContactStoreUriArray, aInParamList ); + CleanupStack::PushL( storeUriBuffer ); + + // Contact links + HBufC8* linkBuffer = PackParameterToBufferL + ( EGenericParamContactLinkArray, aInParamList ); + CleanupStack::PushL( linkBuffer ); + + // Title pane + HBufC* titlePaneText = ClientTitlePaneL(); + CleanupStack::PushL( titlePaneText ); + + // Default priorities and contact view filter buffers are + // allready created elsewhere + + TInt length = Pbk2IPCPackage::CountPackageSize( storeUriBuffer ); + length += Pbk2IPCPackage::CountPackageSize( linkBuffer ); + length += Pbk2IPCPackage::CountPackageSize( iDefaultPrioritiesBuffer ); + length += Pbk2IPCPackage::CountPackageSize( iContactViewFilterBuffer ); + length += Pbk2IPCPackage::CountPackageSize( titlePaneText ); + + delete iConfigurationPackage; + iConfigurationPackage = NULL; + iConfigurationPackage = HBufC8::NewL( length ); + TPtr8 bufferPtr( iConfigurationPackage->Des() ); + + RDesWriteStream writeStream( bufferPtr ); + writeStream.PushL(); + Pbk2IPCPackage::ExternalizeL( storeUriBuffer, writeStream ); + Pbk2IPCPackage::ExternalizeL( linkBuffer, writeStream ); + Pbk2IPCPackage::ExternalizeL( iDefaultPrioritiesBuffer, writeStream ); + Pbk2IPCPackage::ExternalizeL( iContactViewFilterBuffer, writeStream ); + Pbk2IPCPackage::ExternalizeL( titlePaneText, writeStream ); + writeStream.CommitL(); + + CleanupStack::PopAndDestroy( &writeStream ); + CleanupStack::PopAndDestroy( 3 ); // titlePaneText, linkBuffer, + // storeUriBuffer + } + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::CreateInstructionPackageL +// -------------------------------------------------------------------------- +// +void CPbk2AiwSelectionProvider::CreateInstructionPackageL + ( const CAiwGenericParamList& aInParamList ) + { + delete iInstructionsPackage; + iInstructionsPackage = NULL; + iInstructionsPackage = PackParameterToBufferL + ( EGenericParamContactSelectionData, aInParamList ); + } + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::ValidateInstructionPackageL +// -------------------------------------------------------------------------- +// +void CPbk2AiwSelectionProvider::ValidateInstructionPackageL() + { + TInt version = KErrNotFound; + RVPbkContactFieldDefaultPriorities* priorities = NULL; + CVPbkFieldTypeSelector* viewFilter = NULL; + + if ( iInstructionsPackage ) + { + // Version check + version = TAiwContactSelectionDataBase:: + SelectionDataTypeFromBuffer( *iInstructionsPackage ); + if ( version == EAiwContactSelectionDataTypeNotDefined ) + { + User::Leave( KErrArgument ); + } + + switch ( version ) + { + case EAiwSingleItemSelectionV1: + { + TAiwSingleItemSelectionDataV1Pckg data; + data.Copy( iInstructionsPackage->Ptr(), + sizeof( TAiwSingleItemSelectionDataV1 ) ); + + priorities = data().DefaultPriorities(); + break; + } + + case EAiwSingleItemSelectionV2: + { + TAiwSingleItemSelectionDataV2Pckg data; + data.Copy( iInstructionsPackage->Ptr(), + sizeof( TAiwSingleItemSelectionDataV2 ) ); + + priorities = data().DefaultPriorities(); + break; + } + case EAiwSingleItemSelectionV3: + { + TAiwSingleItemSelectionDataV3Pckg data; + data.Copy( iInstructionsPackage->Ptr(), + sizeof( TAiwSingleItemSelectionDataV3 ) ); + + priorities = data().DefaultPriorities(); + viewFilter = data().FetchFilter(); + break; + } + case EAiwSingleEntrySelectionV1: + { + TAiwSingleEntrySelectionDataV1Pckg data; + data.Copy( iInstructionsPackage->Ptr(), + sizeof( TAiwSingleEntrySelectionDataV1 ) ); + break; + } + case EAiwSingleEntrySelectionV2: + { + TAiwSingleEntrySelectionDataV2Pckg data; + data.Copy( iInstructionsPackage->Ptr(), + sizeof( TAiwSingleEntrySelectionDataV2 ) ); + + viewFilter = data().FetchFilter(); + break; + } + case EAiwMultipleEntrySelectionV1: + { + TAiwMultipleEntrySelectionDataV1Pckg data; + data.Copy( iInstructionsPackage->Ptr(), + sizeof( TAiwMultipleEntrySelectionDataV1 ) ); + break; + } + case EAiwMultipleEntrySelectionV2: + { + TAiwMultipleEntrySelectionDataV2Pckg data; + data.Copy( iInstructionsPackage->Ptr(), + sizeof( TAiwMultipleEntrySelectionDataV2 ) ); + + viewFilter = data().FetchFilter(); + break; + } + case EAiwMultipleItemSelectionV1: + { + TAiwMultipleItemSelectionDataV1Pckg data; + data.Copy( iInstructionsPackage->Ptr(), + sizeof( TAiwMultipleItemSelectionDataV1 ) ); + + priorities = data().DefaultPriorities(); + viewFilter = data().FetchFilter(); + break; + } + default: + { + User::Leave( KErrArgument ); + break; + } + } + } + else + { + // Perform default fetch + TAiwMultipleEntrySelectionDataV1 data; + TAiwMultipleEntrySelectionDataV1Pckg dataPckg( data ); + iInstructionsPackage = dataPckg.AllocL(); + } + + delete iDefaultPrioritiesBuffer; + iDefaultPrioritiesBuffer = NULL; + if ( priorities ) + { + iDefaultPrioritiesBuffer = priorities->ExternalizeLC(); + CleanupStack::Pop(); // iDefaultPrioritiesBuffer + } + + delete iContactViewFilterBuffer; + iContactViewFilterBuffer = NULL; + if ( viewFilter ) + { + iContactViewFilterBuffer = viewFilter->ExternalizeLC(); + CleanupStack::Pop(); // iContactViewFilterBuffer + } + } + +// -------------------------------------------------------------------------- +// CPbk2AiwSelectionProvider::ClientTitlePaneL +// -------------------------------------------------------------------------- +// +HBufC* CPbk2AiwSelectionProvider::ClientTitlePaneL() + { + HBufC* result = NULL; + + CEikStatusPane* statusPane = + CEikonEnv::Static()->AppUiFactory()->StatusPane(); + + if ( statusPane && + statusPane->PaneCapabilities( + TUid::Uid( EEikStatusPaneUidTitle ) ).IsPresent() ) + { + CAknTitlePane* titlePane = static_cast( statusPane-> + ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + + if ( titlePane->Text() ) + { + result = titlePane->Text()->AllocL(); + } + } + + return result; + } + +// End of File