PECengine/AttributeLibrary2/SrcTransactions/CPEngAttributeFetchHandler.cpp
changeset 0 094583676ce7
--- /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
+
+