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); + } + } + +