diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/upnpconnectionmanagersession/src/upnpconnectionmanagerproxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/upnpconnectionmanagersession/src/upnpconnectionmanagerproxy.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,228 @@ +/** @file +* Copyright (c) 2005-2008 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: CUpnpConnectionManagerProxy +* +*/ + + +// INCLUDE FILES +#include "upnpconnectionmanagernetworkeventprovider.h" +#include "upnpconnectionmanagerproxy.h" +#include "upnpcustomlog.h" + + +// ----------------------------------------------------------------------------- +// CUpnpConnectionManagerProxy::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CUpnpConnectionManagerProxy* CUpnpConnectionManagerProxy::NewL( + RSocketServ &aSocketServer ) + { + CUpnpConnectionManagerProxy* self = + CUpnpConnectionManagerProxy::NewLC( aSocketServer ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CUpnpConnectionManagerProxy::NewLC +// Two-phased constructor, leave object on the cleanup stack. +// ----------------------------------------------------------------------------- +// +EXPORT_C CUpnpConnectionManagerProxy* CUpnpConnectionManagerProxy::NewLC( + RSocketServ &aSocketServer ) + { + CUpnpConnectionManagerProxy* self = new( ELeave ) CUpnpConnectionManagerProxy(); + CleanupStack::PushL( self ); + self->ConstructL( aSocketServer ); + return self; + } + +// ----------------------------------------------------------------------------- +// CUpnpConnectionManagerProxy::CUpnpConnectionManagerProxy +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CUpnpConnectionManagerProxy::CUpnpConnectionManagerProxy() : iActiveIap( KErrNotFound ) + { + } + +// ----------------------------------------------------------------------------- +// CUpnpConnectionManagerProxy::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CUpnpConnectionManagerProxy::ConstructL( RSocketServ& aSocketServer ) + { + User::LeaveIfError( iConnection.Open( aSocketServer ) ); + User::LeaveIfError( iConnectionManagerSession.Connect() ); + } + +// ----------------------------------------------------------------------------- +// CUpnpConnectionManagerProxy::~CUpnpConnectionManagerProxy +// Destructor. +// ----------------------------------------------------------------------------- +// +CUpnpConnectionManagerProxy::~CUpnpConnectionManagerProxy() + { + delete iNetworkEventProvider; + iConnection.Close(); + iConnectionManagerSession.Close(); + } + +// ----------------------------------------------------------------------------- +// CUpnpConnectionManagerProxy::EnsureStart +// Calls remote process to ensure that interface is started. +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CUpnpConnectionManagerProxy::EnsureStart() + { + TInt error = iConnectionManagerSession.RequestEnsureStartRConnection( iActiveIap ); + if ( error == KErrNone ) + { + error = Attach( iActiveIap ); + } + else if ( error < KErrNone ) + { + iActiveIap = KErrNotFound; + } + + return error; + } + +// ----------------------------------------------------------------------------- +// CUpnpConnectionManagerProxy::IsStarted +// Checks whether EnsureStart has been invoked. +// ----------------------------------------------------------------------------- +// +TBool CUpnpConnectionManagerProxy::IsStarted() + { + TBool result = EFalse; + iConnectionManagerSession.RequestIsRConnectionStarted( result ); + return result; + } + +// ----------------------------------------------------------------------------- +// CUpnpConnectionManagerProxy::ConnectionL +// ----------------------------------------------------------------------------- +// +EXPORT_C RConnection& CUpnpConnectionManagerProxy::ConnectionL() + { + if ( !IsStarted() ) + { + User::LeaveIfError( EnsureStart() ); + } + return iConnection; + } + +// ----------------------------------------------------------------------------- +// CUpnpConnectionManagerProxy::Attach +// Internal function. +// ----------------------------------------------------------------------------- +// +TInt CUpnpConnectionManagerProxy::Attach( TInt aAccessPoint ) + { + TUint connNumber; + TInt attachError = KErrNotFound; + TInt error = iConnection.EnumerateConnections( connNumber ); + + if ( error == KErrNone && connNumber > 0 ) + { + TPckgBuf connInfo; + + for ( TInt i = 1; i <= connNumber; i++ ) + { + error = iConnection.GetConnectionInfo( i, connInfo ); + + if ( error == KErrNone && connInfo().iIapId == aAccessPoint ) + { + attachError = iConnection.Attach( connInfo, + RConnection::EAttachTypeNormal ); + + if ( attachError == KErrNone || attachError == KErrInUse ) + { + attachError = KErrNone; //KErrInUse means already attached + break; + } + } + } + } + + return attachError; + } + +// ----------------------------------------------------------------------------- +// CUpnpConnectionManagerProxy::ActiveIap +// Returns active Iap or KErrNotFound if not connected. +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CUpnpConnectionManagerProxy::ActiveIap() + { + if ( iActiveIap == KErrNotFound ) + { + iActiveIap = iConnectionManagerSession.RequestActiveIap(); + } + + return iActiveIap; + } + +// ----------------------------------------------------------------------------- +// CUpnpConnectionManagerProxy::LocalAddress +// Returns local address +// ----------------------------------------------------------------------------- +// +EXPORT_C TInetAddr CUpnpConnectionManagerProxy::LocalAddress() + { + return iConnectionManagerSession.RequestLocalAddress(); + } + +// ----------------------------------------------------------------------------- +// CUpnpConnectionManagerProxy::SubscribeForNetworkEventsL +// Subscribe for network events. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpConnectionManagerProxy::SubscribeForNetworkEventsL( + MUpnpNetworkEventObserver *aObserver ) + { + delete iNetworkEventProvider; + iNetworkEventProvider = NULL; + if ( aObserver ) + { + iNetworkEventProvider = CUpnpConnectionManagerNetworkEventProvider::NewL( + iConnectionManagerSession, *aObserver ); + } + } + +// ----------------------------------------------------------------------------- +// CUpnpConnectionManagerProxy::GetActiveIapL +// Static function for straightforward way of obtaining IAP from server. +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CUpnpConnectionManagerProxy::GetActiveIapL() + { + RSocketServ socketServer; + User::LeaveIfError( socketServer.Connect() ); + CleanupClosePushL( socketServer ); + CUpnpConnectionManagerProxy *proxy = CUpnpConnectionManagerProxy::NewLC( socketServer ); + + TInt iap = proxy->ActiveIap(); + + CleanupStack::PopAndDestroy( proxy ); + CleanupStack::PopAndDestroy( &socketServer ); + + return iap; + } + +// End of file