diff -r 88ee4cf65e19 -r 1aa8c82cb4cb remotestoragefw/remotefileengine/src/rsfwconnectionmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/remotestoragefw/remotefileengine/src/rsfwconnectionmanager.cpp Wed Sep 01 12:15:08 2010 +0100 @@ -0,0 +1,424 @@ +/* +* Copyright (c) 2002-2004 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: Connection manager + * +*/ + + +// Copyright (C) 2002-2004 Nokia + +// INCLUDE FILES +#include +#include +#include "rsfwconnectionmanager.h" +#include "rsfwcommon.h" +#include "mdebug.h" + +// ============================ MEMBER FUNCTIONS ============================== + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::NewL +// ---------------------------------------------------------------------------- +// +EXPORT_C CRsfwConnectionManager* CRsfwConnectionManager::NewL( + MRsfwConnectionObserver* aConnectionObserver) + { + DEBUGSTRING(("CRsfwConnectionManager::NewL")); + CRsfwConnectionManager* self = new (ELeave) CRsfwConnectionManager(); + CleanupStack::PushL(self); + self->ConstructL(aConnectionObserver); + CleanupStack::Pop(self); + return self; + } + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::CRsfwConnectionManager +// ---------------------------------------------------------------------------- +// +CRsfwConnectionManager::CRsfwConnectionManager() +: CActive( EPriorityStandard ) + { + } + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::ConstructL +// ---------------------------------------------------------------------------- +// +void CRsfwConnectionManager::ConstructL( + MRsfwConnectionObserver* aConnectionObserver) + { + DEBUGSTRING(("CRsfwConnectionManager::ConstructL")); + iConnectionObserver = aConnectionObserver; + // Connect to the socket server + User::LeaveIfError(iSocketServ.Connect()); + // Add this to active scheduler + CActiveScheduler::Add( this ); + + iSuspensionTimer = CPeriodic::NewL(CActive::EPriorityLow); + } + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::~CRsfwConnectionManager +// ---------------------------------------------------------------------------- +// +EXPORT_C CRsfwConnectionManager::~CRsfwConnectionManager() + { + DEBUGSTRING(("CRsfwConnectionManager::~CRsfwConnectionManager")); + Cancel(); + iConnection.Close(); + iSocketServ.Close(); + iIaps.Close(); + + StopSuspensionTimer(); + delete iSuspensionTimer; + } + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::UseIapL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CRsfwConnectionManager::UseIapL(const TDesC& aIap) + { + // aIap may contain an IAP name or an IAP Id (or '?'/'*') + DEBUGSTRING(("IAP: %S", &aIap)); + + // Determine IAP selection policy + // By default, ask the user + iIapSelection = ERsfwIapSelectionAskUser; + if (aIap.CompareF(KIapDefaultPreferences) == 0) + { + // Use static CommDB preferences + iIapSelection = ERsfwIapSelectionUseDefaultPreferences; + } + else if (aIap.CompareF(KIapAskUser) == 0) + { + // Ask the user + } + else + { + // Build a table of acceptable IAPs. + // Now the table only contains one entry + TIapInfo iapInfo; + iapInfo.iId = 0; + iapInfo.iName.SetLength(0); + // try to retrieve ID or name based on aIap + TLex iapLex(aIap); + TInt err = iapLex.Val(iapInfo.iId, EDecimal); + if (err != KErrNone) + { + // The IAP name was given + iapInfo.iName.Copy(aIap); + } + if (LoadIapInfoL(iapInfo) == KErrNone) + { + iIaps.Append(iapInfo); + iIapSelection = ERsfwIapSelectionExplicit; + } + } + } + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::GetConnection +// ---------------------------------------------------------------------------- +// +EXPORT_C TInt CRsfwConnectionManager::GetConnection(RSocketServ*& aSocketServ, + RConnection*& aConnection) + { + DEBUGSTRING(("Get connection")); + TInt err = iConnection.Open(iSocketServ); + if (err == KErrNone) + { + TUint32 iapId = 0; + TCommDbDialogPref dialogPreference = ECommDbDialogPrefDoNotPrompt; + switch (iIapSelection) + { + case ERsfwIapSelectionAskUser: + iapId = 0; + dialogPreference = ECommDbDialogPrefPrompt; + break; + + case ERsfwIapSelectionUseDefaultPreferences: + break; + + case ERsfwIapSelectionExplicit: + iapId = iIaps[0].iId; + dialogPreference = ECommDbDialogPrefDoNotPrompt; + break; + + default: + break; + } + + err = StartConnection(iapId, dialogPreference); + if (err == KErrNone) + { + aSocketServ = &iSocketServ; + aConnection = &iConnection; + } + } + DEBUGSTRING(("Get connection returning %d", err)); + return err; + } + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::LoadIapInfoL +// ---------------------------------------------------------------------------- +// +TInt CRsfwConnectionManager::LoadIapInfoL(TIapInfo& aIapInfo) + { + DEBUGSTRING(("CRsfwConnectionManager::LoadIapInfoL")); + // Fetch CommDB data for a matching IAP Id or IAP Name + CCommsDatabase* commsDb = CCommsDatabase::NewL(); + CleanupStack::PushL(commsDb); + CCommsDbTableView* table; + if (aIapInfo.iId) + { + table = commsDb->OpenViewMatchingUintLC(TPtrC(IAP), + TPtrC(COMMDB_ID), + aIapInfo.iId); + } + else + { + table = commsDb->OpenViewMatchingTextLC(TPtrC(IAP), + TPtrC(COMMDB_NAME), + aIapInfo.iName); + } + TInt err = table->GotoFirstRecord(); + if (err != KErrNone) + { + DEBUGSTRING16(("Could not find IAP '%S' (id=%d)!", + &aIapInfo.iName, + aIapInfo.iId)); + CleanupStack::PopAndDestroy(2, commsDb); // table, commsDb + return KErrNotFound; + } + + // Read IAP information + table->ReadUintL(TPtrC(COMMDB_ID), aIapInfo.iId); + table->ReadTextL(TPtrC(COMMDB_NAME), aIapInfo.iName); + table->ReadTextL(TPtrC(IAP_BEARER_TYPE), aIapInfo.iBearerType); + TBuf serviceType; + table->ReadTextL(TPtrC(IAP_SERVICE_TYPE), serviceType); + TUint32 service; + table->ReadUintL(TPtrC(IAP_SERVICE), service); + // Find out the network + TUint32 networkId; + table->ReadUintL(TPtrC(IAP_NETWORK), networkId); + CleanupStack::PopAndDestroy(table); // table + + table = commsDb->OpenViewMatchingUintLC(TPtrC(NETWORK), + TPtrC(COMMDB_ID), + networkId); + err = table->GotoFirstRecord(); + if (err == KErrNone) + { + table->ReadTextL(TPtrC(COMMDB_NAME), aIapInfo.iNetworkName); + } + else + { + DEBUGSTRING(("Could not find network for the IAP!")); + } + CleanupStack::PopAndDestroy(table); // table + + aIapInfo.iServiceName.Zero(); + aIapInfo.iSsId.Zero(); + + CleanupStack::PopAndDestroy(commsDb); // commsDb + + + aIapInfo.iBearerQuality = ERsfwConnectionQualityStrong; + + DEBUGSTRING16(("found IAP %S: id=%d, servicetype=%S, service=%d, network=%S, servicename=%S, ssid=%S, bearer=%S, quality=%d", + &aIapInfo.iName, + aIapInfo.iId, + &serviceType, + service, + &aIapInfo.iNetworkName, + &aIapInfo.iServiceName, + &aIapInfo.iSsId, + &aIapInfo.iBearerType, + aIapInfo.iBearerQuality)); + + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::StartConnection +// ---------------------------------------------------------------------------- +// +TInt CRsfwConnectionManager::StartConnection(TUint32 aIapId, + TCommDbDialogPref aDialogPreference) + { + DEBUGSTRING(("CRsfwConnectionManager::StartConnection with id %d", &aIapId)); + TCommDbConnPref connectionPref; + connectionPref.SetIapId(aIapId); + connectionPref.SetDialogPreference(aDialogPreference); + connectionPref.SetDirection(ECommDbConnectionDirectionOutgoing); + DEBUGSTRING(("Starting connection to IAP %d with pref %d", + aIapId, + aDialogPreference)); + TInt err = iConnection.Start(connectionPref); + DEBUGSTRING(("Connection starting returned %d", err)); + // start observing the connection, any events will occur in RunL() function + if ( !IsActive() ) + { + iConnection.ProgressNotification(iProgress, iStatus); + SetActive(); + } + else + { + DEBUGSTRING(("StartConnection called twice!")); + Cancel(); + + DEBUGSTRING(("StartConnection Cancel!")); + + iConnection.ProgressNotification(iProgress, iStatus); + DEBUGSTRING(("CRsfwConnectionManager iConnection.ProgressNotification!")); + + SetActive(); + + } + return err; + } + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::HandleDisconnectionEventL +// ---------------------------------------------------------------------------- +// +void CRsfwConnectionManager::HandleDisconnectionEventL() + { + DEBUGSTRING(("CRsfwConnectionManager::HandleDisconnectionEventL")); + if (iConnectionObserver) + { + iConnectionObserver->HandleConnectionEventL( + ERsfwConnectionObserverEventConnectionDisconnected, + NULL); + } + } + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::StartSuspensionTimer +// ---------------------------------------------------------------------------- +// +void CRsfwConnectionManager::StartSuspensionTimer() + { + DEBUGSTRING(("CRsfwConnectionManager::StartSuspensionTimer")); + if (iSuspensionTimer) + { + const TInt KRsfwGPRSSuspensionTimeout = 60 * 1000000; // 60 sec + + DEBUGSTRING(("GPRS suspension timer started (%d us)", + KRsfwGPRSSuspensionTimeout)); + iSuspensionTimer->Cancel(); + TCallBack callBack(CRsfwConnectionManager::SuspensionTimerExpiredL, this); + iSuspensionTimer->Start(KRsfwGPRSSuspensionTimeout, + KRsfwGPRSSuspensionTimeout, + callBack); + } + } + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::StopSuspensionTimer +// ---------------------------------------------------------------------------- +// +void CRsfwConnectionManager::StopSuspensionTimer() + { + DEBUGSTRING(("CRsfwConnectionManager::StopSuspensionTimer")); + if (iSuspensionTimer) + { + DEBUGSTRING(("GPRS suspension timer stopped")); + iSuspensionTimer->Cancel(); + } + } + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::SuspensionTimerExpired +// ---------------------------------------------------------------------------- +// +TInt CRsfwConnectionManager::SuspensionTimerExpiredL(TAny* aArg) + { + DEBUGSTRING(("GPRS suspension timer expired")); + CRsfwConnectionManager* connMan = static_cast(aArg); + connMan->StopSuspensionTimer(); + connMan->HandleDisconnectionEventL(); + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::RunL +// ---------------------------------------------------------------------------- +// +void CRsfwConnectionManager::RunL() + { + TInt status = iStatus.Int(); + DEBUGSTRING(("CRsfwConnectionManager::RunL %d", &status)); + TInt stage = iProgress().iStage; + TInt error = iProgress().iError; + DEBUGSTRING(("ConnectionManager::RunL - status: %d, stage: %d, error: %d", status, stage, error)); + + if ( error == KErrConnectionTerminated || error == KErrDisconnected + || stage == KLinkLayerClosed || stage == KConnectionClosed ) + { + // KErrDisconnected occurs if WLAN goes out of range + // KErrConnectionTerminated occurs if user cancels connection from "Active connections" menu + // stage values KLinkLayerClosed & KConnectionClosed should be generated by GPRS + // (however GPRS usually generates KDataTransferTemporarilyBlocked event) + HandleDisconnectionEventL(); + } + else if ( stage == KDataTransferTemporarilyBlocked ) + { + // KDataTransferTemporarilyBlocked means GPRS 'suspend' event + // start timer, when it expires we will disconnect + StartSuspensionTimer(); + } + else if ( stage == KLinkLayerOpen ) + { + // KLinkLayerOpen may mean GPRS 'resume' event + StopSuspensionTimer(); + } + else + { + // ignore the event + } + + // request new events if necessary + iConnection.ProgressNotification(iProgress, iStatus, KConnProgressDefault); + SetActive(); + } + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::RunError +// ---------------------------------------------------------------------------- +// +#ifdef _DEBUG +TInt CRsfwConnectionManager::RunError(TInt aError) +#else +TInt CRsfwConnectionManager::RunError(TInt /*aError*/) +#endif + { + DEBUGSTRING(("ConnectionManager::RunErrorL - error: %d", aError)); + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CRsfwConnectionManager::DoCancel +// ---------------------------------------------------------------------------- +// +void CRsfwConnectionManager::DoCancel() + { + DEBUGSTRING(("CRsfwConnectionManager::::DoCancel()")); + //cancel request issued by ProgressNotification() + iConnection.CancelProgressNotification(); + } +// End of File