# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1279210018 -10800 # Node ID d746aee054936221a68ed377584084260c99fd49 # Parent 380473e1344365c5a1620d1ef99e34ab6725ec37 Revision: 201025 Kit: 2010127 diff -r 380473e13443 -r d746aee05493 supl/locationomasuplprotocolhandler/protocolhandler/src/epos_comasuplprotocolmanager.cpp --- a/supl/locationomasuplprotocolhandler/protocolhandler/src/epos_comasuplprotocolmanager.cpp Mon Jun 21 16:08:35 2010 +0300 +++ b/supl/locationomasuplprotocolhandler/protocolhandler/src/epos_comasuplprotocolmanager.cpp Thu Jul 15 19:06:58 2010 +0300 @@ -526,6 +526,10 @@ { iOMASuplProtocolHandler1->HandleSuplMessageL(aSuplSession,aStatus,aMessage); } + else if (iOMASuplProtocolHandler2) + { + iOMASuplProtocolHandler2->HandleSuplMessageL(aSuplSession,aStatus,aMessage); + } } else if( major == 2 ) { @@ -534,6 +538,10 @@ { iOMASuplProtocolHandler2->HandleSuplMessageL(aSuplSession,aStatus,aMessage); } + else if (iOMASuplProtocolHandler1) + { + iOMASuplProtocolHandler1->HandleSuplMessageL(aSuplSession,aStatus,aMessage); + } } else { diff -r 380473e13443 -r d746aee05493 supl/locationomasuplprotocolhandler/protocolhandlerver1/src/epos_comasuplposinitstate.cpp --- a/supl/locationomasuplprotocolhandler/protocolhandlerver1/src/epos_comasuplposinitstate.cpp Mon Jun 21 16:08:35 2010 +0300 +++ b/supl/locationomasuplprotocolhandler/protocolhandlerver1/src/epos_comasuplposinitstate.cpp Thu Jul 15 19:06:58 2010 +0300 @@ -605,7 +605,7 @@ } // Position - if(iPosition) + if(iPosition && iRequestType == COMASuplSession::ESUPL_TERMINAL) { if(KErrNone == iPosition->Status() && !iIgnorePosData) //if iIgnorePosData is set do not use the pos data { diff -r 380473e13443 -r d746aee05493 supl/locationomasuplprotocolhandler/protocolhandlerver1/src/epos_comasuplsession.cpp --- a/supl/locationomasuplprotocolhandler/protocolhandlerver1/src/epos_comasuplsession.cpp Mon Jun 21 16:08:35 2010 +0300 +++ b/supl/locationomasuplprotocolhandler/protocolhandlerver1/src/epos_comasuplsession.cpp Thu Jul 15 19:06:58 2010 +0300 @@ -465,7 +465,7 @@ if(aAllowedCapabilities == 0) { - iAllowedCapabilities = KGpsSETAssisted | KGpsSETBased | KAutonomousGps| KAFLT | KECID | KEOTD | KOTDOA | KCID; + iAllowedCapabilities = KGpsSETBased | KAutonomousGps| KAFLT | KECID | KEOTD | KOTDOA | KCID; } else { diff -r 380473e13443 -r d746aee05493 supl/locationsuplfw/gateway/group/epos_csuplserver.mmp --- a/supl/locationsuplfw/gateway/group/epos_csuplserver.mmp Mon Jun 21 16:08:35 2010 +0300 +++ b/supl/locationsuplfw/gateway/group/epos_csuplserver.mmp Thu Jul 15 19:06:58 2010 +0300 @@ -47,6 +47,7 @@ SOURCE epos_csuplserverstartuprequest.cpp SOURCE epos_csuplconnecttimer.cpp SOURCE epos_csuplecomeventwatcher.cpp +SOURCE epos_csuplsessionretryq.cpp MW_LAYER_SYSTEMINCLUDE diff -r 380473e13443 -r d746aee05493 supl/locationsuplfw/gateway/inc/epos_csuplsessionmanager.h --- a/supl/locationsuplfw/gateway/inc/epos_csuplsessionmanager.h Mon Jun 21 16:08:35 2010 +0300 +++ b/supl/locationsuplfw/gateway/inc/epos_csuplsessionmanager.h Thu Jul 15 19:06:58 2010 +0300 @@ -26,6 +26,8 @@ #include #include #include "epos_csuplecomeventwatcher.h" +#include "epos_csuplsessionretryq.h" +#include "epos_csuplcommunicationmanager.h" // FORWARD DECLARATIONS class CSUPLProtocolManagerBase; @@ -37,7 +39,7 @@ /** * Class to handle SUPL sessions */ -class CSuplSessionManager : public CBase +class CSuplSessionManager : public CBase, MSuplConnectionMonitor { public: // Constructors and destructor @@ -67,6 +69,9 @@ void DeInitialize(TRequestStatus& aStatus); void CancelDeInitialize(); + void QueueForReIssueRequestL(CSuplSessionRequest& aSessionRequest); + void RemoveFromQueueForReIssueRequest(CSuplSessionRequest& aSessionRequest); + void StartTriggerSessionL( CSuplSessionBase* aSuplSession, TRequestStatus& aStatus, @@ -86,7 +91,11 @@ ); TInt GetSUPLMessageVersionL(TInt& aMajorVersion, const TDesC8& aReceivedMessage); - + + // from MSuplConnectionMonitor + void ConnectionOpened(); + void ConnectionClosed(); + private: /** @@ -110,7 +119,7 @@ CSuplCommunicationManager* iCommMgr; TInt iConnectError; CSuplEcomEventWatcher* iEcomWatcher; - + CSuplSessionRetryQ* iSessionRetryQ; }; diff -r 380473e13443 -r d746aee05493 supl/locationsuplfw/gateway/inc/epos_csuplsessionrequest.h --- a/supl/locationsuplfw/gateway/inc/epos_csuplsessionrequest.h Mon Jun 21 16:08:35 2010 +0300 +++ b/supl/locationsuplfw/gateway/inc/epos_csuplsessionrequest.h Thu Jul 15 19:06:58 2010 +0300 @@ -33,6 +33,8 @@ // FORWARD DECLARATIONS class MSuplSessionObserver; class MNetInitiatedObserver; +class CSuplSessionManager; +class CSuplSessionBase; // CLASS DECLARATION /** @@ -99,6 +101,7 @@ void CancelTriggerringRequest(); void ProtocolHUnloaded(); + void ReIssueRequestL(); protected: // From CActive @@ -129,7 +132,9 @@ ESuplForwardMessage, ESuplStartTriggerRequest, ESuplStopTriggerRequest, - ESuplTriggerFiredNotifyRequest + ESuplTriggerFiredNotifyRequest, + ESuplWaitingToRetrySession, + ESuplRetryingSession }; TSuplRequestStage iRequestPhase; @@ -139,6 +144,17 @@ CSuplSessionManager& iSessnMgr; CSuplSessionBase* iSuplSessn; TInt iHandle; + + CSuplSessionBase* iParamSuplSessn; + TInt iParamSetCaps; + TInt iParamReqId; + TBool iParamFallback; + TBool iParamFirstReq; + TBool iParamExtendedQopUsed; + TSuplTerminalQop iParamQop; + HBufC* iParamExtendedFallback; + + TBool iSessionStarted; }; #endif // __CSuplSessionRequest_H__ diff -r 380473e13443 -r d746aee05493 supl/locationsuplfw/gateway/inc/epos_csuplsessionretryq.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/supl/locationsuplfw/gateway/inc/epos_csuplsessionretryq.h Thu Jul 15 19:06:58 2010 +0300 @@ -0,0 +1,72 @@ +/* +* ============================================================================== +* Name : epos_csuplsessionretryq.h +* Part of : SUPL Framework / SUPL Server +* Interface : -- +* Description : Class to handle retries of failed requests. It waits for all the current sessions to end and then +* notifies the failed sessions that they can retry. +* Version : +* +* Copyright (c) 2010 Nokia Corporation. +* This material, including documentation and any related +* computer programs, is protected by copyright controlled by +* Nokia Corporation. All rights are reserved. Copying, +* including reproducing, storing, adapting or translating, any +* or all of this material requires the prior written consent of +* Nokia Corporation. This material also contains confidential +* information which may not be disclosed to others without the +* prior written consent of Nokia Corporation. +* ============================================================================== +*/ + +#ifndef EPOS_CSUPLSESSIONRETRYQ_H +#define EPOS_CSUPLSESSIONRETRYQ_H + +// INCLUDES +#include + +// CLASS DECLARATION +class CSuplSessionRequest; + +/** + * Class to handle retries of failed requests. It waits for all the current sessions to end and then + * notifies the failed sessions that they can retry. + */ +class CSuplSessionRetryQ : public CTimer + { + public: + static CSuplSessionRetryQ* NewL(); + ~CSuplSessionRetryQ(); + + void AddToQueueL(CSuplSessionRequest& aSessionRequest); + void RemoveFromQueueL(CSuplSessionRequest& aSessionRequest); + void SessionStarted(); + void SessionEnded(); + + private: + CSuplSessionRetryQ(); + void ConstructL(); + + // By default, prohibit copy constructor + CSuplSessionRetryQ( const CSuplSessionRetryQ& ); + // Prohibit assigment operator + CSuplSessionRetryQ& operator= ( const CSuplSessionRetryQ& ); + + protected: // Functions from base classes + + /** + * From CActive. + * Called when timer completes + */ + void RunL(); + + private: // Data + RPointerArray iSessionRequests; + TInt iSessionCount; + TBool iSomeSessionEnded; + TTime iTimeOfLastEndedSession; + }; + +#endif // EPOS_CSUPLSESSIONRETRYQ_H + +// End of File diff -r 380473e13443 -r d746aee05493 supl/locationsuplfw/gateway/src/epos_csuplsessionmanager.cpp --- a/supl/locationsuplfw/gateway/src/epos_csuplsessionmanager.cpp Mon Jun 21 16:08:35 2010 +0300 +++ b/supl/locationsuplfw/gateway/src/epos_csuplsessionmanager.cpp Thu Jul 15 19:06:58 2010 +0300 @@ -49,7 +49,8 @@ void CSuplSessionManager::ConstructL() { DEBUG_TRACE("CSuplSessionManager::ConstructL", __LINE__) - iCommMgr = CSuplCommunicationManager::NewL(); + iSessionRetryQ = CSuplSessionRetryQ::NewL(); + iCommMgr = CSuplCommunicationManager::NewL(*this); iCommMgr->Initialize(); iConnectError=KErrNone; } @@ -72,6 +73,7 @@ if(iProtocolMgr) delete iProtocolMgr; delete iCommMgr; + delete iSessionRetryQ; delete iEcomWatcher; REComSession::FinalClose(); } @@ -465,5 +467,26 @@ User::RequestComplete(status,KErrNotReady); } } + +void CSuplSessionManager::ConnectionOpened() + { + iSessionRetryQ->SessionStarted(); + } + +void CSuplSessionManager::ConnectionClosed() + { + iSessionRetryQ->SessionEnded(); + } + + +void CSuplSessionManager::QueueForReIssueRequestL(CSuplSessionRequest& aSessionRequest) + { + iSessionRetryQ->AddToQueueL(aSessionRequest); + } + +void CSuplSessionManager::RemoveFromQueueForReIssueRequest(CSuplSessionRequest& aSessionRequest) + { + iSessionRetryQ->RemoveFromQueueL(aSessionRequest); + } // End of File diff -r 380473e13443 -r d746aee05493 supl/locationsuplfw/gateway/src/epos_csuplsessionrequest.cpp --- a/supl/locationsuplfw/gateway/src/epos_csuplsessionrequest.cpp Mon Jun 21 16:08:35 2010 +0300 +++ b/supl/locationsuplfw/gateway/src/epos_csuplsessionrequest.cpp Thu Jul 15 19:06:58 2010 +0300 @@ -49,7 +49,8 @@ iRequestPhase(ESuplReqInactive), iObserver(aObserver), iSessnMgr(aSessnMgr), - iSuplSessn(aSuplSessn) + iSuplSessn(aSuplSessn), + iParamExtendedFallback(NULL) { DEBUG_TRACE("CSuplSessionRequest::CSuplSessionRequest", __LINE__) CActiveScheduler::Add(this); @@ -60,7 +61,8 @@ iRequestPhase(ESuplReqInactive), iNetObserver(aObserver), iSessnMgr(aSessnMgr), - iSuplSessn(aSuplSessn) + iSuplSessn(aSuplSessn), + iParamExtendedFallback(NULL) { DEBUG_TRACE("CSuplSessionRequest::CSuplSessionRequest", __LINE__) CActiveScheduler::Add(this); @@ -95,6 +97,11 @@ CSuplSessionRequest::~CSuplSessionRequest() { DEBUG_TRACE("CSuplSessionRequest::~CSuplSessionRequest", __LINE__) + iSessnMgr.RemoveFromQueueForReIssueRequest(*this); + + if (iParamExtendedFallback) + delete iParamExtendedFallback; + if (IsActive()) Cancel(); } @@ -115,6 +122,13 @@ iSessnMgr.RunSuplSessionL(aSuplSessn, iStatus, aHslpAddress, fallBack, aSetCaps, aReqId, aFirstReq); SetActive(); + iSessionStarted = ETrue; + iParamFallback = ETrue; + iParamSuplSessn = aSuplSessn; + iParamSetCaps = aSetCaps; + iParamReqId = aReqId; + iParamFirstReq = aFirstReq; + iParamExtendedQopUsed = EFalse; } // --------------------------------------------------------- // CSuplSessionRequest::MakeSuplSessionRequestL @@ -132,6 +146,15 @@ iSessnMgr.RunSuplSessionL(aSuplSessn, iStatus, aHslpAddress, fallBack, aSetCaps, aReqId, aQop, aFirstReq); SetActive(); + + iSessionStarted = ETrue; + iParamFallback = ETrue; + iParamSuplSessn = aSuplSessn; + iParamSetCaps = aSetCaps; + iParamReqId = aReqId; + iParamFirstReq = aFirstReq; + iParamQop = aQop; + iParamExtendedQopUsed = ETrue; } void CSuplSessionRequest::MakeSuplSessionRequestL(CSuplSessionBase* aSuplSessn,const TDesC& aHslpAddress, TBool aFallBack, TInt aSetCaps, TInt aReqId, TBool aFirstReq) @@ -141,6 +164,21 @@ iStatus = KRequestPending; iSessnMgr.RunSuplSessionL(aSuplSessn, iStatus, aHslpAddress, aFallBack, aSetCaps, aReqId, aFirstReq); SetActive(); + + iSessionStarted = ETrue; + iParamFallback = aFallBack; + iParamSuplSessn = aSuplSessn; + iParamSetCaps = aSetCaps; + iParamReqId = aReqId; + iParamFirstReq = aFirstReq; + if (iParamExtendedFallback) + { + delete iParamExtendedFallback; + iParamExtendedFallback = NULL; + } + iParamExtendedFallback = HBufC::NewL(aHslpAddress.Length()); + *iParamExtendedFallback = aHslpAddress; + iParamExtendedQopUsed = EFalse; } void CSuplSessionRequest::MakeSuplSessionRequestL(CSuplSessionBase* aSuplSessn,const TDesC& aHslpAddress, TBool aFallBack, TInt aSetCaps, TInt aReqId, TSuplTerminalQop& aQop, TBool aFirstReq) @@ -150,6 +188,22 @@ iStatus = KRequestPending; iSessnMgr.RunSuplSessionL(aSuplSessn, iStatus, aHslpAddress, aFallBack, aSetCaps, aReqId, aQop, aFirstReq); SetActive(); + + iSessionStarted = ETrue; + iParamFallback = aFallBack; + iParamSuplSessn = aSuplSessn; + iParamSetCaps = aSetCaps; + iParamReqId = aReqId; + iParamFirstReq = aFirstReq; + iParamQop = aQop; + iParamExtendedQopUsed = ETrue; + if (iParamExtendedFallback) + { + delete iParamExtendedFallback; + iParamExtendedFallback = NULL; + } + iParamExtendedFallback = HBufC::NewL(aHslpAddress.Length()); + *iParamExtendedFallback = aHslpAddress; } // --------------------------------------------------------- @@ -198,6 +252,7 @@ if (IsActive()) { iObserver->CompleteRunSession(KErrServerTerminated); + iSessionStarted = EFalse; Cancel(); } } @@ -212,44 +267,85 @@ { DEBUG_TRACE("CSuplSessionRequest::RunL", __LINE__) TInt err = iStatus.Int(); - switch (iRequestPhase) - { - case ESuplStartTriggerRequest: - case ESuplStopTriggerRequest: - { - iRequestPhase = ESuplReqInactive; - iObserver->CompleteTriggerRunSession(err); - break; - } - case ESuplTriggerFiredNotifyRequest: - { - iRequestPhase = ESuplReqInactive; - iObserver->CompleteTriggerFiredNotifyRequest(err); - break; - } - case ESuplSessionRequest: + + iSessionStarted = EFalse; + if(err != KErrNone && iRequestPhase == ESuplSessionRequest) + { + DEBUG_TRACE("Retrying session", __LINE__) + iRequestPhase = ESuplWaitingToRetrySession; + iSessnMgr.QueueForReIssueRequestL(*this); + } + else + { + switch (iRequestPhase) + { + case ESuplStartTriggerRequest: + case ESuplStopTriggerRequest: + { + iRequestPhase = ESuplReqInactive; + iObserver->CompleteTriggerRunSession(err); + break; + } + case ESuplTriggerFiredNotifyRequest: + { + iRequestPhase = ESuplReqInactive; + iObserver->CompleteTriggerFiredNotifyRequest(err); + break; + } + case ESuplSessionRequest: + case ESuplRetryingSession: + { + iRequestPhase = ESuplReqInactive; + iObserver->CompleteRunSession(err); + break; + } + case ESuplCancelRunSessionRequest: + { + iRequestPhase = ESuplReqInactive; + iObserver->CompleteRunSession(err); + break; + } + case ESuplForwardMessage: + { + iRequestPhase = ESuplReqInactive; + iNetObserver->CompleteForwardMessageL(iHandle); + break; + } + + default : + DebugPanic(EPosSuplServerPanicRequestInconsistency); + } + } + } + +void CSuplSessionRequest::ReIssueRequestL() + { + DEBUG_TRACE("CSuplSessionRequest::ReIssueRequestL", __LINE__) + if(!iParamExtendedQopUsed) + { + if (!iParamExtendedFallback) { - iRequestPhase = ESuplReqInactive; - iObserver->CompleteRunSession(err); - break; + MakeSuplSessionRequestL(iParamSuplSessn, iParamSetCaps, iParamReqId, iParamFirstReq); } - case ESuplCancelRunSessionRequest: + else { - iRequestPhase = ESuplReqInactive; - iObserver->CompleteRunSession(err); - break; + MakeSuplSessionRequestL(iParamSuplSessn, *iParamExtendedFallback, iParamFallback, iParamSetCaps, iParamReqId, iParamFirstReq); } - case ESuplForwardMessage: - { - iRequestPhase = ESuplReqInactive; - iNetObserver->CompleteForwardMessageL(iHandle); - break; - } - - default : - DebugPanic(EPosSuplServerPanicRequestInconsistency); - } - } + } + else + { + if (!iParamExtendedFallback) + { + MakeSuplSessionRequestL(iParamSuplSessn, iParamSetCaps, iParamReqId, iParamQop, iParamFirstReq); + } + else + { + MakeSuplSessionRequestL(iParamSuplSessn, *iParamExtendedFallback, iParamFallback, iParamSetCaps, iParamReqId, iParamQop, iParamFirstReq); + } + } + DEBUG_TRACE("Retry request succesfull", __LINE__) + iRequestPhase = ESuplRetryingSession; + } // --------------------------------------------------------- // CSuplSessionRequest::RunError diff -r 380473e13443 -r d746aee05493 supl/locationsuplfw/gateway/src/epos_csuplsessionretryq.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/supl/locationsuplfw/gateway/src/epos_csuplsessionretryq.cpp Thu Jul 15 19:06:58 2010 +0300 @@ -0,0 +1,185 @@ +/* +* ============================================================================== +* Name : epos_csuplsessionretryq.cpp +* Part of : SUPL Framework / SUPL Server +* Description : Class to handle retries of failed requests. It waits for all the current sessions to end and then +* notifies the failed sessions that they can retry. +* Version : +* +* Copyright (c) 2010 Nokia Corporation. +* This material, including documentation and any related +* computer programs, is protected by copyright controlled by +* Nokia Corporation. All rights are reserved. Copying, +* including reproducing, storing, adapting or translating, any +* or all of this material requires the prior written consent of +* Nokia Corporation. This material also contains confidential +* information which may not be disclosed to others without the +* prior written consent of Nokia Corporation. +* ============================================================================== +*/ + +// INCLUDE FILES +#include +#include + +#include "epos_csuplsessionretryq.h" +#include "epos_csuplsessionrequest.h" +#include "epos_csuplglobal.h" + +//#ifdef _DEBUG +_LIT(KTraceFileName, "SUPL_GW::epos_csuplsessionretryq.cpp"); +//#endif + +// CONSTANTS +const TTimeIntervalSeconds KRecentConnectionInterval(5); +const TTimeIntervalMicroSeconds32 KSmallDelay(2000000); +const TTimeIntervalMicroSeconds32 KReissueRequestDelay(5000000); + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CSuplSessionRetryQ::CSuplSessionRetryQ() + : CTimer(EPriorityNormal) + { + DEBUG_TRACE("CSuplSessionRetryQ", __LINE__) + CActiveScheduler::Add(this); + } + +// Destructor +CSuplSessionRetryQ::~CSuplSessionRetryQ() + { + DEBUG_TRACE("~CSuplSessionRetryQ", __LINE__) + Cancel(); + iSessionRequests.Close(); + } + +// Two-phased constructor +CSuplSessionRetryQ* CSuplSessionRetryQ::NewL() + { + DEBUG_TRACE("NewL", __LINE__) + CSuplSessionRetryQ* self = new (ELeave) CSuplSessionRetryQ(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// EPOC default constructor +void CSuplSessionRetryQ::ConstructL() + { + DEBUG_TRACE("ConstructL", __LINE__) + CTimer::ConstructL(); + } + + +void CSuplSessionRetryQ::AddToQueueL(CSuplSessionRequest& aSessionRequest) + { + TBuf<256> msg(_L("AddToQueueL, count = ")); + msg.AppendNum(iSessionRequests.Count()+1); + SuplGlobal::Trace(msg, KTraceFileName, __LINE__); + // if there is no open connection and there is nothing else in the queue then check when it's possible to + // re-issue, otherwise just leave in the queue + if(iSessionRequests.Count() == 0 && iSessionCount == 0) + { + TTime now; + now.UniversalTime(); + // if there was some recent connection made that was closed then ask for re-issue straight away + if(iSomeSessionEnded && now - KRecentConnectionInterval < iTimeOfLastEndedSession) + { + DEBUG_TRACE("Re-issuing request straight away", __LINE__) + RDebug::Printf("[LBS][SUPL]Re-issuing request straight away"); + After(KSmallDelay); + } + // if there is no previous request then wait a little before re-issuing request + else + { + DEBUG_TRACE("Re-issuing request after a delay", __LINE__) + RDebug::Printf("[LBS][SUPL]Re-issuing request after a delay"); + After(KReissueRequestDelay); + } + } + iSessionRequests.AppendL(&aSessionRequest); + } + +void CSuplSessionRetryQ::RemoveFromQueueL(CSuplSessionRequest& aSessionRequest) + { + TInt index = 0; + index = iSessionRequests.Find(&aSessionRequest); + if(index != KErrNotFound) + { + iSessionRequests.Remove(index); + + TBuf<256> msg(_L("Removed from queue, count = ")); + msg.AppendNum(iSessionRequests.Count()); + SuplGlobal::Trace(msg, KTraceFileName, __LINE__); + + } + } + +void CSuplSessionRetryQ::SessionStarted() + { + ++iSessionCount; + + + TBuf<256> msg(_L("SessionStarted, session count = ")); + msg.AppendNum(iSessionCount); + SuplGlobal::Trace(msg, KTraceFileName, __LINE__); + } + +void CSuplSessionRetryQ::SessionEnded() + { + --iSessionCount; + + TBuf<256> msg(_L("SessionEnded, session count = ")); + msg.AppendNum(iSessionCount); + SuplGlobal::Trace(msg, KTraceFileName, __LINE__); + + + if(iSessionCount == 0 && iSessionRequests.Count() > 0) + { + DEBUG_TRACE("Re-issuing request straight away", __LINE__) + After(KSmallDelay); + } + // If a connection just closed remember the time-stamp so later it can be decided when to re-issue + iSomeSessionEnded = ETrue; + iTimeOfLastEndedSession.UniversalTime(); + } + +// --------------------------------------------------------- +// CSuplSessionRetryQ::RunL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CSuplSessionRetryQ::RunL() + { + TBuf<256> msg(_L("RunL, session count = ")); + msg.AppendNum(iSessionCount); + msg.Append(_L(", queue count = ")); + msg.AppendNum(iSessionRequests.Count()); + SuplGlobal::Trace(msg, KTraceFileName, __LINE__); + + // If a connection is already open, wait until it finishes + if(iSessionCount == 0 && iSessionRequests.Count() > 0) + { + DEBUG_TRACE("Re-issuing request now", __LINE__) + // re-issue request for the first item in the queue + TRAPD(err, iSessionRequests[0]->ReIssueRequestL()); + while(err!=KErrNone && iSessionRequests.Count() > 1) + { + // if for some reason re-issuing doesn't work then just try the next requestor and forget about the first one + DEBUG_TRACE("Re-issue failed, trying next one in the queue", __LINE__) + iSessionRequests.Remove(0); + TRAP(err, iSessionRequests[0]->ReIssueRequestL()); + } + if(err!=KErrNone) + { + DEBUG_TRACE("Re-issue failed", __LINE__) + } + iSessionRequests.Remove(0); + } + } + + diff -r 380473e13443 -r d746aee05493 supl/locationsuplfw/protocolhandlerapi/bwins/epossuplprotocolhandlerpluginu.def --- a/supl/locationsuplfw/protocolhandlerapi/bwins/epossuplprotocolhandlerpluginu.def Mon Jun 21 16:08:35 2010 +0300 +++ b/supl/locationsuplfw/protocolhandlerapi/bwins/epossuplprotocolhandlerpluginu.def Thu Jul 15 19:06:58 2010 +0300 @@ -13,9 +13,9 @@ ?Initialize@CSuplCommunicationManager@@QAEHXZ @ 12 NONAME ; int CSuplCommunicationManager::Initialize(void) ?GetLocalIPAddress@CSuplConnection@@QAEHAAVTInetAddr@@@Z @ 13 NONAME ; int CSuplConnection::GetLocalIPAddress(class TInetAddr &) ?NewL@CSUPLProtocolManagerBase@@SAPAV1@ABVTDesC8@@@Z @ 14 NONAME ; class CSUPLProtocolManagerBase * CSUPLProtocolManagerBase::NewL(class TDesC8 const &) - ?NewL@CSuplCommunicationManager@@SAPAV1@XZ @ 15 NONAME ; class CSuplCommunicationManager * CSuplCommunicationManager::NewL(void) - ?Send@CSuplConnection@@QAEXABVTDesC8@@AAVTRequestStatus@@@Z @ 16 NONAME ; void CSuplConnection::Send(class TDesC8 const &, class TRequestStatus &) - ?CreateConnectionL@CSuplCommunicationManager@@QAEPAVCSuplConnection@@ABVTDesC16@@HHIH@Z @ 17 NONAME ; class CSuplConnection * CSuplCommunicationManager::CreateConnectionL(class TDesC16 const &, int, int, unsigned int, int) + ?Send@CSuplConnection@@QAEXABVTDesC8@@AAVTRequestStatus@@@Z @ 15 NONAME ; void CSuplConnection::Send(class TDesC8 const &, class TRequestStatus &) + ?CreateConnectionL@CSuplCommunicationManager@@QAEPAVCSuplConnection@@ABVTDesC16@@HHIH@Z @ 16 NONAME ; class CSuplConnection * CSuplCommunicationManager::CreateConnectionL(class TDesC16 const &, int, int, unsigned int, int) + ?NewL@CSuplCommunicationManager@@SAPAV1@AAVMSuplConnectionMonitor@@@Z @ 17 NONAME ; class CSuplCommunicationManager * CSuplCommunicationManager::NewL(class MSuplConnectionMonitor &) ?CloseConnection@CSuplConnection@@QAEXXZ @ 18 NONAME ; void CSuplConnection::CloseConnection(void) ?CancelConnect@CSuplConnection@@QAEXAAVTRequestStatus@@@Z @ 19 NONAME ; void CSuplConnection::CancelConnect(class TRequestStatus &) ?DestroyConnection@CSuplCommunicationManager@@QAEHPAVCSuplConnection@@@Z @ 20 NONAME ; int CSuplCommunicationManager::DestroyConnection(class CSuplConnection *) diff -r 380473e13443 -r d746aee05493 supl/locationsuplfw/protocolhandlerapi/eabi/epossuplprotocolhandlerpluginu.def --- a/supl/locationsuplfw/protocolhandlerapi/eabi/epossuplprotocolhandlerpluginu.def Mon Jun 21 16:08:35 2010 +0300 +++ b/supl/locationsuplfw/protocolhandlerapi/eabi/epossuplprotocolhandlerpluginu.def Thu Jul 15 19:06:58 2010 +0300 @@ -21,7 +21,7 @@ _ZN25CSuplCommunicationManager17CreateConnectionLERK7TDesC16ji @ 20 NONAME _ZN25CSuplCommunicationManager17DestroyConnectionEP15CSuplConnection @ 21 NONAME _ZN25CSuplCommunicationManager17SetPacketReceiverEP19MSuplPacketReceiver @ 22 NONAME - _ZN25CSuplCommunicationManager4NewLEv @ 23 NONAME + _ZN25CSuplCommunicationManager4NewLER22MSuplConnectionMonitor @ 23 NONAME _ZN25CSuplCommunicationManagerD0Ev @ 24 NONAME _ZN25CSuplCommunicationManagerD1Ev @ 25 NONAME _ZN25CSuplCommunicationManagerD2Ev @ 26 NONAME diff -r 380473e13443 -r d746aee05493 supl/locationsuplfw/protocolhandlerapi/inc/epos_csuplcommunicationmanager.h --- a/supl/locationsuplfw/protocolhandlerapi/inc/epos_csuplcommunicationmanager.h Mon Jun 21 16:08:35 2010 +0300 +++ b/supl/locationsuplfw/protocolhandlerapi/inc/epos_csuplcommunicationmanager.h Thu Jul 15 19:06:58 2010 +0300 @@ -36,6 +36,13 @@ // CLASS DECLARATION +class MSuplConnectionMonitor + { +public: + virtual void ConnectionOpened() = 0; + virtual void ConnectionClosed() = 0; + }; + /** * CSuplCommunicationManager is the Singleton that provides SUPL Connection * to be used by Protocol Handler @@ -54,7 +61,7 @@ /** * Two-phased constructor. */ - IMPORT_C static CSuplCommunicationManager* NewL(); + IMPORT_C static CSuplCommunicationManager* NewL(MSuplConnectionMonitor& aConnMonitor); /** * Destructor. @@ -178,7 +185,7 @@ /** * C++ default constructor. */ - CSuplCommunicationManager(); + CSuplCommunicationManager(MSuplConnectionMonitor& aConnMonitor); /** * By default Symbian 2nd phase constructor is private. @@ -206,6 +213,8 @@ // Trace Log CSuplConnTrace* iTrace; + + MSuplConnectionMonitor& iConnMonitor; }; #endif // C_CSUPLCOMMUNICATIONMANAGER_H diff -r 380473e13443 -r d746aee05493 supl/locationsuplfw/protocolhandlerapi/src/epos_csuplcommunicationmanager.cpp --- a/supl/locationsuplfw/protocolhandlerapi/src/epos_csuplcommunicationmanager.cpp Mon Jun 21 16:08:35 2010 +0300 +++ b/supl/locationsuplfw/protocolhandlerapi/src/epos_csuplcommunicationmanager.cpp Thu Jul 15 19:06:58 2010 +0300 @@ -36,8 +36,8 @@ // ============================ MEMBER FUNCTIONS =============================== -CSuplCommunicationManager::CSuplCommunicationManager(): - iServerConnected(EFalse) +CSuplCommunicationManager::CSuplCommunicationManager(MSuplConnectionMonitor& aConnMonitor): + iServerConnected(EFalse), iConnMonitor(aConnMonitor) { } @@ -49,9 +49,9 @@ iTrace->Trace(_L("CSuplCommunicationManager::ConstructL"), KTraceFileName, __LINE__); } -EXPORT_C CSuplCommunicationManager* CSuplCommunicationManager::NewL() +EXPORT_C CSuplCommunicationManager* CSuplCommunicationManager::NewL(MSuplConnectionMonitor& aConnMonitor) { - CSuplCommunicationManager* self = new( ELeave ) CSuplCommunicationManager; + CSuplCommunicationManager* self = new( ELeave ) CSuplCommunicationManager(aConnMonitor); CleanupStack::PushL( self ); self->ConstructL(); @@ -127,7 +127,8 @@ suplConnection = CSuplConnection::NewL(iSocketServ, aHostAddress, aPort, aIAPId, this); iConnArray.Append(suplConnection); iTrace->Trace(_L("CSuplCommunicationManager::CreateConnectionL New Connection Created"), KTraceFileName, __LINE__); - } + iConnMonitor.ConnectionOpened(); + } else { // Check if we have exceeded the max no. of sessions @@ -140,8 +141,9 @@ suplConnection = CSuplConnection::NewL(iSocketServ, aHostAddress, aPort, aIAPId, this); iConnArray.Append(suplConnection); iTrace->Trace(_L("CSuplCommunicationManager::CreateConnectionL New Connection Created"), KTraceFileName, __LINE__); - } + iConnMonitor.ConnectionOpened(); } + } // Increment the Ref Count suplConnection->IncRefCount(); @@ -181,6 +183,7 @@ { suplConnection = CSuplConnection::NewL(iSocketServ, aHostAddress, aPort, aIAPId, aTls, aPskTls, this); iConnArray.Append(suplConnection); + iConnMonitor.ConnectionOpened(); iTrace->Trace(_L("CSuplCommunicationManager::CreateConnectionL New Connection Created"), KTraceFileName, __LINE__); } else @@ -194,6 +197,7 @@ { suplConnection = CSuplConnection::NewL(iSocketServ, aHostAddress, aPort, aIAPId, aTls, aPskTls, this); iConnArray.Append(suplConnection); + iConnMonitor.ConnectionOpened(); iTrace->Trace(_L("CSuplCommunicationManager::CreateConnectionL New Connection Created"), KTraceFileName, __LINE__); } } @@ -243,6 +247,8 @@ iTrace->Trace(_L("CSuplCommunicationManager::DestroyConnection Destroy Connection"), KTraceFileName, __LINE__); aConnection->Destroy(); + iConnMonitor.ConnectionClosed(); + return KErrNone; }