engine/src/ConnectionEngine.cpp
changeset 2 29cda98b007e
child 13 f58e3c482bd9
--- /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);
+		}
+	}