/*
* 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;
ReportConnectionSelectionStart();
selected = settings->RunApplicationSettingsL( iUserSelection,
listedItems,
filter );
CleanupStack::PopAndDestroy( settings );
ReportConnectionSelectionEnd();
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);
}
}
void CConnectionEngine::ReportConnectionSelectionStart()
{
TInt noObservers = iObserverArray.Count();
while(noObservers)
{
noObservers--;
iObserverArray[noObservers]->ConnectionSelectionStart();
}
}
void CConnectionEngine::ReportConnectionSelectionEnd()
{
TInt noObservers = iObserverArray.Count();
while(noObservers)
{
noObservers--;
iObserverArray[noObservers]->ConnectionSelectionEnd();
}
}