applayerprotocols/httpexamples/nwsswsptrhnd/CNwssWspCOEventDispatcher.cpp
changeset 0 b16258d2340f
--- /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();
+	}