diff -r 000000000000 -r b16258d2340f applayerprotocols/httpexamples/nwsswsptrhnd/CNwssConnectGuard.cpp --- /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 +#include +#include +#include + +// 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; + }