--- /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 <PEngPresenceEngineConsts2.h>
+#include <E32Std.h>
+#include <badesca.h>
+
+
+
+
+
+//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<MPEngOutgoingTransactionHandler>& /*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
+
+