diff -r 000000000000 -r b497e44ab2fc syncmlfw/common/http/src/nsmldialiap.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/common/http/src/nsmldialiap.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,415 @@ +/* +* Copyright (c) 2002 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: SyncML HTTP client +* +*/ + +#include +#include +#include // FeatureManager +#include +#include +#include +#include +#include "nsmldialiap.h" +#include +#include "nsmlerror.h" + + +//------------------------------------------------------------ +// CNSmlDialUpAgent::CNSmlDialUpAgent() +// constructor +//------------------------------------------------------------ +CNSmlDialUpAgent::CNSmlDialUpAgent() + : CActive( EPriorityStandard ){} +//------------------------------------------------------------ +// CNSmlDialUpAgent::~CNSmlDialUpAgent() +// desctructor +//------------------------------------------------------------ +CNSmlDialUpAgent::~CNSmlDialUpAgent() + { + FeatureManager::UnInitializeLib(); + Cancel(); + // close handles for sure + if( !iCancelCalled && iSocketConnection ) + { + iConnection.SetOpt( KCOLProvider, KConnDisableTimers, EFalse ); + iConnection.Close(); + iSocketServer.Close(); + } + } +// -------------------------------------------------------------------- +// CNSmlDialUpAgent::ConstructL() +// 2-phase +// -------------------------------------------------------------------- +void CNSmlDialUpAgent::ConstructL() + { + DBG_FILE( _S8("CNSmlDialUpAgent::ConstructL") ); + CActiveScheduler::Add( this ); + iCancelCalled = EFalse; + iSocketConnection = EFalse; + FeatureManager::InitializeLibL(); + } +//------------------------------------------------------------ +// CNSmlDialUpAgent::DoCancel() +// DoCancel() from CActive +//------------------------------------------------------------ +void CNSmlDialUpAgent::DoCancel() + { + DBG_FILE( _S8("CNSmlDialUpAgent::DoCancel...") ); + iCancelCalled = ETrue; + if(iSocketConnection) + { + iConnection.SetOpt( KCOLProvider, KConnDisableTimers, EFalse ); + iConnection.Close(); + iSocketServer.Close(); + iSocketConnection = EFalse; + } + } +//------------------------------------------------------------ +// CNSmlDialUpAgent::RunL() +// Runl() from CActive +// called when asynchronous request completed +//------------------------------------------------------------ +void CNSmlDialUpAgent::RunL() + { + DBG_FILE_CODE( iStatus.Int(), _S8("CNSmlDialUpAgent::RunL with status") ); + + /** + In 2G Calls , data and voice are not allowed in same channel + If the error code is KErrGprsServicesNotAllowed and if access point is + not Always ask, every minute retry is made , max for 35 times + **/ + TInt isAccessPointDefined = EFalse; + if (static_cast(iIAPid) == -2) + { + RCmManager cmmgr; + cmmgr.OpenL(); + TCmDefConnValue defConnValue; + cmmgr.ReadDefConnL(defConnValue); + cmmgr.Close(); + if(defConnValue.iType == ECmDefConnDestination) + { + isAccessPointDefined = ETrue; + } + } + else + { + if(static_cast(iIAPid)!=-1) + { + isAccessPointDefined = ETrue; + } + } + if( iRetryCounterCount() ) + { + this->Cancel(); + iIAPid = iIAPArray->At( iIAPCnt ); + DoSettingsL(); + + iIAPCnt++; + + TRAPD( ret, StartDatacallL() ); + if ( ret != KErrNone ) + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, ret ); + } + } + else + { + if ( iStatus.Int() == KErrCancel ) + { + this->Cancel(); + iStatus = KErrCancel; + } + else if ( iStatus.Int() != KErrNone ) + { + this->Cancel(); + iStatus = TNSmlError::ESmlCommunicationError; + } + if(iSocketConnection) + { + iConnection.SetOpt( KCOLProvider, KConnDisableTimers, ETrue ); + } + TRequestStatus* status = iEngineStatus; + User::RequestComplete( status, iStatus.Int() ); + } + } +// --------------------------------------------------------- +// CNSmlDialUpAgent::ConnectL( TUint aIAPid, TRequestStatus &aStatus ) +// Opens data call handle +// This is asynchronous request +// --------------------------------------------------------- +void CNSmlDialUpAgent::ConnectL( CArrayFixFlat* aIAPIdArray, TRequestStatus &aStatus ) + { + //DBG_FILE_CODE( aIAPid, _S8("CNSmlDialUpAgent::ConnectL") ); + // aStatus set pending from HTTP + iCancelCalled = EFalse; + iEngineStatus = &aStatus; + + iIAPCnt = 0; + iIAPArray = aIAPIdArray; + + + TBool connected( EFalse ); + TRAPD( err, ( connected = IsConnectedL() ) ); + if( err != KErrNone ) + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + } + if( !connected ) + { + iIAPid = iIAPArray->At( iIAPCnt ); + DoSettingsL(); + + iIAPCnt++; + + TRAPD( ret, StartDatacallL() ); + if ( ret != KErrNone ) + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, ret ); + } +/* + #ifdef __WINS__ + if ( !IsConnectedL() ) + { + if ( !IsConnectedL() ) // Double check + { + this->Cancel(); + iIAPCnt++; + } + else + { + callStarted = ETrue; + } + } + else + { + callStarted = ETrue; + } + #else + if ( !IsConnectedL() ) + { + this->Cancel(); + iIAPCnt++; + } + else + { + callStarted = ETrue; + } + #endif +*/ + + } + else + { + TRAPD( error, AttachToConnectionL() ); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, error ); + } + } +// --------------------------------------------------------- +// CNSmlDialUpAgent::StartDatacallL() +// Opens data call handle +// This is asynchronous request +// --------------------------------------------------------- +void CNSmlDialUpAgent::StartDatacallL() + { + DBG_FILE( _S8("CNSmlDialUpAgent::StartDatacallL") ); + SetActive(); + User::LeaveIfError( iSocketServer.Connect() ); + User::LeaveIfError( iConnection.Open( iSocketServer ) ); + iSocketConnection = ETrue; + if ( static_cast(iIAPid) == -1 ) + { + iConnection.Start( iPref, iStatus ); + } + else if( static_cast(iIAPid) == -2 ) // default connection + { + + iConnection.Start( iStatus ); + + } + else + { + iConnection.Start( iPref, iStatus ); + } + } + +// --------------------------------------------------------- +// CNSmlDialUpAgent::AttachToConnectionL() +// Attach to connection allready active +// +// --------------------------------------------------------- +void CNSmlDialUpAgent::AttachToConnectionL() + { + DBG_FILE( _S8("CNSmlDialUpAgent::AttachToConnectionL") ); + iStatus = KRequestPending; + SetActive(); + TConnectionInfo connectionInfo; + TConnectionInfoBuf connInfo( connectionInfo ); + + User::LeaveIfError( iSocketServer.Connect() ); + User::LeaveIfError( iConnection.Open( iSocketServer ) ); + + TUint count( 0 ); + User::LeaveIfError( iConnection.EnumerateConnections ( count ) ); + DBG_FILE_CODE( count, _S8("Number of connections ") ); + + if( count == 0 ) + { + iConnection.Close(); + iSocketServer.Close(); + User::Leave( KErrNotFound ); + } + else{ + for( TUint i=1; i<=count; ++i ) + { + User::LeaveIfError( iConnection.GetConnectionInfo( i, connInfo ) ); + DBG_FILE_CODE( connInfo().iIapId, _S8("Comparing IDs ") ); + if( connInfo().iIapId == iIAPid ) + { + DBG_FILE_CODE( iIAPid, _S8("Attaching to existing connection, IDs match") ); + User::LeaveIfError( iConnection.Attach( connInfo, RConnection::EAttachTypeNormal ) ); + break; + } + } + } + } +// --------------------------------------------------------- +// CNSmlDialUpAgent::IsConnectedL() +// Checks if data call is up or connecting +// --------------------------------------------------------- +TBool CNSmlDialUpAgent::IsConnectedL() const + { + DBG_FILE( _S8("CNSmlDialUpAgent::IsConnected") ); + TInt err( KErrNone ); + TBool isConnected( EFalse ); + TConnectionInfo connectionInfo; + TConnectionInfoBuf connInfo( connectionInfo ); + + RSocketServ serv; + CleanupClosePushL( serv ); + User::LeaveIfError( serv.Connect() ); + + RConnection conn; + CleanupClosePushL( conn ); + User::LeaveIfError( conn.Open( serv ) ); + + TUint count( 0 ); + User::LeaveIfError( conn.EnumerateConnections ( count ) ); + DBG_FILE_CODE( count, _S8("Number of connections ") ); + + if( count == 0 ) + { + CleanupStack::PopAndDestroy( 2 ); // conn, serv + return isConnected; + } + else{ + for( TUint i=1; i<=count; ++i ) + { + err = conn.GetConnectionInfo( i, connInfo ); + if( err != KErrNone ) + { + CleanupStack::PopAndDestroy( 2 ); // conn, serv + User::Leave( err ); + } + DBG_FILE_CODE( connInfo().iIapId, _S8("Comparing IDs ") ); + if( connInfo().iIapId == iIAPid ) + { + DBG_FILE( _S8("Connection allready active") ); + isConnected = ETrue; + break; + } + } + } + CleanupStack::PopAndDestroy( 2 ); // conn, serv + return isConnected; + } +// --------------------------------------------------------- +// CNSmlDialUpAgent::DoSettingsL() +// +// +// --------------------------------------------------------- +void CNSmlDialUpAgent::DoSettingsL() + { + DBG_FILE( _S8("CNSmlDialUpAgent::DoSettingsL") ); + iOffline=IsInOfflineModeL(); + if( static_cast(iIAPid) == -1 ) + { + if(iOffline) + { + iPref.SetDialogPreference( ECommDbDialogPrefPrompt ); + iPref.SetBearerSet(EApBearerTypeWLAN); + } + else + { + iPref.SetDialogPreference( ECommDbDialogPrefPrompt ); + iPref.SetBearerSet(EApBearerTypeAllBearers); + } + } + else if( iOffline && ( static_cast(iIAPid) == -2 ) ) // default connection + { + iPref.SetDialogPreference( ECommDbDialogPrefPrompt ); + iPref.SetBearerSet(EApBearerTypeWLAN); + } + else + { + iPref.SetIapId( iIAPid ); + iPref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt ); + } + } +//---------------------------------------------------------- +//CNsmlDialUpAgent::IsOfflineModeL() +TBool CNSmlDialUpAgent::IsInOfflineModeL() + { + TInt operationsAllowed( ECoreAppUIsNetworkConnectionAllowed ); + CRepository* rep = CRepository::NewLC( KCRUidCoreApplicationUIs ); + rep->Get(KCoreAppUIsNetworkConnectionAllowed, operationsAllowed ); + CleanupStack::PopAndDestroy(); //rep + + return ( operationsAllowed == ECoreAppUIsNetworkConnectionNotAllowed ) ? ETrue : EFalse; + }