diff -r f742655b05bf -r d38647835c2e voipplugins/dhcppositionprovider/src/dhcpconnectionengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/voipplugins/dhcppositionprovider/src/dhcpconnectionengine.cpp Wed Sep 01 12:29:57 2010 +0100 @@ -0,0 +1,192 @@ +/* +* Copyright (c) 2007 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: Browse and activate proper connection method. +* +*/ + + +#include +#include +#include "dhcppsylogging.h" +#include "dhcppsy.hrh" +#include "dhcpconnectionprogressnotifier.h" +#include "dhcpconnectionstateobserver.h" +#include "dhcpconnectionengine.h" + +// --------------------------------------------------------------------------- +// CDhcpConnectionEngine::NewL +// --------------------------------------------------------------------------- +// +CDhcpConnectionEngine* CDhcpConnectionEngine::NewL (RConnection& aConnection) + { + CDhcpConnectionEngine* self = new (ELeave) CDhcpConnectionEngine (aConnection); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// Member methods +// --------------------------------------------------------------------------- +// CDhcpConnectionEngine::CDhcpConnectionEngine +// --------------------------------------------------------------------------- +// +CDhcpConnectionEngine::CDhcpConnectionEngine (RConnection& aConnection) : CActive ( EPriorityStandard ), + iConnection (aConnection) + { + TRACESTRING( "CDhcpConnectionEngine::CDhcpConnectionEngine" ); + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// CDhcpConnectionEngine::~CDhcpConnectionEngine +// --------------------------------------------------------------------------- +// +CDhcpConnectionEngine::~CDhcpConnectionEngine() + { + TRACESTRING( "CDhcpConnectionEngine::~CDhcpConnectionEngine" ); + Cancel(); + delete iProgressNotifier; + } +// --------------------------------------------------------------------------- +// CDhcpConnectionEngine::ConstructL +// --------------------------------------------------------------------------- +// +void CDhcpConnectionEngine::ConstructL() + { + TRACESTRING( "CDhcpConnectionEngine::ContructL" ); + iProgressNotifier = CDhcpConnectionProgressNotifier::NewL(iConnection, this); + } + +// --------------------------------------------------------------------------- +// CDhcpConnectionEngine::DoCancel +// --------------------------------------------------------------------------- +// +void CDhcpConnectionEngine::DoCancel() + { + TRACESTRING2 ( "CDhcpConnectionEngine::DoCancel, state %d", iStates); + // Is this really needed ? Most cases SVP will continue with same IAP connection so + // it's not good to drop a connection beforehand ... + iProgressNotifier->Cancel (); + iConnection.Close (); + TRACESTRING( "CDhcpConnectionEngine::DoCancel, end" ); + } + + +// --------------------------------------------------------------------------- +// CDhcpConnectionEngine::ActiveWlanConnection +// --------------------------------------------------------------------------- +// +TBool CDhcpConnectionEngine::IsConnectedL (TUint32 aIAPId ) + { + TUint connectionCount = 0; + TBool isConnected = EFalse; + if (iProgressNotifier->GetState () == EDhcpConnectStateConnected) + { + isConnected = ETrue; + return isConnected; + } + + User::LeaveIfError( iConnection.EnumerateConnections(connectionCount)); + TRACESTRING2 ("CDhcpConnectionEngine::IsConnectedL, connCount, %d", connectionCount ) + // Loop shall start from second item, otherwise this will not work. + for ( TUint i = 1; i <= connectionCount; i++ ) + { + TPckgBuf connInfo; + User::LeaveIfError( iConnection.GetConnectionInfo( i, connInfo ) ); + if ( connInfo().iIapId == aIAPId ) + { + User::LeaveIfError( iConnection.Attach( + connInfo, RConnection::EAttachTypeNormal ) ); + isConnected = ETrue; + break; + } + } + return isConnected; + } + +// --------------------------------------------------------------------------- +// CDhcpConnectionEngine::StateChangedL +// --------------------------------------------------------------------------- +// +void CDhcpConnectionEngine::StateChangedL () + { + switch(iProgressNotifier->GetState ()) + { + case EDhcpConnectStateConnected: + { + if (iStates==EConnectionStartup) + { + TRequestStatus *status = iClientStatus; + User::RequestComplete ( status, KErrNone ); + iStates = EIdle; + } + } + break; + } + } + + +// --------------------------------------------------------------------------- +// CDhcpConnectionEngine::ConnectL +// --------------------------------------------------------------------------- +// +void CDhcpConnectionEngine::ConnectL (TUint aIAPConnectionId, TRequestStatus& aStatus) + { + TRACESTRING( "CDhcpConnectionEngine::ConnectL" ); + aStatus = KRequestPending; + iClientStatus = &aStatus; + iIapProfileId = aIAPConnectionId; + iPreferences.SetIapId( iIapProfileId ); + iPreferences.SetDialogPreference( ECommDbDialogPrefDoNotPrompt ); + iConnection.Start( iPreferences, iStatus ); + iStates = ETurnConnectionOn; + SetActive (); + } + +// --------------------------------------------------------------------------- +// CDhcpConnectionEngine::RunL +// --------------------------------------------------------------------------- +// +void CDhcpConnectionEngine::RunL() + { + TRACESTRING2( "CDhcpConnectionEngine::RunL, %d ", iStates); + TRACESTRING2( "CDhcpConnectionEngine::RunL, %d ", iStatus.Int() ); + TInt retValue = iStatus.Int(); + if(retValue!=KErrNone) + { + // + // Even we failed to connect specified wlan network, we should continue with + // location query progress until the DHCPInform message has been send to someone. + // This is reason for that we complete with KErrNone in here. + // + TRequestStatus *status = iClientStatus; + User::RequestComplete ( status, KErrNone ); + iStates = EIdle; + } + else + { + switch (iStates) + { + case ETurnConnectionOn: + { + // Ok we just flag on until progress notification tells to us that + iStates = EConnectionStartup; + } + break; + } + } + } + +// End of file