diff -r 50c53e893c3f -r 1221b68b8a5f commondrm/drmutility/src/drmutilityconnection.cpp --- /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 +#include +#include +#include +#include +#include +#include // CCmApplicationSettingsUi +#include +#include // 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 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 (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)); + + }