diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/upnpconnmanager/src/upnpconnmanagersession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/upnpconnmanager/src/upnpconnmanagersession.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,384 @@ +/** @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: Defines the CUpnpConnManagerSession class +* +*/ + + +// INCLUDE FILES +#include "upnpconnmanagersession.h" +#include "upnpconnmanagerengine.h" +#include "upnpconnmanager.h" +#include + +#define KLogFile _L("UPnPConnManager.txt") +#include "upnpcustomlog.h" + +// ================= MEMBER FUNCTIONS ======================= +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CUpnpConnManagerSession* CUpnpConnManagerSession::NewL( + CUpnpConnManagerEngine& aEngine ) + { + LOG_FUNC_NAME; + CUpnpConnManagerSession* self = + CUpnpConnManagerSession::NewLC( aEngine ); + CleanupStack::Pop( self ) ; + return self ; + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CUpnpConnManagerSession* CUpnpConnManagerSession::NewLC( + CUpnpConnManagerEngine& aEngine ) + { + LOG_FUNC_NAME; + CUpnpConnManagerSession* self = + new( ELeave ) CUpnpConnManagerSession( aEngine ); + CleanupStack::PushL( self ); + return self ; + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::CUpnpConnManagerSession +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CUpnpConnManagerSession::CUpnpConnManagerSession( CUpnpConnManagerEngine& aEngine ) + : CSession2(), + iConnEngine( aEngine ), + iLastEvent( EUnknownEvent ) + { +#ifdef _DEBUG + TInt reqsInStart = RThread().RequestCount(); + TInt processHandlesInStart; + TInt threadHandlesInStart; + RThread().HandleCount( processHandlesInStart, threadHandlesInStart ); + LOGS1( "reqsInStart: %d", reqsInStart); + LOGS1( "processHandlesInStart: %d", processHandlesInStart ); + LOGS1( "threadHandlesInStart: %d", threadHandlesInStart ); +#endif // _DEBUG + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::~CUpnpConnManagerSession +// Destructor. +// ----------------------------------------------------------------------------- +// +CUpnpConnManagerSession::~CUpnpConnManagerSession() + { + LOG_FUNC_NAME; + + iConnEngine.CheckAndCloseConnection( this ); + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::ServiceL +// Handle client requests. +// ----------------------------------------------------------------------------- +// +void CUpnpConnManagerSession::ServiceL( const RMessage2& aMessage ) + { + LOG_FUNC_NAME; + TInt err; + switch ( aMessage.Function() ) + { + case EEnsureStartRConnection: + { + err = EventEnsureStartRConnectionL( aMessage ); + aMessage.Complete( err ); + break; + } + case EIsRConnectionStarted: + { + EventIsRConnectionStartedL( aMessage ); + aMessage.Complete( KErrNone ); + break; + } + case EEventSubscribe: + { + // subscribe to: 1) wlan lost or 2) address change + EventSubscribeToNetworkEventL( aMessage ); + break; + } + case ECancelEventSubscribe: + { + EventCancelSubscribeToNetworkEvent(); + aMessage.Complete( KErrNone ); + break; + } + case ECmActiveIap: + { + EventActiveIapL( aMessage ); + aMessage.Complete( KErrNone ); + break; + } + case ECmGetAddress: + { + EventLocalAddressL( aMessage ); + aMessage.Complete( KErrNone ); + break; + } + + default: + PanicClient( aMessage, CUpnpSymbianServerBase::EBadRequest ); + break; + } + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::PanicClient +// Panic client. +// ----------------------------------------------------------------------------- +// +void CUpnpConnManagerSession::PanicClient( const RMessage2& aMessage, TInt aPanic ) const + { + LOG_FUNC_NAME; + static_cast( Server() )->PanicClient( aMessage, aPanic ); + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::EventEnsureStartRConnectionL +// Device list change. +// ----------------------------------------------------------------------------- +// +TInt CUpnpConnManagerSession::EventEnsureStartRConnectionL( const RMessage2& aMessage ) + { + LOG_FUNC_NAME; + + TInt accessPoint; + TInt result = iConnEngine.EnsureStart( accessPoint ); + TPtr8 ptr( reinterpret_cast( &accessPoint ), sizeof( TInt ), sizeof( TInt ) ); + aMessage.WriteL( 0, ptr ); + + iSessionUseConnection = ETrue; + + return result; + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::EventIsRConnectionStartedL +// Checks if connection is started +// ----------------------------------------------------------------------------- +// +void CUpnpConnManagerSession::EventIsRConnectionStartedL( const RMessage2& aMessage ) + { + LOG_FUNC_NAME; + + TBool result = iConnEngine.IsStarted(); + TPtr8 ptr( reinterpret_cast( &result ), sizeof( TBool ), + sizeof( TBool ) ); + aMessage.WriteL( 0, ptr ); + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::EventSubscribeToNetworkEventL +// Subscribes to Wlan lost event +// ----------------------------------------------------------------------------- +// +void CUpnpConnManagerSession::EventSubscribeToNetworkEventL( const RMessage2& aMessage ) + { + LOG_FUNC_NAME; + if ( !iSubscriberMessage.IsNull() ) + { + aMessage.Complete( KErrServerBusy ); + return; + } + else + { + iSubscriberMessage = aMessage; + } + + switch( iLastEvent.Type() ) + { + case EWlanLostEvent: + WLanLostCompleteL(); + break; + case EAddressChangeEvent: + AddressChangeCompleteL(); + break; + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::EventCancelSubscribeToNetworkEvent +// Cancel subscription +// ----------------------------------------------------------------------------- +// +void CUpnpConnManagerSession::EventCancelSubscribeToNetworkEvent() + { + LOG_FUNC_NAME; + CancelSubscription(); + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::EventActiveIap +// Returns active Iap. +// ----------------------------------------------------------------------------- +// +void CUpnpConnManagerSession::EventActiveIapL( const RMessage2 &aMessage ) + { + LOG_FUNC_NAME; + + TInt iap = iConnEngine.ActiveIap(); + TPtr8 ptr( reinterpret_cast( &iap ), sizeof( TInt ), sizeof( TInt ) ); + + aMessage.WriteL( 0, ptr ); + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::EventLocalAddressL +// Returns local address +// ----------------------------------------------------------------------------- +// +void CUpnpConnManagerSession::EventLocalAddressL( const RMessage2 &aMessage ) + { + LOG_FUNC_NAME; + + TInetAddr localAddress = iConnEngine.LocalAddress(); + TPtr8 ptr( reinterpret_cast( &localAddress ), + sizeof( TInetAddr ), + sizeof( TInetAddr ) ); + + aMessage.WriteL( 0, ptr ); + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::CancelSubscription +// Cancel subscription +// ----------------------------------------------------------------------------- +// +void CUpnpConnManagerSession::CancelSubscription() + { + if ( !iSubscriberMessage.IsNull() ) + { + iSubscriberMessage.Complete( KErrCancel ); + } + iLastEvent.SetType( EUnknownEvent ); + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::WLanLostOccured +// Ends subscription with Wlan lost code +// ----------------------------------------------------------------------------- +// +void CUpnpConnManagerSession::WLanLostOccuredL() + { + iLastEvent.SetType( EWlanLostEvent ); + if ( !iSubscriberMessage.IsNull() ) + { + WLanLostCompleteL(); + } + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::WLanLostComplete +// Notify client about WLan lost event +// ----------------------------------------------------------------------------- +// +void CUpnpConnManagerSession::WLanLostCompleteL() + { + TPtr8 ptr( reinterpret_cast( &iLastEvent ), + sizeof( TUpnpConnectionManagerNetworkEvent ), + sizeof( TUpnpConnectionManagerNetworkEvent ) ); + + iSubscriberMessage.WriteL( KNetworkEventSlot, ptr ); + iSubscriberMessage.Complete( KErrNone ); + iLastEvent.SetType( EUnknownEvent ); + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::AddressChangeOccuredL +// Ends subscription with address change code +// ----------------------------------------------------------------------------- +// +void CUpnpConnManagerSession::AddressChangeOccuredL( TInetAddr& aAddr ) + { + iLastEvent.SetType( EAddressChangeEvent ); + iLastEvent.SetAddress( aAddr ); + + if ( !iSubscriberMessage.IsNull() ) + { + AddressChangeCompleteL(); + } + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::AddressChangeCompleteL +// Notify client about address change event +// ----------------------------------------------------------------------------- +// +void CUpnpConnManagerSession::AddressChangeCompleteL() + { + TPtr8 ptr( reinterpret_cast( &iLastEvent ), + sizeof( TUpnpConnectionManagerNetworkEvent ), + sizeof( TUpnpConnectionManagerNetworkEvent ) ); + + iSubscriberMessage.WriteL( KNetworkEventSlot, ptr ); + iSubscriberMessage.Complete( KErrNone ); + iLastEvent.SetType( EUnknownEvent ); + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::SessionUseConnection +// ----------------------------------------------------------------------------- +// +TBool CUpnpConnManagerSession::SessionUseConnection() + { + return iSessionUseConnection; + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::ConnectionClosedL +// Ends subscription with connection close code +// ----------------------------------------------------------------------------- +// +void CUpnpConnManagerSession::ConnectionClosedL() + { + if ( iLastEvent.Type() != EConnectionClosedEvent ) + { + iLastEvent.SetType( EConnectionClosedEvent ); + + if ( !iSubscriberMessage.IsNull() ) + { + ConnectionClosedCompleteL(); + } + } + } + +// ----------------------------------------------------------------------------- +// CUpnpConnManagerSession::ConnectionClosedCompleteL +// Notify client about connection close event +// ----------------------------------------------------------------------------- +// +void CUpnpConnManagerSession::ConnectionClosedCompleteL() + { + TPtr8 ptr( reinterpret_cast( &iLastEvent ), + sizeof( TUpnpConnectionManagerNetworkEvent ), + sizeof( TUpnpConnectionManagerNetworkEvent ) ); + + iSubscriberMessage.WriteL( KNetworkEventSlot, ptr ); + iSubscriberMessage.Complete( KErrNone ); + } + +// End of File