--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commondrm/drmutility/src/drmutilityconnection.cpp Tue Aug 31 15:29:38 2010 +0300
@@ -0,0 +1,562 @@
+/*
+ * Copyright (c) 2010 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 for DRM
+ *
+ */
+
+// INCLUDE FILES
+#include <es_sock.h>
+#include <cmconnectionmethod.h>
+#include <cmdestination.h>
+#include <cmconnectionmethoddef.h>
+#include <cmmanager.h>
+#include <extendedconnpref.h>
+#include <cmapplicationsettingsui.h> // CCmApplicationSettingsUi
+#include <es_enum.h>
+#include <cdbcols.h> // IAP, COMMDB_ID
+#include "drmutilityconnection.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "drmutilityconnectionTraces.h"
+#endif
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+// -----------------------------------------------------------------------------
+// HasDefaultConnectionL
+// Finds default IAP id
+// @return Etrue: valid AP found
+// EFalse: valid AP not found
+// @leave system wide error codes
+// -----------------------------------------------------------------------------
+//
+TBool DRM::CDrmUtilityConnection::HasDefaultConnectionL()
+ {
+ TBool hasDefault(EFalse);
+ TCmDefConnValue defConn;
+ RCmManager cmManager;
+ cmManager.OpenLC();
+ cmManager.ReadDefConnL(defConn);
+ if (defConn.iType == ECmDefConnConnectionMethod)
+ {
+ cmManager.GetConnectionMethodInfoIntL(defConn.iId,
+ CMManager::ECmIapId);
+ hasDefault = ETrue;
+ }
+ else if (defConn.iType == ECmDefConnDestination)
+ {
+ RCmDestination dest(cmManager.DestinationL(defConn.iId));
+ CleanupClosePushL(dest);
+
+ if (dest.ConnectionMethodCount() <= 0)
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ RCmConnectionMethod cMeth(dest.ConnectionMethodL(0));
+ CleanupClosePushL(cMeth);
+
+ cMeth.GetIntAttributeL(CMManager::ECmIapId);
+ CleanupStack::PopAndDestroy(&cMeth);
+ CleanupStack::PopAndDestroy(&dest);
+ hasDefault = ETrue;
+ }
+ CleanupStack::PopAndDestroy(&cmManager);
+ return hasDefault;
+ }
+
+// -----------------------------------------------------------------------------
+// CDrmUtilityConnection::HasAccessPointsL
+// -----------------------------------------------------------------------------
+//
+TBool DRM::CDrmUtilityConnection::HasAccessPointsL()
+ {
+ TInt apCount(0);
+ RCmManager cmManager;
+ CleanupClosePushL(cmManager);
+ cmManager.OpenL();
+ RArray<TUint32> aps;
+ CleanupClosePushL(aps);
+ cmManager.ConnectionMethodL(aps, EFalse, EFalse, ETrue);
+ apCount = aps.Count();
+ CleanupStack::PopAndDestroy(2, &cmManager); //aps, cmManager
+ return apCount > 0;
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::NewLC
+// ---------------------------------------------------------------------------
+//
+DRM::CDrmUtilityConnection* DRM::CDrmUtilityConnection::NewLC(
+ const TBool aAllowQueries)
+ {
+ CDrmUtilityConnection* conn = new (ELeave) CDrmUtilityConnection(
+ aAllowQueries);
+ CleanupStack::PushL(conn);
+ conn->ConstructL();
+ return conn;
+ }
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::NewL
+// ---------------------------------------------------------------------------
+//
+DRM::CDrmUtilityConnection* DRM::CDrmUtilityConnection::NewL(
+ const TBool aAllowQueries)
+ {
+ CDrmUtilityConnection* conn = CDrmUtilityConnection::NewLC(aAllowQueries);
+ CleanupStack::Pop(conn);
+ return conn;
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::~CDrmUtilityConnection
+// ---------------------------------------------------------------------------
+//
+DRM::CDrmUtilityConnection::~CDrmUtilityConnection()
+ {
+ Cancel();
+ iConnection.Close();
+ iSocketServ.Close();
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::ConnectL
+// ---------------------------------------------------------------------------
+//
+void DRM::CDrmUtilityConnection::ConnectL(TRequestStatus* aStatus)
+ {
+ TInt error(KErrGeneral);
+ iStatus = KRequestPending;
+
+ if (iState == EInit)
+ {
+
+ // Make this part atomic by pushing closes on the stack.
+ error = iSocketServ.Connect();
+ if (!error)
+ {
+ error = iConnection.Open(iSocketServ);
+ }
+ }
+
+ if (iState == EConnected)
+ {
+ error=iConnection.Stop();
+ //error=iConnection.Stop(RConnection::EStopAuthoritative); //just in case still does not work
+ // if autoriative stop does not work then must do something following follow
+ // TNifProgressBuf iJalla;
+ // loop iConnection.ProgressNotification(iJalla,iStatus,KConnProgressDefault); SetActive
+ // at RunL if (iJalla.iStage < KConnectionDown)
+ // reactiveteWaitClose();
+ //iConnection.ProgressNotification(iJalla,iStatus,(KConnectionDown); (should loop till state KConnectionDown seen)
+ iConnection.Close();
+ iState = EInit;
+ error = KErrNone;
+ error = iConnection.Open(iSocketServ);
+ }
+
+ iParentStatus = aStatus;
+ *iParentStatus = KRequestPending;
+
+ CompleteSelf(error);
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::HasMoreConnectionAttempts
+// ---------------------------------------------------------------------------
+//
+TBool DRM::CDrmUtilityConnection::HasMoreConnectionAttempts()
+ {
+ TBool ret(EFalse);
+ switch (iType)
+ {
+ case EUsingPurposeInternet:
+ if (iAllowQueries)
+ {
+ ret = ETrue;
+ }
+ else
+ {
+ ret = EFalse;
+ }
+ break;
+ case EUsingQuery:
+ case EFail:
+ ret = EFalse;
+ break;
+ default:
+ ret = ETrue;
+ }
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::IsConnected
+// ---------------------------------------------------------------------------
+//
+TBool DRM::CDrmUtilityConnection::IsConnected(TUint32& aIap)
+ {
+ TBool ret(EFalse);
+
+ if (iState == EConnected)
+ {
+ aIap = iIapId;
+ ret = ETrue;
+ }
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::Close
+// ---------------------------------------------------------------------------
+//
+void DRM::CDrmUtilityConnection::Close()
+ {
+ //LOGLIT( "CDrmUtilityConnection::Close" )
+
+ Cancel();
+ iConnection.Close();
+ iSocketServ.Close();
+ iState = EInit;
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection:CDrmUtilityConnection:
+// ---------------------------------------------------------------------------
+//
+DRM::CDrmUtilityConnection::CDrmUtilityConnection(const TBool aAllowQueries) :
+ CActive(CActive::EPriorityStandard), iState(EInit),
+ iType(EAttachExisting), iAllowQueries(aAllowQueries)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::ConstructL
+// ---------------------------------------------------------------------------
+//
+void DRM::CDrmUtilityConnection::ConstructL()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::DoCancel
+// ---------------------------------------------------------------------------
+//
+void DRM::CDrmUtilityConnection::DoCancel()
+ {
+ iConnection.Close();
+ iSocketServ.Close();
+ CompleteParent(KErrCancel);
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::RunL
+// ---------------------------------------------------------------------------
+//
+void DRM::CDrmUtilityConnection::RunL()
+ {
+ TInt error(iStatus.Int());
+ if (iState == EInit)
+ {
+ User::LeaveIfError(error); // Handle errors in RunError().
+ if (iType == EAttachExisting)
+ {
+ AttachExistingConnectionL();
+ }
+ else
+ {
+ iState = EConnecting;
+ error = KErrNotFound;
+ CompleteSelf(error);
+ }
+ }
+ else if (iState == EConnecting)
+ {
+ if (!error)
+ {
+ iState = EConnected;
+ CompleteSelf(error);
+ }
+ else if (error != KErrNotFound)
+ {
+ User::LeaveIfError(error);
+ }
+ else
+ {
+ switch (iType)
+ {
+ case EAttachExisting:
+ iType = EUsingDefault;
+ ConnectUsingDefaultL();
+ break;
+ case EUsingDefault:
+ iType = EUsingPurposeOperator;
+ ConnectUsingSnapPurposeL(CMManager::ESnapPurposeOperator);
+ break;
+ case EUsingPurposeOperator:
+ iType = EUsingPurposeInternet;
+ ConnectUsingSnapPurposeL(CMManager::ESnapPurposeInternet);
+ break;
+ case EUsingPurposeInternet:
+ iType = EUsingQuery;
+ if (iAllowQueries)
+ {
+ ConnectUsingQueryL();
+ break;
+ }
+ case EUsingQuery:
+ iType = EFail;
+ case EFail:
+ default:
+ User::Leave(KErrCouldNotConnect);
+ break;
+ }
+ }
+ }
+ else if (iState == EConnected)
+ {
+ UpdateIapIdL();
+ CompleteParent(iStatus.Int());
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::RunError
+// ---------------------------------------------------------------------------
+//
+TInt DRM::CDrmUtilityConnection::RunError(TInt aError)
+ {
+ //LOGLIT( "CDrmUtilityConnection::RunError" )
+
+ iConnection.Close();
+ iSocketServ.Close();
+
+ CompleteParent(aError);
+ iState = EInit;
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::AttachExistingConnectionL
+// ---------------------------------------------------------------------------
+//
+void DRM::CDrmUtilityConnection::AttachExistingConnectionL()
+ {
+ TConnectionInfoBuf connInfo;
+ TUint count(0);
+ TInt error(KErrNotFound);
+ iStatus = KRequestPending;
+
+ User::LeaveIfError(iConnection.EnumerateConnections(count));
+ if (count)
+ {
+ // Select AP with largest index. (Latest created)
+ User::LeaveIfError(iConnection.GetConnectionInfo(count, connInfo));
+ User::LeaveIfError(iConnection.Attach(connInfo,
+ RConnection::EAttachTypeNormal));
+ iState = EConnected;
+ error = KErrNone;
+ }
+ else
+ {
+ iState = EConnecting;
+ }
+ CompleteSelf(error);
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::ConnectUsingDefaultL
+// ---------------------------------------------------------------------------
+//
+void DRM::CDrmUtilityConnection::ConnectUsingDefaultL()
+ {
+ // Create overrides
+ TConnPrefList prefList;
+ TExtendedConnPref prefs;
+
+ if (!iAllowQueries)
+ {
+ prefs.SetNoteBehaviour(TExtendedConnPref::ENoteBehaviourConnSilent);
+ }
+ else
+ {
+ prefs.SetNoteBehaviour(TExtendedConnPref::ENoteBehaviourConnDisableQueries);
+ }
+
+ //Fetch default connection
+ TBool hasDefault(ETrue);
+ TCmDefConnValue defConn;
+ RCmManager cmManager;
+ cmManager.OpenLC();
+ cmManager.ReadDefConnL(defConn);
+ if (defConn.iType == ECmDefConnConnectionMethod)
+ {
+ prefs.SetIapId(defConn.iId);
+ }
+ else if (defConn.iType == ECmDefConnDestination)
+ {
+ prefs.SetSnapId(defConn.iId);
+ }
+ else
+ {
+ hasDefault = EFalse;
+ }
+ // End of fetch default connection
+ CleanupStack::PopAndDestroy(&cmManager);
+ if (hasDefault)
+ {
+ prefList.AppendL(&prefs);
+
+ // Start an Outgoing Connection with overrides
+ iState = EConnecting;
+ iConnection.Start(prefList, iStatus);
+ SetActive();
+ }
+ else
+ {
+ // No default found --> next iteration needed
+ CompleteSelf(KErrNotFound);
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::ConnectUsingSnapOperatorL
+// ---------------------------------------------------------------------------
+//
+void DRM::CDrmUtilityConnection::ConnectUsingSnapPurposeL(
+ const TUint32 aPurpose)
+ {
+ // Create overrides
+ TConnPrefList prefList;
+ TExtendedConnPref prefs;
+ prefs.SetSnapPurpose(static_cast<CMManager::TSnapPurpose> (aPurpose));
+ if (aPurpose != CMManager::ESnapPurposeUnknown)
+ {
+ if (!iAllowQueries)
+ {
+ prefs.SetNoteBehaviour(
+ TExtendedConnPref::ENoteBehaviourConnSilent);
+ }
+ else
+ {
+ prefs.SetNoteBehaviour(
+ TExtendedConnPref::ENoteBehaviourConnDisableQueries);
+ }
+ }
+ else
+ {
+ prefs.SetConnSelectionDialog(ETrue);
+ prefs.SetNoteBehaviour(TExtendedConnPref::ENoteBehaviourDefault);
+ prefs.SetForcedRoaming(EFalse);
+ prefs.SetBearerSet(TExtendedConnPref::EExtendedConnBearerUnknown);
+ }
+ prefList.AppendL(&prefs);
+ iState = EConnecting;
+
+ // Start an Outgoing Connection with overrides
+ iConnection.Start(prefList, iStatus);
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::ConnectUsingQueryL
+// ---------------------------------------------------------------------------
+//
+void DRM::CDrmUtilityConnection::ConnectUsingQueryL()
+ {
+ // Create overrides
+ TConnPrefList prefList;
+ TExtendedConnPref prefs;
+
+ CCmApplicationSettingsUi* ui(CCmApplicationSettingsUi::NewLC());
+ TCmSettingSelection selectedConn;
+
+ TBool selected(ui->RunApplicationSettingsL(selectedConn));
+ CleanupStack::PopAndDestroy(ui);
+ ui=NULL;
+ if (selected)
+ {
+ if (selectedConn.iResult == CMManager::EConnectionMethod)
+ {
+ prefs.SetIapId(selectedConn.iId);
+ }
+ else if (selectedConn.iResult == CMManager::EDestination)
+ {
+ prefs.SetSnapId(selectedConn.iId);
+ }
+ else if (selectedConn.iResult != CMManager::EDefaultConnection)
+ {
+ selected=EFalse;
+ }
+ }
+ if (selected)
+ {
+ if (selectedConn.iResult != CMManager::EDefaultConnection)
+ {
+ prefList.AppendL(&prefs);
+ // For ensuring possibly stale connections get disconnected first;
+ iConnection.Close();
+ iConnection.Open(iSocketServ);
+
+ iConnection.Start(prefList, iStatus);
+ }
+ else
+ {
+ iConnection.Start(iStatus);
+ }
+ SetActive();
+ }
+ else
+ {
+ CompleteSelf(KErrCancel);
+ }
+ }
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::CompleteSelf
+// ---------------------------------------------------------------------------
+//
+void DRM::CDrmUtilityConnection::CompleteSelf(TInt aError)
+ {
+ TRequestStatus* status(&iStatus);
+ User::RequestComplete(status, aError);
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::CompleteParent
+// ---------------------------------------------------------------------------
+//
+void DRM::CDrmUtilityConnection::CompleteParent(TInt aError)
+ {
+ if (iParentStatus)
+ {
+ User::RequestComplete(iParentStatus, aError);
+ iParentStatus = NULL;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// DRM::CDrmUtilityConnection::UpdateIapId
+// ---------------------------------------------------------------------------
+//
+void DRM::CDrmUtilityConnection::UpdateIapIdL()
+ {
+ TBuf<16> query;
+
+ query.Format(_L("%s\\%s"), IAP, COMMDB_ID);
+ User::LeaveIfError(iConnection.GetIntSetting(query, iIapId));
+
+ }