--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/supl/locationomasuplprotocolhandler/protocolhandlerver1/src/epos_comasuplconnrequestor.cpp Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,589 @@
+/*
+ * Copyright (c) 2002-2005 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: Class for doing asynchronous service.
+ *
+ */
+
+
+
+#include "epos_comasuplprotocolmanager1.h"
+#include "epos_csuplcommunicationmanager.h"
+#include "epos_csuplsettingsinternal.h"
+
+#include "epos_omasuplconstants.h"
+#include "epos_comasuplconnrequestor.h"
+#include "epos_momasuplconnobserver.h"
+#include "epos_comasupltrace.h"
+#include "epos_comasuplfallbackhandler.h"
+
+#include "epos_comasupldialogtimer.h"
+_LIT(KTraceFileName,"SUPL_OMA_SESSION::epos_comasuplconnrequestor.cpp");
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::COMASuplConnRequestor
+// C++ constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+COMASuplConnRequestor::COMASuplConnRequestor(CSuplCommunicationManager& aCommMgr,
+ COMASUPLProtocolManager1& aProtoMgr,
+ TUint aPort,
+ MOMASuplConnObserver& aObserver):
+ CActive( EPriorityStandard ),
+ iCommMgr(aCommMgr),
+ iProtocolManager(aProtoMgr),
+ iPort(aPort),
+ iObserver( aObserver),
+ iIapDialogShown(EFalse),
+ iIapDlgTimerExpired(EFalse),
+ iIsTimeoutDialogTimerStarted(EFalse)
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+//void COMASuplConnRequestor::ConstructL(const TDesC8& aHostAddr)
+void COMASuplConnRequestor::ConstructL()
+ {
+ CActiveScheduler::Add( this );
+
+ iTLSAuthenticationFailed = EFalse;
+ iSuplSettings = CSuplSettingsInternal::NewL();
+ iTrace = COMASuplTrace::NewL();
+ iIsHSLPGenerated = EFalse;
+ iHslpAddrFromImsiUsed = EFalse;
+
+ iFallBackHandler = COMASuplFallBackHandler::NewL(*iSuplSettings);
+
+ iLastConnectionError = KErrNone;
+
+ iCurrentSLPId = KErrNotFound;
+
+ iDialogTimer = COMASuplDialogTimer::NewL(*this);
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+
+
+COMASuplConnRequestor* COMASuplConnRequestor::NewL( CSuplCommunicationManager& aCommMgr,COMASUPLProtocolManager1& aProtoMgr,
+ TUint aPort,MOMASuplConnObserver& aObserver)
+
+ {
+ COMASuplConnRequestor* self = new ( ELeave ) COMASuplConnRequestor(aCommMgr,aProtoMgr,aPort,
+ aObserver);
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::COMASuplConnRequestor
+// -----------------------------------------------------------------------------
+//
+COMASuplConnRequestor::~COMASuplConnRequestor()
+ {
+ Cancel();
+ if(iDialogTimer)
+ {
+ iDialogTimer->Cancel();
+ delete iDialogTimer;
+ iDialogTimer = NULL;
+ }
+ delete iSuplSettings;
+ delete iTrace;
+ delete iFallBackHandler;
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::OpenConnection
+// -----------------------------------------------------------------------------
+//
+void COMASuplConnRequestor::CreateConnectionL()
+ {
+ TBuf<100> iapName;
+ TBuf<128> buffer;
+ iState = EConnecting;
+ TBool isIapDialogShown = EFalse;
+ TInt errorCode = iFallBackHandler->GetNextSLPAddressL(iCurrentSLPId,iHostAddress,iapName,iTls,iPskTls,iLastConnectionError,isIapDialogShown);
+
+ if(errorCode == KErrNone)
+ {
+ TBool ret = ConvertIAPNameToIdL(iapName,iIAPId);
+ if(!ret)
+ {
+ buffer.Copy(_L("No access point configured for "));
+ buffer.Append(iHostAddress);
+ iTrace->Trace(buffer,KTraceFileName, __LINE__);
+ if( isIapDialogShown )
+ {
+ TInt err = iProtocolManager.LaunchSettingsUI(this,iHostAddress);
+ if(err != KErrNone)
+ {
+ buffer.Copy(_L("Error in launching UI : "));
+ buffer.AppendNum(err);
+ iTrace->Trace(buffer,KTraceFileName, __LINE__);
+ iHostAddress.Zero();
+ iObserver.OperationCompleteL(err);
+ }
+ else
+ iIapDialogShown = ETrue;
+ }
+
+
+ }
+ else
+ {
+ iIsTimeoutDialogTimerStarted = EFalse;
+ iDialogTimer->Cancel();
+ buffer.Copy(_L("Connecting to "));
+ buffer.Append(iHostAddress);
+ iTrace->Trace(buffer,KTraceFileName, __LINE__);
+ iConnection = iCommMgr.CreateConnectionL(iHostAddress,iTls,iPskTls,iPort,iIAPId);
+ OpenConnection();
+ }
+ }
+ else
+ {
+ iHostAddress.Zero();
+ iObserver.OperationCompleteL(errorCode);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::OpenConnection
+// -----------------------------------------------------------------------------
+//
+void COMASuplConnRequestor::CreateConnectionL(TInt aDialogTimeOutDelay)
+ {
+ iIsTimeoutDialogTimerStarted = ETrue;
+
+ iDialogTimer->StartTimer(aDialogTimeOutDelay);
+ CreateConnectionL();
+ }
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::OpenConnection
+// -----------------------------------------------------------------------------
+//
+TInt COMASuplConnRequestor::GetLocalIPAddress(TInetAddr &aAddress)
+ {
+ if(iConnection)
+ {
+ return iConnection->GetLocalIPAddress(aAddress);
+ }
+
+ return KErrGeneral;
+
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::SendPacket
+// -----------------------------------------------------------------------------
+//
+void COMASuplConnRequestor::SendPacket(const TDesC8& aPacket)
+ {
+ if(iConnection)
+ {
+ iState = ESending;
+ iConnection->Send(aPacket,iStatus);
+ SetActive();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::OpenConnection
+// -----------------------------------------------------------------------------
+//
+void COMASuplConnRequestor::OpenConnection()
+ {
+
+ if(iIsSettingInitilized)
+ {
+ if(iConnection)
+ {
+ iState = EConnecting;
+ iConnection->Connect(iStatus);
+ SetActive();
+ }
+ }
+ else
+ {
+ InitilizeSetting();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::ListenToMessages
+// -----------------------------------------------------------------------------
+//
+void COMASuplConnRequestor::ListenToMessages()
+ {
+ if(iConnection)
+ {
+ iConnection->ListenToMessages();
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::CloseConnection
+// -----------------------------------------------------------------------------
+//
+void COMASuplConnRequestor::CloseConnection()
+ {
+
+ if(iConnection )
+ {
+ iConnection->CloseConnection();
+ iCommMgr.DestroyConnection(iConnection);
+ iConnection = NULL;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::RunL
+// -----------------------------------------------------------------------------
+//
+void COMASuplConnRequestor::RunL()
+ {
+ iLastConnectionError = iStatus.Int();
+
+ TBuf<64> buffer(_L("Error during connection : "));
+ buffer.AppendNum(iLastConnectionError);
+ iTrace->Trace(buffer,KTraceFileName, __LINE__);
+
+ switch(iState)
+ {
+
+ case EConnecting:
+ {
+ if(iLastConnectionError < 0)
+ {
+ iHostAddress.Zero();
+ CloseConnection();
+ CreateConnectionL();
+ }
+ else
+ {
+ ListenToMessages();
+ iObserver.OperationCompleteL(iLastConnectionError);
+ }
+ break;
+ }
+ case EInitilizeSetting:
+ {
+ if(iLastConnectionError == KErrNone)
+ {
+ iIsSettingInitilized = ETrue;
+ iTrace->Trace(_L("Setting API Initilizing Completed..."), KTraceFileName, __LINE__);
+ OpenConnection();
+ }
+ else
+ {
+ iTrace->Trace(_L("Setting API Initilizing Failed..."), KTraceFileName, __LINE__);
+ iObserver.OperationCompleteL(iLastConnectionError);
+ }
+ break;
+ }
+
+ case ESending:
+ {
+ iObserver.OperationCompleteL(iLastConnectionError);
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::RunError
+// -----------------------------------------------------------------------------
+//
+TInt COMASuplConnRequestor::RunError(TInt /* aError */)
+ {
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::DoCancel
+// -----------------------------------------------------------------------------
+//
+void COMASuplConnRequestor::DoCancel()
+ {
+ switch(iState)
+ {
+ case EConnecting:
+ if ( iConnection )
+ iConnection->CancelConnect(iStatus);
+ break;
+ case ESending:
+ if ( iConnection )
+ iConnection->CancelSend(iStatus);
+ break;
+ case EInitilizeSetting:
+ iSuplSettings->CancelInitialize();
+ default:
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::DoCancel
+// -----------------------------------------------------------------------------
+//
+void COMASuplConnRequestor::CancelReadOperation()
+ {
+ if(iConnection)
+ {
+ iConnection->CancelListenToMessages();
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::SetIAPID
+// -----------------------------------------------------------------------------
+//
+void COMASuplConnRequestor::SetIAPID(TInt aIAPID)
+ {
+ iIAPId = aIAPID;
+ }
+
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::InitilizeSetting
+// -----------------------------------------------------------------------------
+//
+void COMASuplConnRequestor::InitilizeSetting()
+ {
+ iTrace->Trace(_L("Intilizing Setting API..."), KTraceFileName, __LINE__);
+ iState = EInitilizeSetting;
+ iSuplSettings->Initialize(iStatus);
+ SetActive();
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::IsHslpGenerated
+// -----------------------------------------------------------------------------
+//
+void COMASuplConnRequestor::IsHslpGenerated(TBool aIsGenerated)
+ {
+ iIsHSLPGenerated = aIsGenerated;
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::IsHslpAddrFromImsiUsed
+// -----------------------------------------------------------------------------
+//
+TBool COMASuplConnRequestor::IsHslpAddrFromImsiUsed()
+ {
+ return iHslpAddrFromImsiUsed;
+ }
+
+TUint COMASuplConnRequestor::GetPortNumber()
+ {
+ return iConnection->GetPortNumberUsed();
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::SetDefaultParametersL
+// -----------------------------------------------------------------------------
+//
+void COMASuplConnRequestor::SetDefaultParametersL(const TDesC& aClientProvidedHSLPAddress,TBool aFallBackAllowed)
+ {
+ iFallBackHandler->SetFallBackParametersL(aClientProvidedHSLPAddress,aFallBackAllowed);
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::SetDefaultParametersL
+// -----------------------------------------------------------------------------
+//
+void COMASuplConnRequestor::GetUsedServerAddress(TDes& aHSLPAddressUsed)
+ {
+ aHSLPAddressUsed.Copy(iHostAddress);
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::ConvertIAPNameToIdL
+//
+// -----------------------------------------------------------------------------
+TBool COMASuplConnRequestor::ConvertIAPNameToIdL(const TDesC& aIAPName, TUint32& aIAPId)
+ {
+ TBool result = EFalse;
+ CCommsDatabase* commDb = CCommsDatabase::NewL(EDatabaseTypeIAP);
+ CleanupStack::PushL(commDb);
+ CCommsDbTableView* tableView = commDb->OpenIAPTableViewMatchingBearerSetLC(ECommDbBearerCSD|ECommDbBearerGPRS,
+ ECommDbConnectionDirectionOutgoing);
+ TInt retval = tableView->GotoFirstRecord();
+ while ((retval == KErrNone) && (!result))
+ {
+ HBufC * iap_name = tableView->ReadLongTextLC( TPtrC( COMMDB_NAME) );
+
+ iap_name->Des().LowerCase();
+ if (iap_name && (iap_name->Compare(aIAPName) == 0))
+ {
+ tableView->ReadUintL(TPtrC(COMMDB_ID), aIAPId);
+ result = ETrue;
+ }
+ CleanupStack::PopAndDestroy(); // iap_name
+ retval = tableView->GotoNextRecord();
+ }
+ CleanupStack::PopAndDestroy(2);//delete tableView and commDb
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::SettingsUICompleted
+//
+// -----------------------------------------------------------------------------
+
+void COMASuplConnRequestor::SettingsUICompletedL(TInt aError)
+ {
+ TBuf<128> buffer(_L("COMASuplConnRequestor:SettingsUICompleted Error: "));
+ buffer.AppendNum(aError);
+ iTrace->Trace(buffer,KTraceFileName, __LINE__);
+
+ if (iIsTimeoutDialogTimerStarted)
+ {
+ iTrace->Trace(_L("COMASuplSession::SettingsUICompleted, stopping timer "), KTraceFileName, __LINE__);
+ iIsTimeoutDialogTimerStarted = EFalse;
+ iDialogTimer->StopTimer();
+ }
+ if (iIapDlgTimerExpired)
+ {
+ iIapDlgTimerExpired = EFalse;
+ iIapDialogShown = EFalse;
+ iProtocolManager.LaunchSuplDialogTimeoutUI(this);
+ iObserver.OperationCompleteL(KErrNone);
+ return;
+ }
+ if(aError == KErrNone)
+ {
+ TBuf<100> IapName;
+ TInt err = iProtocolManager.GetLastUsedAccessPoint(IapName,iIAPId);
+ if(err == KErrNone)
+ {
+ buffer.Copy(_L("Connecting to "));
+ buffer.Append(iHostAddress);
+ buffer.Append(_L(" using IAP "));
+ buffer.Append(IapName);
+ iTrace->Trace(buffer,KTraceFileName, __LINE__);
+ iConnection = iCommMgr.CreateConnectionL(iHostAddress,iTls,iPskTls,iPort,iIAPId);
+ SaveAccessPoint(IapName);
+ OpenConnection();
+ }
+ else
+ {
+ iObserver.OperationCompleteL(err);
+ }
+ }
+ else
+ {
+ iObserver.OperationCompleteL(aError);
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::SaveAccessPoint
+//
+// -----------------------------------------------------------------------------
+void COMASuplConnRequestor::SaveAccessPoint(const TDesC& aIapName)
+ {
+ TInt err = iSuplSettings->SetIapName(iCurrentSLPId,aIapName);
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::UpdateNetInfo
+//
+// -----------------------------------------------------------------------------
+void COMASuplConnRequestor::UpdateNetInfo(const TTime& aLastTimeUsed,
+ TInt& aMcc,
+ TInt& aMnc,
+ TInt& aCid,
+ TInt& aLac,
+ TInt& aType,
+ TInt& aErrorCode
+)
+ {
+
+ CSuplSettingsInternal::TSuplSettingsNetworkType type = (CSuplSettingsInternal::TSuplSettingsNetworkType)aType;
+
+ if(aErrorCode == KErrNone)
+ {
+ iSuplSettings->SetNetInfoLastSucess(iCurrentSLPId,type,aMcc,aMnc,aCid,aLac);
+ iSuplSettings->SetLastUseTime(iCurrentSLPId,aLastTimeUsed);
+ }
+ else
+ {
+ iSuplSettings->SetNetInfoLastUse(iCurrentSLPId,type,aMcc,aMnc,aCid,aLac);
+ iSuplSettings->SetLastTriedTime(iCurrentSLPId,aLastTimeUsed);
+ }
+
+ }
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::UseDefaultServerL
+//
+// -----------------------------------------------------------------------------
+void COMASuplConnRequestor::UseDefaultServerL()
+ {
+ iFallBackHandler->ReadSLPListForNIL(KNullDesC);
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::UseServerL
+//
+// -----------------------------------------------------------------------------
+void COMASuplConnRequestor::UseServerL(const TDesC& aClientProvidedHSLPAddress)
+ {
+ iFallBackHandler->ReadSLPListForNIL(aClientProvidedHSLPAddress);
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::UseServerL
+//
+// -----------------------------------------------------------------------------
+void COMASuplConnRequestor::UpdateSLPListForHomeUsage(TBool aHomeNetwork)
+ {
+ iFallBackHandler->UpdateSLPListForHomeUsage(aHomeNetwork);
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplConnRequestor::DialogTimerExpiredL
+// Checks whether UI is displayed or not previously
+//
+// -----------------------------------------------------------------------------
+void COMASuplConnRequestor::DialogTimerExpiredL()
+ {
+ iTrace->Trace(_L("COMASuplConnRequestor:Timer Expired for SUPL IAP Dialog"), KTraceFileName, __LINE__);
+
+ if (!iIapDialogShown)
+ iProtocolManager.LaunchSuplDialogTimeoutUI(this);
+ else
+ iIapDlgTimerExpired = ETrue;
+ return;
+ }
+// End of File