diff -r 000000000000 -r b16258d2340f applayerprotocols/httpexamples/nwsswsptrhnd/CNwssWspCOEventDispatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerprotocols/httpexamples/nwsswsptrhnd/CNwssWspCOEventDispatcher.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,218 @@ +// Copyright (c) 2002-2009 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: +// + + +// Local includes +#include "cnwsstranslookuptable.h" +#include "mnwsssessioneventhandler.h" +#include "mnwsstransactioneventhandler.h" +#include "mnwssoomhandler.h" +#include "tnwsswsptrhndpanic.h" +#include "testoom.h" + +// Class signature +#include "cnwsswspcoeventdispatcher.h" + + + +CNwssWspCOEventDispatcher* CNwssWspCOEventDispatcher::NewL( + RWSPCOConn& aWspSession, + MNwssSessionEventHandler& aSessEventHnd, + MNwssTransactionEventHandler& aTransEventHnd, + MNwssOomHandler& aOutOfMemoryHnd + ) + { + return new(ELeave)CNwssWspCOEventDispatcher(aWspSession, aSessEventHnd, + aTransEventHnd, aOutOfMemoryHnd); + } + +CNwssWspCOEventDispatcher::~CNwssWspCOEventDispatcher() + { + Cancel(); + } + +CNwssWspCOEventDispatcher::CNwssWspCOEventDispatcher( + RWSPCOConn& aWspSession, + MNwssSessionEventHandler& aSessEventHnd, + MNwssTransactionEventHandler& aTransEventHnd, + MNwssOomHandler& aOutOfMemoryHnd + ) + : CActive(CActive::EPriorityHigh), + iWspSession(aWspSession), iSessEventHnd(aSessEventHnd), + iTransEventHnd(aTransEventHnd), iOutOfMemoryHnd(aOutOfMemoryHnd) + { + CActiveScheduler::Add(this); + } + +void CNwssWspCOEventDispatcher::Start() + { + if (!IsActive()) + { + iWspSession.GetEvent(iWspEvent, iTransaction, iStatus); + SetActive(); + } + } + +void CNwssWspCOEventDispatcher::RunL() + { + RWSPCOConn::TEventType event = (RWSPCOConn::TEventType)iWspEvent(); + + // Obtain the transaction ID for transaction events + iTrId = KErrNotFound; + if ( (event == RWSPCOConn::EMethodInvoke_cnf_t) || + (event == RWSPCOConn::EMethodResult_ind_t) || + (event == RWSPCOConn::EAbort_ind_t) ) + { + __TESTOOMD(stkErr, iTransaction.Id(iTrId)); + User::LeaveIfError(stkErr); + } + + // Testing only - simulate a WAP Stack OOM which would cause this AO to complete with KErrNoMemory + TInt status = iStatus.Int(); +#if defined (_DEBUG) && defined(__UNIT_TESTING__) + TAny* _a = User::Alloc(sizeof(TInt)); + User::Free(_a); + if (_a == NULL) + status = KErrNoMemory; +#endif + User::LeaveIfError(status); + + // Request the next event before processing this one. It is important to do this here, + // and not after the following event handling - since the handler may decide to cancel this + // dispatcher as a result of the event, or even close iWspSession. + Start(); + + // Act according to the event type + switch (event) + { + // dispatch session events to the session event handler + case RWSPCOConn::EDisconnect_ind_s: + { + __DEBUGTESTLEAVE + iSessEventHnd.HandleDisconnectIndL(); + } break; + case RWSPCOConn::ESuspend_ind_s: + { + __DEBUGTESTLEAVE + iSessEventHnd.HandleSuspendIndL(); + } break; + case RWSPCOConn::EResume_cnf_s: + { + __DEBUGTESTLEAVE + iSessEventHnd.HandleResumeCnfL(); + } break; + case RWSPCOConn::EConnect_cnf_s: + { + __DEBUGTESTLEAVE + iSessEventHnd.HandleConnectCnfL(); + } break; + case RWSPCOConn::ERedirect_ind_s: + { + __DEBUGTESTLEAVE + iSessEventHnd.HandleRedirectIndL(); + } break; + // dispatch transaction events to the transaction event handler + case RWSPCOConn::EMethodInvoke_cnf_t: + { + __DEBUGTESTLEAVE + iTransEventHnd.HandleMethodInvokeCnfL(iTrId); + } break; + case RWSPCOConn::EMethodResult_ind_t: + { + __DEBUGTESTLEAVE + iTransEventHnd.HandleMethodResultIndL(iTrId); + } break; + case RWSPCOConn::EAbort_ind_t: + { + __DEBUGTESTLEAVE + iTransEventHnd.HandleAbortIndL(iTrId); + } break; + // push events are not supported, and should indeed never arise if the + // capability negotiations with the WAP proxy have been successful + case RWSPCOConn::EPush_ind_t: + case RWSPCOConn::EConfirmedPush_ind_t: + { + TNwssWspTrHndPanic::Panic(TNwssWspTrHndPanic::ECOPushNotSupported); + } break; + // exception event is treated like a session event + case RWSPCOConn::EException_ind_e: + { + __DEBUGTESTLEAVE + iSessEventHnd.HandleExceptionIndL(); + } break; + default: + { + TNwssWspTrHndPanic::Panic(TNwssWspTrHndPanic::EUnknownWspEvent); + } break; + }; + } + +TInt CNwssWspCOEventDispatcher::RunError(TInt aError) + { + // Handle errors according to event type: if it's a transaction event, then send an AbortInd + // for it. If it's a session event, then send DisconnectInd. + RWSPCOConn::TEventType event = (RWSPCOConn::TEventType)iWspEvent(); + TInt err = KErrNone; + + // Act according to the event type + switch (event) + { + case RWSPCOConn::ESuspend_ind_s: + case RWSPCOConn::EResume_cnf_s: + case RWSPCOConn::EConnect_cnf_s: + case RWSPCOConn::ERedirect_ind_s: + case RWSPCOConn::EDisconnect_ind_s: + { + if (aError != KErrNoMemory) + TRAP(err, __DEBUGTESTLEAVE \ + iSessEventHnd.HandleDisconnectIndL()); + if ((aError == KErrNoMemory) || (err == KErrNoMemory)) + { + // We need to disconnect the WAP stack if there is any risk of + // the client and WAP stack's session state becoming different + TBool disconStack = ( (event != RWSPCOConn::EDisconnect_ind_s) && + (event != RWSPCOConn::ERedirect_ind_s) ); + iOutOfMemoryHnd.SendOomDisconnect(disconStack); + } + } break; + case RWSPCOConn::EMethodInvoke_cnf_t: + case RWSPCOConn::EMethodResult_ind_t: + case RWSPCOConn::EAbort_ind_t: + { + if (iTrId != KErrNotFound) // if we don't have a transaction ID we can't do anything + { + if (aError != KErrNoMemory) + TRAP(err, __DEBUGTESTLEAVE \ + iTransEventHnd.HandleAbortIndL(iTrId)); + if ((aError == KErrNoMemory) || (err == KErrNoMemory)) + iOutOfMemoryHnd.SendOomMethodAbort(iTrId, EFalse); + } + else + { + // We had an error whilst processing a transaction event, but we couldn't obtain + // the transaction ID - so we'll have to disconnect the session instead. + iOutOfMemoryHnd.SendOomDisconnect(ETrue); + } + } break; + default: + ; // ignore - nothing else we can do + }; + return KErrNone; + } + +void CNwssWspCOEventDispatcher::DoCancel() + { + iWspSession.CancelGetEvent(); + }