supl/locationsuplfw/gateway/src/epos_csuplsessionrequest.cpp
branchRCL_3
changeset 18 d746aee05493
parent 0 667063e416a2
child 19 02ba3f1733c6
--- 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