--- /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 <commdbconnpref.h>
+#include <es_enum.h>
+#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<KCommsDbSvrMaxColumnNameLength> 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<CRsfwConnectionManager*>(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