diff -r 000000000000 -r 094583676ce7 PECengine/PresenceServer2/ServerSrc/CPEngIncomingDataHandler.cpp --- /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 +#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& 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& aTransactionFactories, + MPEngRequestHandlerObserver& aRequestHandlerObserver ) + { + CPEngIncomingDataHandler* self = NewLC( aPureDataHandler, aTransactionFactories, aRequestHandlerObserver ); + + CleanupStack::Pop(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CPEngIncomingDataHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngIncomingDataHandler* CPEngIncomingDataHandler::NewLC( + MPEngPureDataHandler& aPureDataHandler, + RPointerArray& + 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