diff -r 5f8e5adbbed9 -r 29cda98b007e engine/src/ConnectionEngine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/src/ConnectionEngine.cpp Thu Feb 25 14:29:19 2010 +0000 @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2007-2010 Sebastian Brannstrom, Lars Persson, EmbedDev AB + * + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of the License "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: + * EmbedDev AB - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +#include "connectionengine.h" +#include "settingsengine.h" +#include "podcastmodel.h" + +CConnectionEngine* CConnectionEngine::NewL(CPodcastModel& aPodcastModel) + { + CConnectionEngine* self = new (ELeave) CConnectionEngine(aPodcastModel); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CConnectionEngine::~CConnectionEngine() + { + delete iMobility; + + Cancel(); + + iConnection.Close(); + + iSocketServer.Close(); + + iObserverArray.Close(); + } + +CConnectionEngine::CConnectionEngine(CPodcastModel& aPodcastModel): + CActive(CActive::EPriorityStandard),iPodcastModel(aPodcastModel) + { + CActiveScheduler::Add(this); + } + +void CConnectionEngine::ConstructL() + { + User::LeaveIfError(iSocketServer.Connect()); + User::LeaveIfError( iConnection.Open( iSocketServer ) ); + } + +void CConnectionEngine::RunL() + { + if ( iStatus.Int() == KErrNone ) + { + delete iMobility; + iMobility = NULL; + iMobility = CActiveCommsMobilityApiExt::NewL( iConnection, *this ); + } + + iConnectionState = iStatus.Int() == KErrNone?CConnectionEngine::EConnected:CConnectionEngine::ENotConnected; + ReportConnection( iStatus.Int() ); + } + +void CConnectionEngine::DoCancel() + { + } + +TInt CConnectionEngine::RunError( TInt /*aError*/ ) + { + return KErrNone; + } + +void CConnectionEngine::PreferredCarrierAvailable( TAccessPointInfo /*aOldAPInfo*/, + TAccessPointInfo /*aNewAPInfo*/, + TBool aIsUpgrade, + TBool aIsSeamless ) + { + if ( aIsUpgrade ) + { + } + else + { + } + + if ( aIsSeamless ) + { + // in S60 3.2, this situation cannot occur. + } + else + { + // Sockets have to be closed at this point. + + iMobility->MigrateToPreferredCarrier(); + } + + } + +void CConnectionEngine::NewCarrierActive( TAccessPointInfo /*aNewAPInfo*/, TBool aIsSeamless ) + { + if ( aIsSeamless ) + { + // in S60 3.2, this situation cannot occur. + + } + else + { + // Sockets have to be re-opened and check they can connect + // to their server at this point. + + iMobility->NewCarrierAccepted(); + } + } + +void CConnectionEngine::Error( TInt /*aError*/ ) + { + + } + +TBool CConnectionEngine::ConnectionSettingL() + { + TBool selected( EFalse ); + + CCmApplicationSettingsUi* settings = CCmApplicationSettingsUi::NewL(); + CleanupStack::PushL( settings ); + + TUint listedItems = + CMManager::EShowDefaultConnection | + CMManager::EShowDestinations; + + TBearerFilterArray filter; + + selected = settings->RunApplicationSettingsL( iUserSelection, + listedItems, + filter ); + + CleanupStack::PopAndDestroy( settings ); + + return selected; + } + + +void CConnectionEngine::StartL(TConnectionType aConnectionType) + { + DP1("CConnectionEngine::StartL, aConnectionType=%d", aConnectionType); + + iConnection.Close(); + User::LeaveIfError( iConnection.Open( iSocketServer ) ); + // Connect using UI Setting + if(aConnectionType == EDefaultConnection) + { + iConnection.Start( iStatus ); + SetActive(); + } + else if(aConnectionType == EUserSelectConnection) + { + TBool selected = ConnectionSettingL(); + + if ( selected ) + { + switch ( iUserSelection.iResult ) + { + case CMManager::EDestination: + { + iSnapPreference.SetSnap( iUserSelection.iId ); + iConnection.Start( iSnapPreference, iStatus ); + aConnectionType = ESNAPConnection; + break; + } + default: // CMManager::EAlwaysAsk + case CMManager::EDefaultConnection: + { + iConnection.Start( iStatus ); + break; + } + } + } + else + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrCancel); + } + + SetActive(); + } + else if (aConnectionType == EIAPConnection) + { + iCommdbPreference.SetIapId((iPodcastModel.SettingsEngine().SpecificIAP()& KUseIAPMask)); + iCommdbPreference.SetDialogPreference(ECommDbDialogPrefDoNotPrompt); + iCommdbPreference.SetDirection(ECommDbConnectionDirectionOutgoing); + iConnection.Start( iCommdbPreference, iStatus ); + SetActive(); + } + // Connect using SNAP + else + { + iSnapPreference.SetSnap(iPodcastModel.SettingsEngine().SpecificIAP()); + iConnection.Start( iSnapPreference, iStatus ); + SetActive(); + } + + iConnectionType = aConnectionType; + iConnectionState = CConnectionEngine::EConnecting; + } + +RConnection& CConnectionEngine::Connection() + { + return iConnection; + } + +CConnectionEngine::TConnectionState CConnectionEngine::ConnectionState() + { + TInt selectedConn = (TInt) iSnapPreference.Snap(); + TInt specIAPSNAP = iPodcastModel.SettingsEngine().SpecificIAP(); + // If we have IAP preference then get that from our current connection and mask out the selected iap + if((specIAPSNAP&KUseIAPFlag)) + { + selectedConn = iCommdbPreference.IapId(); + specIAPSNAP = specIAPSNAP&KUseIAPMask; + } + + // IAPSNAP must be > 0 and then if the IAP/Sel conn IAP differs + if(specIAPSNAP >0 && specIAPSNAP != selectedConn ) + { + if(iConnection.SubSessionHandle() != 0) + { + iConnection.Stop(); + } + + iConnectionState = CConnectionEngine::ENotConnected; + } + else + { + // We have a user selection or default selction, check our current connection state. + TNifProgress progress; + if(iConnection.Progress(progress) == KErrNone) + { + if(progress.iError == KErrNone && progress.iStage != 0) + { + if(progress.iStage == KLinkLayerOpen) + { + iConnectionState = CConnectionEngine::EConnected; + } + } + else if(iConnectionState != CConnectionEngine::EConnecting) + { + iConnectionState = CConnectionEngine::ENotConnected; + } + } + else + { + iConnectionState = CConnectionEngine::ENotConnected; + } + } + + return iConnectionState; + } + +void CConnectionEngine::AddObserver(MConnectionObserver* aObserver) + { + iObserverArray.Append(aObserver); + } + +RSocketServ& CConnectionEngine::SockServ() + { + return iSocketServer; + } + + +void CConnectionEngine::ReportConnection(TInt aError) + { + TInt noObservers = iObserverArray.Count(); + while(noObservers) + { + noObservers--; + iObserverArray[noObservers]->ConnectCompleteL(aError); + } + }