PECengine/PresenceServer2/ServerSrc/CPEngIncomingDataHandler.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/PresenceServer2/ServerSrc/CPEngIncomingDataHandler.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,225 @@
+/*
+* Copyright (c) 2002 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:  Incoming data handler
+*                it handles incoming data from the network server
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    <e32std.h>
+#include    "CPEngIncomingDataHandler.h"
+#include    "MPEngIncomingTransactionHandler.h"
+#include    "MPEngPureDataHandler.h"
+#include	"MPEngTransactionFactory.h"
+#include	"MPEngRequestHandlerObserver.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngIncomingDataHandler::CPEngIncomingDataHandler
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPEngIncomingDataHandler::CPEngIncomingDataHandler(
+    MPEngPureDataHandler& aPureDataHandler,
+    RPointerArray<MPEngTransactionFactory>& aTransactionFactories,
+    MPEngRequestHandlerObserver& aRequestHandlerObserver )
+        : CActive( CActive::EPriorityStandard ),
+        iPureDataHandler( aPureDataHandler ),
+        iTransactionFactories( aTransactionFactories ),
+        iRequestHandlerObserver( aRequestHandlerObserver )
+
+
+
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngIncomingDataHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CPEngIncomingDataHandler::ConstructL()
+    {
+    // add active object to the active scheduler
+    CActiveScheduler::Add( this );
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngIncomingDataHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CPEngIncomingDataHandler* CPEngIncomingDataHandler::NewL(
+    MPEngPureDataHandler& aPureDataHandler,
+    RPointerArray<MPEngTransactionFactory>& aTransactionFactories,
+    MPEngRequestHandlerObserver& aRequestHandlerObserver )
+    {
+    CPEngIncomingDataHandler* self = NewLC( aPureDataHandler, aTransactionFactories, aRequestHandlerObserver );
+
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngIncomingDataHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CPEngIncomingDataHandler* CPEngIncomingDataHandler::NewLC(
+    MPEngPureDataHandler& aPureDataHandler,
+    RPointerArray<MPEngTransactionFactory>&
+    aTransactionFactories,
+    MPEngRequestHandlerObserver& aRequestHandlerObserver )
+    {
+    CPEngIncomingDataHandler* self =
+        new( ELeave ) CPEngIncomingDataHandler(
+        aPureDataHandler,
+        aTransactionFactories,
+        aRequestHandlerObserver );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    return self;
+    }
+
+
+// Destructor
+CPEngIncomingDataHandler::~CPEngIncomingDataHandler()
+    {
+    Cancel();
+    delete iTransactionHandler;
+    // remove if from the list of the listener
+    }
+
+/////////////////////////////////////////////////////////////////////////////////
+// ============== Function from the Main class =================================
+/////////////////////////////////////////////////////////////////////////////////
+
+// -----------------------------------------------------------------------------
+// CPEngIncomingDataHandler::StartListeningL
+// Start listening of the incoming data from the server
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPEngIncomingDataHandler::StartListeningL()
+    {
+    // start listening incoming data
+    TInt count( iPureDataHandler.ListenIncomingData( iStatus ) );
+    SetActive();
+    for ( TInt x( 0 ) ;  x < count ; ++x )
+        {
+        HandleIncomingDataL();
+        }
+    }
+
+/////////////////////////////////////////////////////////////////////////////////
+// ============== Function from the CActive =====================================
+/////////////////////////////////////////////////////////////////////////////////
+
+// -----------------------------------------------------------------------------
+// CPEngIncomingDataHandler::RunL
+// Handles an active object’s request completion event.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPEngIncomingDataHandler::RunL()
+    {
+    // OK there is something from the WV server
+    HandleIncomingDataL();
+    StartListeningL();
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngIncomingDataHandler::RunError
+// Handles a leave occurring in the request completion event handler RunL()
+// implementation should return KErrNone, if it handles the leave
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CPEngIncomingDataHandler::RunError(
+    TInt /* aError*/ )
+    {
+    // restartt listening incoming data
+    iPureDataHandler.ListenIncomingData( iStatus );
+    SetActive();
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngIncomingDataHandler::DoCancel
+// Implements cancellation of an outstanding request.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPEngIncomingDataHandler::DoCancel()
+    {
+    iPureDataHandler.CancelListening();
+    }
+
+/////////////////////////////////////////////////////////////////////////////////
+// ============== New private Functions of the main class =======================
+/////////////////////////////////////////////////////////////////////////////////
+
+// -----------------------------------------------------------------------------
+// CPEngIncomingDataHandler::HandleIncomingDataL
+// Handle here incoming data from the presence server
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPEngIncomingDataHandler::HandleIncomingDataL()
+    {
+    // first get new data from the pure data handler
+    HBufC8* newData;
+    newData = iPureDataHandler.ResponseL( 0 ); // zero is incoming Data
+    if ( !newData )
+        {
+        StartListeningL();
+        return;
+        }
+    CleanupStack::PushL( newData );
+    TPtr8 incomingData( newData->Des() );
+    // TO-DO create new listen handler, since this one will be bussy
+    // with processing
+
+
+    // ask transaction factories if we want this data
+    TInt count( iTransactionFactories.Count() );
+    for ( TInt x( 0 ) ; x < count ; x++ )
+        {
+        iTransactionHandler =
+            iTransactionFactories[x]->IncomingTransactionHandlerL(
+                incomingData );
+        if ( iTransactionHandler )
+            {
+            // no process new Transaction Handler
+            // TO-DO, do processing asynchronous
+            iTransactionHandler->ProcessRequestL( incomingData, iStatus );
+            // check if transaction needs to perform more complicated answer
+            delete iTransactionHandler;
+            iTransactionHandler = NULL; // this is here for the destructor
+            }
+        }
+    CleanupStack::PopAndDestroy(); // newData
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+//  End of File