diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/dlnawebserver/src/upnpsocketshutdown.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/dlnawebserver/src/upnpsocketshutdown.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,232 @@ +/** @file +* Copyright (c) 2005-2006 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: +* +*/ + + + +#include "upnptcpsession.h" +#include "upnptcpsessionreader.h" +#include "upnptcpsessionwriter.h" +#include "upnphttpfiletransferwriter.h" +#include "upnphttpfiletransferreader.h" +#include "upnpsocketshutdown.h" +#include "upnpnotifytimer.h" + + + +// ----------------------------------------------------------------------------- +// CUpnpSocketShutdown::NewL +// +// ----------------------------------------------------------------------------- +// +CUpnpSocketShutdown* CUpnpSocketShutdown::NewL( CUpnpTcpSession& aSession, RSocket& aSocket, TThreadPriority aPriority ) + { + CUpnpSocketShutdown* self = new ( ELeave ) CUpnpSocketShutdown( aSession, aSocket, aPriority ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CUpnpSocketShutdown::CUpnpSocketShutdown +// +// ----------------------------------------------------------------------------- +// +CUpnpSocketShutdown::CUpnpSocketShutdown( CUpnpTcpSession& aSession, RSocket& aSocket, TThreadPriority aPriority ):CActive( aPriority ),iSession( aSession ),iSocket( aSocket ),iInternalState(EUnknown), iSessionTimeouted( EFalse ) + { + } + +// ----------------------------------------------------------------------------- +// CUpnpSocketShutdown::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CUpnpSocketShutdown::ConstructL() + { + CActiveScheduler::Add( this ); + iInputTimeoutTimer = CUpnpNotifyTimer::NewL( this ); + } + +// ----------------------------------------------------------------------------- +// CUpnpSocketShutdown::~CUpnpSocketShutdown +// +// ----------------------------------------------------------------------------- +// +CUpnpSocketShutdown::~CUpnpSocketShutdown() + { + Cancel(); + delete iInputTimeoutTimer; + } + +// ----------------------------------------------------------------------------- +// CUpnpSocketShutdown::ShutdownImmediate +// Disconnect connection +// ----------------------------------------------------------------------------- +// +void CUpnpSocketShutdown::ShutdownImmediate() + { + iSession.iTcpReader->Cancel(); + iSession.iTcpWriter->Cancel(); + if( iSession.iFTReader ) + { + iSession.iFTReader->Cancel(); + } + if( iSession.iFTWriter ) + { + iSession.iFTWriter->Cancel(); + } + iSocket.Shutdown( iSocket.EImmediate, iStatus ); + iInternalState = ENotConnected; + SetActive(); + } + +// ----------------------------------------------------------------------------- +// CUpnpSocketShutdown::ShutdownStop +// Disconnect connection +// ----------------------------------------------------------------------------- +// +void CUpnpSocketShutdown::ShutdownStop() + { + if ( iInternalState == EUnknown ) + { + iSession.iTcpReader->CancelTimers(); + if( iSession.iFTReader ) + { + iSession.iFTReader->CancelTimers(); + } + + if( iSession.iTcpReader->IsActive() + || ( iSession.iFTReader && iSession.iFTReader->IsActive() ) + ) + { + iSocket.Shutdown( iSocket.EStopOutput, iStatus ); + iInternalState = EShuttingDownStopOutput ; + } + else + { + iSocket.Shutdown( iSocket.ENormal, iStatus ); + iInternalState = EShuttingDownNormal; + } + SetActive(); + } + } + +// ----------------------------------------------------------------------------- +// CUpnpSocketShutdown::MarksTimeout +// Marks if timeout occured on session +// ----------------------------------------------------------------------------- +// +void CUpnpSocketShutdown::MarksTimeout() + { + iSessionTimeouted = ETrue; + } + +// ----------------------------------------------------------------------------- +// CUpnpSocketShutdown::HandleError +// Disconnect connection +// ----------------------------------------------------------------------------- +// +void CUpnpSocketShutdown::HandleError( TInt /*aError*/ ) + { + switch ( iInternalState ) + { + case EUnknown: // error happened during reading/writing - start shutdown procedure + ShutdownStop(); + break; + case EShuttingDownStopOutput: // input error appeares while shutdown stop output is pending + // when it returns shutdown immediate is invoked in RunL + iInternalState = EInputErrorReceived; + break; + case EWaitingForInputError: // error response from reader after shutdown stop output + ShutdownImmediate(); + break; + case EShuttingDownNormal: // do nothimg session is being closed + case ENotConnected: // do nothing session is closed + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CUpnpSocketShutdown::HandleError +// Disconnect connection +// ----------------------------------------------------------------------------- +// +void CUpnpSocketShutdown::RunL() + { + switch( iInternalState ) + { + case EShuttingDownNormal: // shutdown normal response came + ShutdownImmediate(); + break; + case EShuttingDownStopOutput: // shutdown stop output response came + // waiting for KErrEof from HandleError() + if( !iSessionTimeouted ) + { + iInternalState = EWaitingForInputError; + iInputTimeoutTimer->Cancel(); + iInputTimeoutTimer->After(KSessionTimeout, EFalse); + break; + } + case EInputErrorReceived: // input error came before stop output finished + ShutdownImmediate(); + break; + case ENotConnected: // shutdown immediate response came + iSession.CloseSocketL(); + break; + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CUpnpSocketShutdown::TimerEventL +// Disconnect connection +// ----------------------------------------------------------------------------- +// +void CUpnpSocketShutdown::TimerEventL( CUpnpNotifyTimer* /*aTimer*/ ) + { + switch( iInternalState ) + { + case EWaitingForInputError: // waiting for input error timeout + ShutdownImmediate(); + break; + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CUpnpSocketShutdown::DoCancel +// Disconnect connection +// ----------------------------------------------------------------------------- +// +void CUpnpSocketShutdown::DoCancel() + { + } + +// ----------------------------------------------------------------------------- +// CUpnpSocketShutdown::HandleError +// Disconnect connection +// ----------------------------------------------------------------------------- +// +TInt CUpnpSocketShutdown::RunError( TInt /*aError*/ ) + { + return KErrNone; + } + +