diff -r 000000000000 -r 094583676ce7 PECengine/AttributeLibrary2/SrcTransactions/CPEngAttributeFetchHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/AttributeLibrary2/SrcTransactions/CPEngAttributeFetchHandler.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,370 @@ +/* +* Copyright (c) 2004 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: Attribute fetch handler. +* +*/ + +// INCLUDE FILES +#include "CPEngAttributeFetchHandler.h" +#include "MPEngAttrFetchProcessor.h" +#include "MPEngPresenceAttrManager.h" +#include "MPEngPresenceAdvancedAttrModel2.h" +#include "CPEngTransactionStatus.h" + +#include "PresenceDebugPrint.h" +#include +#include +#include + + + + + +//LOCAL constants +namespace + { + /** + * Granularity for array of fetched presence ids. + * Usually there is just few fetched presence id's + * at time. + */ + const TInt KPEngFetchPresIdGranurality = 5; + + //Panic + _LIT( KPEngAttrFetchHandlerPanic, "PEngAtFeHand" ); + + //Panic reasons + enum TPEngAttrFetchHandlerPanicReasons + { + EFetchHandlerInUse + }; + + void PEngAttrFetchHandlerPanic( TPEngAttrFetchHandlerPanicReasons aPanicReason ) + { + User::Panic( KPEngAttrFetchHandlerPanic, aPanicReason ); + } + } + + + +// ============================ MEMBER FUNCTIONS =============================== +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngAttributeFetchHandler* CPEngAttributeFetchHandler::NewLC( MPEngPresenceAttrManager& aAttrManager, + const TDesC& aDomain, + const TDesC16& aData, + TInt aTransactionOperation, + TPEngWVCspVersion aCspVersion ) + { + CPEngAttributeFetchHandler* self = new ( ELeave ) CPEngAttributeFetchHandler( + aAttrManager, + aTransactionOperation ); + + CleanupStack::PushL( self ); + self->ConstructL( aDomain, aCspVersion, aData ); + return self; + } + + +// Destructor +CPEngAttributeFetchHandler::~CPEngAttributeFetchHandler() + { + Cancel(); + delete iFetchedProcessor; + iResultModels.ResetAndDestroy(); + delete iResultStatus; + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::CPEngAttributeFetchHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPEngAttributeFetchHandler::CPEngAttributeFetchHandler( MPEngPresenceAttrManager& aAttrManager, + TInt aTransactionOperation ) + : CActive( CActive::EPriorityIdle ), //Do parsing in low priority + iAttributeManager( aAttrManager ), + iTransactionOperation( aTransactionOperation ) + { + CActiveScheduler::Add( this ); + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::ConstructL() +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPEngAttributeFetchHandler::ConstructL( const TDesC& aDomain, + TPEngWVCspVersion aCspVersion, + const TDesC16& aData ) + { + iResultStatus = CPEngTransactionStatus::NewL(); + + RArray< TUint32 > attributes; + CleanupClosePushL( attributes ); + + CDesC16ArraySeg* presenceIds = new ( ELeave ) CDesC16ArraySeg( + KPEngFetchPresIdGranurality ); + CleanupStack::PushL( presenceIds ); + + iAttributeManager.UnpackFetchRequestL( aData, + *presenceIds, + attributes ); + + iFetchedProcessor = CreateAttrFetchProcessorL( iAttributeManager, + *presenceIds, + attributes.Array(), + aDomain, + iTransactionOperation, + aCspVersion ); + + CleanupStack::PopAndDestroy( presenceIds ); + CleanupStack::PopAndDestroy(); //attributes + } + + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::RequestL() +// From MPEngOutgoingTransactionHandler +// ----------------------------------------------------------------------------- +// +void CPEngAttributeFetchHandler::RequestL( TDes8& aSendBuffer ) + { + PENG_DP_TXT( "CPEngAttributeFetchHandler::RequestL()" ); + + aSendBuffer.Zero(); + iFetchedProcessor->GenerateRequestL( aSendBuffer ); + + PENG_DP_TXT( "CPEngAttributeFetchHandler::RequestL() - Done" ); + } + + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::LastRunningTransactionHandler() +// From MPEngOutgoingTransactionHandler +// ----------------------------------------------------------------------------- +// +void CPEngAttributeFetchHandler::LastRunningTransactionHandler() + { + PENG_DP_TXT( "CPEngAttributeFetchHandler::LastRunningTransactionHandler()" ); + //nothing to do + } + + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::ProcessResponseL() +// From MPEngOutgoingTransactionHandler +// ----------------------------------------------------------------------------- +// +void CPEngAttributeFetchHandler::ProcessResponseL( const TDesC8& aResponse, + TRequestStatus& /*aStatus*/ ) + + { + PENG_DP_TXT( "CPEngAttributeFetchHandler::ProcessResponseL()" ); + + __ASSERT_ALWAYS( !iRequest, + PEngAttrFetchHandlerPanic( EFetchHandlerInUse ) ); + + + // Initialize the response parsing + // Will leave if response is corrupted + iFetchedProcessor->InitResponseProcessingL( aResponse, + iResultModels, + *iResultStatus ); + + //Temporary solution to do response handling synchronously + while ( iFetchedProcessor->ProcessStepL() ) + { + } + + if ( iTransactionOperation == EPEngTransOpAttributeFetchToObjects ) + { + PENG_DP_TXT( "CPEngAttributeFetchHandler::ProcessResponseL() - parsing done. Streaming result models to objects." ); + + HBufC16* dataResult = iAttributeManager.PackModelArrayL( iResultModels ); + CleanupStack::PushL( dataResult ); + iResultStatus->AddDataResultL( iTransactionOperation, dataResult ); + CleanupStack::Pop( dataResult ); + } + else + { + PENG_DP_TXT( "CPEngAttributeFetchHandler::ProcessResponseL() - parsing done. Storing result models to cache." ); + + iAttributeManager.ForceStoreBatchL( iResultModels ); + } + + + //And start asynchronous processing + /* + iRequest = &aStatus; + *iRequest = KRequestPending; + IssueNewRound(); + */ + + PENG_DP_TXT( "CPEngAttributeFetchHandler::ProcessResponseL() - Done" ); + } + + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::CancelProcessing() +// From MPEngOutgoingTransactionHandler +// ----------------------------------------------------------------------------- +// +void CPEngAttributeFetchHandler::CancelProcessing() + { + PENG_DP_TXT( "CPEngAttributeFetchHandler::CancelProcessing()" ); + Cancel(); + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::NewTransactionHandlersL() +// From MPEngOutgoingTransactionHandler +// ----------------------------------------------------------------------------- +// +void CPEngAttributeFetchHandler::NewTransactionHandlersL( + RPointerArray& /*aHandlers*/ ) + { + PENG_DP_TXT( "CPEngAttributeFetchHandler::NewTransactionHandlersL()" ); + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::TransactionCompleted() +// From MPEngOutgoingTransactionHandler +// ----------------------------------------------------------------------------- +// +TBool CPEngAttributeFetchHandler::TransactionCompleted() + { + PENG_DP_TXT( "CPEngAttributeFetchHandler::TransactionCompleted()" ); + return ETrue; + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::TransactionResult() +// From MPEngOutgoingTransactionHandler +// ----------------------------------------------------------------------------- +// +CPEngTransactionStatus* CPEngAttributeFetchHandler::TransactionResult() + { + PENG_DP_TXT( "CPEngAttributeFetchHandler::TransactionResult()" ); + + CPEngTransactionStatus* tmp = iResultStatus; + iResultStatus = NULL; + return tmp; + } + + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::ReleaseHandler() +// From MPEngOutgoingTransactionHandler +// ----------------------------------------------------------------------------- +// +void CPEngAttributeFetchHandler::ReleaseHandler() + { + //nothing to do + } + + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::RunL() +// ----------------------------------------------------------------------------- +// +void CPEngAttributeFetchHandler::RunL() + { + PENG_DP_TXT( "CPEngAttributeFetchHandler::RunL()" ); + if ( iFetchedProcessor->ProcessStepL() ) + { + PENG_DP_TXT( "CPEngAttributeFetchHandler::RunL() - issuing new round." ); + IssueNewRound(); + return; + } + + if ( iTransactionOperation == EPEngTransOpAttributeFetchToObjects ) + { + PENG_DP_TXT( "CPEngAttributeFetchHandler::RunL() - parsing done. Streaming result models to objects." ); + + HBufC16* dataResult = iAttributeManager.PackModelArrayL( iResultModels ); + CleanupStack::PushL( dataResult ); + iResultStatus->AddDataResultL( iTransactionOperation, dataResult ); + CleanupStack::Pop( dataResult ); + } + else + { + PENG_DP_TXT( "CPEngAttributeFetchHandler::RunL() - parsing done. Storing result models to cache." ); + + iAttributeManager.ForceStoreBatchL( iResultModels ); + } + + + iResultModels.ResetAndDestroy(); + User::RequestComplete( iRequest, KErrNone ); + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::RunError() +// ----------------------------------------------------------------------------- +// +TInt CPEngAttributeFetchHandler::RunError( TInt aError ) + { + PENG_DP( D_PENG_LIT( "CPEngAttributeFetchHandler::RunError(): %d" ), aError ); + + iResultModels.ResetAndDestroy(); + User::RequestComplete( iRequest, aError ); + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::DoCancel() +// ----------------------------------------------------------------------------- +// +void CPEngAttributeFetchHandler::DoCancel() + { + iResultModels.ResetAndDestroy(); + User::RequestComplete( iRequest, KErrCancel ); + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchHandler::IssueNewRound() +// ----------------------------------------------------------------------------- +// +void CPEngAttributeFetchHandler::IssueNewRound() + { + iStatus = KRequestPending; + + TRequestStatus *pS = &iStatus; + User::RequestComplete( pS, KErrNone ); + SetActive(); + } + + +// End of File + +