applayerprotocols/httpexamples/nwsswsptrhnd/CNwssConnectGuard.cpp
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/httpexamples/nwsswsptrhnd/CNwssConnectGuard.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,149 @@
+// 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:
+//
+
+// System includes
+#include <wsp/mwspcomethodinvoker.h>
+#include <wsp/mwspcomethodcallback.h>
+#include <wsp/mwspcosessioncallback.h>
+#include <uri8.h>
+
+// Local includes 
+#include "cnwssconnectguard.h"
+
+CNwssConnectGuard* CNwssConnectGuard::NewL(MWspCOMethodInvoker& aMethodInvoker, MWspCOSessionCallback& aSessionCallback)
+	{
+	CNwssConnectGuard* self = new (ELeave) CNwssConnectGuard(aMethodInvoker, aSessionCallback);
+	return self;
+	}
+
+CNwssConnectGuard::~CNwssConnectGuard()
+	{
+	ResetMethodInfo();
+	}
+
+CNwssConnectGuard::CNwssConnectGuard(MWspCOMethodInvoker& aMethodInvoker, MWspCOSessionCallback& aSessionCallback)
+: CActive(CActive::EPriorityStandard), iMethodInvoker(aMethodInvoker), iSessionCallback(aSessionCallback)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CNwssConnectGuard::SendMethodInvokeReq()
+	{
+	// Check to see if object is active - this implies that T-MethodAbort.ind
+	// is waiting to sent.
+	if( !IsActive() && iMethodCallback )
+		{
+		// Send the T-MethodInvoke.req primitive.
+		iMethodInvoker.MethodInvokeReq(
+									  *iMethodCallback,
+									  iMethod,
+									  iRequestUri->Uri(),
+									  *iRequestHeaders,
+									  *iRequestBody,
+									  EFalse
+									  );
+		// Release resources - no longer neeeded
+		ResetMethodInfo();
+		}
+	}
+
+void CNwssConnectGuard::SendDisconnectInd(Wap::TWspReason aReason)
+	{
+	// Specify that need to send S-Disconnect.ind
+	iSendDisconnect = ETrue;
+
+	// Store the reason code
+	iDisconnectReason = aReason;
+
+	CompleteSelf();
+	}
+
+void CNwssConnectGuard::SendMethodAbortInd()
+	{
+	CompleteSelf();
+	}
+
+void CNwssConnectGuard::ReceivedMethodInvokeReqL(
+												MWspCOMethodCallback&	aMethodCallback,
+												RStringF				aMethod,
+												const TUriC8&			aRequestUri,
+												const TDesC8&			aRequestHeaders,
+												const TDesC8&			aRequestBody
+												)
+	{
+	if( iMethodCallback )
+		{
+		// Have already got method info - leave as this is not allowed.
+		User::Leave(KErrAlreadyExists);
+		}
+	iMethodCallback	= &aMethodCallback;
+	iMethod			= aMethod.Copy();
+	iRequestUri		= CUri8::NewL(aRequestUri);
+	iRequestHeaders	= aRequestHeaders.AllocL();
+	iRequestBody	= aRequestBody.AllocL();
+	}
+
+void CNwssConnectGuard::RunL()
+	{
+	// Check to see if there is any method info.
+	if( iMethodCallback )
+		{
+		Wap::TWspReason reason = Wap::EUserReq;
+
+		if( iSendDisconnect && iDisconnectReason != Wap::EUserReq )
+			{
+			// The session was disconnected due to a connect failure - could be
+			// a WTLS failure, etc.
+			reason = Wap::EConnectErr;
+			}
+		// Yep - send the T-MethodAbort.ind
+		iMethodCallback->MethodAbortInd(reason);
+
+		// Release resources - no longer neeeded
+		ResetMethodInfo();
+		}
+	// Send S-Disconnect?
+	if( iSendDisconnect )
+		{
+		TWspRedirectedAddress emptyAddr;
+		iSessionCallback.DisconnectInd(iDisconnectReason, EFalse, emptyAddr, KNullDesC8(), KNullDesC8());
+		}
+	}
+
+void CNwssConnectGuard::DoCancel()
+	{
+	}
+
+void CNwssConnectGuard::CompleteSelf()
+	{
+	if (!IsActive())
+		{
+		TRequestStatus* pStat = &iStatus;
+		User::RequestComplete(pStat, KErrNone);
+		SetActive();
+		}
+	}
+
+void CNwssConnectGuard::ResetMethodInfo()
+	{
+	iMethod.Close();
+	iMethod = RStringF();
+	delete iRequestUri;
+	iRequestUri = NULL;
+	delete iRequestHeaders;
+	iRequestHeaders = NULL;
+	delete iRequestBody;
+	iRequestBody = NULL;
+	}