supl/locationomasuplprotocolhandler/protocolhandlerver2/src/epos_comasuplsession2.cpp
changeset 0 667063e416a2
child 4 42de37ce7ce4
equal deleted inserted replaced
-1:000000000000 0:667063e416a2
       
     1 /*
       
     2 * Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:   Implementation of Session Object in the OMA SUPL Protocol Handler
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19  
       
    20 
       
    21 
       
    22 #include <barsc2.h>
       
    23 #include <barsread2.h>
       
    24 #include <bautils.h>
       
    25 #include <networking/dnd_err.h>
       
    26 
       
    27 #include <e32def.h>
       
    28 #include <etelmm.h> 
       
    29 #include <centralrepository.h>
       
    30 #include <CoreApplicationUIsSDKCRKeys.h> // for network mode (offline)
       
    31 
       
    32 
       
    33 #include <lbspositioninfo.h>
       
    34 #include <lbsfieldids.h>
       
    35 
       
    36 #include "epos_suplterminal.h"
       
    37 #include "epos_suplterminalconstants.h"
       
    38 #include "epos_suplterminalqop.h"
       
    39 
       
    40 #include "epos_comasuplnotification.h"
       
    41 #include "epos_csuplprotocolmanagerbase.h"
       
    42 #include "epos_csuplcommunicationmanager.h"
       
    43 #include "epos_csuplconnection.h"
       
    44 #include "lbs/epos_comasuplpossessionbase.h"
       
    45 #include "lbs/epos_comasuplposhandlerbase.h"
       
    46 #include "lbs/epos_comasuplinforequestlist.h"
       
    47 #include "epos_comasupllocationid.h"
       
    48 #include "epos_comasuplsessionid.h"
       
    49 #include "epos_comasuplresponse.h"
       
    50 #include "epos_comasuplpos.h"
       
    51 #include "epos_comasuplstart.h"
       
    52 #include "epos_comasupltriggeredstart.h"
       
    53 #include "epos_comasuplposinit.h"
       
    54 #include "epos_comasuplauthresponse.h"
       
    55 #include "epos_comasupltriggeredresponse.h"
       
    56 #include "epos_comasupltriggeredstop.h"
       
    57 #include "epos_comasuplauthrequest.h"
       
    58 #include "lbs/epos_comasuplposition.h"
       
    59 #include "lbs/epos_comasuplvelocity.h"
       
    60 #include "lbs/epos_comasuplsetcapabilities.h"
       
    61 #include "lbs/epos_eomasuplposerrors.h"
       
    62 #include "epos_comasuplinit.h"
       
    63 #include "epos_csuplsettings.h"
       
    64 #include "epos_csuplsettingsinternal.h"
       
    65 
       
    66 #include "epos_comasuplprotocolmanager2.h"
       
    67 #include "epos_comasuplsettings.h"
       
    68 #include "epos_comasupletelnotifier.h"
       
    69 #include "epos_comasuplsession2.h"
       
    70 
       
    71 #include "epos_comasuplconnrequestor.h"
       
    72 #include "epos_comasuplstate.h"
       
    73 #include "epos_comasuplstartstate.h"
       
    74 #include "epos_comasupltriggerstartstate.h"
       
    75 #include "epos_comasuplposinitstate.h"
       
    76 #include "epos_comasuplresponsestate.h"
       
    77 #include "epos_comasupltriggerresponsestate.h"
       
    78 #include "epos_comasuplendstate.h"
       
    79 #include "epos_comasuplreportstate.h"
       
    80 #include "epos_comasupltriggerstopstate.h"
       
    81 #include "epos_comasuplposstate.h"
       
    82 #include "epos_comasuplinitstate.h"
       
    83 #include "epos_comasuplposrequestor.h"
       
    84 #include "epos_omasuplconstants.h"
       
    85 #include "epos_comasupltrace.h"
       
    86 #include "epos_resourceutils.h"
       
    87 #include "epos_comasupltimeouttimer.h"
       
    88 #include "epos_comasupldialogtimer.h"
       
    89 #include "epos_tomasuplposmethod.h"
       
    90 #include "epos_omasuplconfigurationkeys.h"
       
    91 #include "epos_csuplsettingparams.h"
       
    92 #include "epos_comasuplasnbase.h"
       
    93 
       
    94 
       
    95 _LIT(KTraceFileName,"SUPL_OMA_SESSION::EPos_COMASuplSession2.cpp");
       
    96 
       
    97 //Multiplying factor for conversion of ellipsoid to circle
       
    98 //formula used sqrt(-2*natural log(1-Confidence))
       
    99 // actual value = 1.0107676525947896431381113653917 
       
   100 
       
   101 //const TReal	MultiplyFactorOneSigma = 1.01076765; 
       
   102 const TInt KMaxIntervalTime = 10;
       
   103 const TInt KMaxStartTime = 10;
       
   104 
       
   105 // ============================ MEMBER FUNCTIONS ===============================
       
   106 
       
   107 //Constructor
       
   108 COMASuplSession::COMASuplSession(RMobilePhone& aMobilePhone ,
       
   109 																TOMASuplReqType aRequestType,
       
   110 																COMASuplPosHandlerBase *aPosHandler,
       
   111 																MOMASuplSessionObserver& aSessionObserver,
       
   112 																COMASuplSettings*& aSettings,
       
   113 																COMASUPLProtocolManager2 &aProtoMgr,
       
   114 																TInt aIpcSessionId,
       
   115 																COMASuplAsnHandlerBase* aOMASuplAsnHandlerBase):
       
   116 																
       
   117 																iMobilePhone(aMobilePhone),
       
   118 																iRequestType(aRequestType),
       
   119 																iPosHandler(aPosHandler),	
       
   120 																iHSLPAddress(aSettings->SLPAddress()),
       
   121 																iEncodedSuplInit(NULL),
       
   122 																iSessionObserver(aSessionObserver),
       
   123 																iSuplSettings(aSettings),
       
   124 																iProtocolManager(aProtoMgr),
       
   125 																iUIFlag(EFalse),
       
   126 																iSessionIDFlag(EFalse),
       
   127 																iRoaming(EFalse),
       
   128 																iChanged(EFalse),
       
   129 																iIpcSessionId(aIpcSessionId),
       
   130 																iNwInitError(EFalse),
       
   131 																iPersistFail(EFalse),
       
   132 																iCapsFail(EFalse),
       
   133 																iUsageDialog(EFalse),
       
   134 																iUsageHomeNW(EFalse),
       
   135 																iEtelNotify(EFalse),
       
   136 																iEtelRoamingCheck(EFalse),
       
   137 																iIapDialogShown(EFalse),
       
   138 																iIapDlgTimerExpired(EFalse),
       
   139                                                                 iTriggerSession(EFalse),
       
   140 																iOMASuplAsnHandlerBaseImpl(aOMASuplAsnHandlerBase),
       
   141                                                                 iTrgTimer(EFalse),
       
   142                                                                 iStartTimerFlag(EFalse),
       
   143                                                                 iTrgCancelRequest(EFalse),
       
   144                                                                 iClientNotify(EFalse),
       
   145                                                                 iDisconnected(EFalse)
       
   146 																
       
   147     { 
       
   148     }
       
   149  
       
   150 //2 nd Phase construction
       
   151  void COMASuplSession::ConstructL(CSuplCommunicationManager &aCommManager,
       
   152 			                      CSuplSettingsInternal* aSettingsStorage,
       
   153  								  TDes& aIMSI)
       
   154      {
       
   155      iTrace = COMASuplTrace::NewL();	
       
   156 
       
   157      iTrace->Trace(_L("COMASuplSession::ConstructL"), KTraceFileName, __LINE__); 
       
   158 
       
   159 
       
   160      iConnRequestor = COMASuplConnRequestor::NewL(aCommManager,iProtocolManager,KOMASuplHSLPPort,*this);
       
   161      TBuf<64> msg;
       
   162      msg.Copy(_L("Port Number is :"));
       
   163      msg.AppendNum(KOMASuplHSLPPort);
       
   164      iTrace->Trace(msg, KTraceFileName, __LINE__); 
       
   165 
       
   166 
       
   167      iSuplStorageSettings = aSettingsStorage;
       
   168 
       
   169      iSuplSessionId = COMASuplSessionID::NewL();
       
   170      iCompleteSelfRequestor = COMASuplCompleteSelfRequestor::NewL(*this);
       
   171 
       
   172      iSETCapabilities = COMASuplSETCapabilities::NewL();
       
   173 
       
   174      //All caps are on...for NET initiated case
       
   175      iAllowedCapabilities = KGpsSETAssisted | KGpsSETBased | KAutonomousGps| KAFLT | KECID | KEOTD | KOTDOA | KCID; 
       
   176 
       
   177      //Ownership transfer to iSuplSessionId
       
   178      COMASuplSETSessionID* SETSessionId  = COMASuplSETSessionID::NewL();
       
   179 
       
   180      iSuplSessionId->SetSETSessionID(SETSessionId);
       
   181 
       
   182      //Ownership transfer to iSuplSessionId
       
   183      iSuplSessionId->SetSLPSessionID(NULL); 	
       
   184 
       
   185      iSuplVersion.SetSuplVersion(KSuplMajorVersion,KSuplMinorVersion,KSuplRevision);
       
   186 
       
   187      if( aIMSI.Length() )
       
   188          {
       
   189          iIMSI.Create( aIMSI );    
       
   190          }
       
   191 
       
   192      if(iPosHandler)
       
   193          {
       
   194          iTrace->Trace(_L("Creating POSSession..."), KTraceFileName, __LINE__); 
       
   195          iPOSSession = iPosHandler->CreateNewSessionL(this);
       
   196          //Don't move this statement else where
       
   197          iOMASuplPOSRequestor = COMASuplPOSRequestor::NewL(this,iPOSSession);
       
   198          }
       
   199      else
       
   200          {
       
   201          iTrace->Trace(_L("No POS plugin exists..."), KTraceFileName, __LINE__); 				
       
   202          }
       
   203 
       
   204 
       
   205      iTimer = COMASuplTimeoutTimer::NewL(*this);
       
   206 
       
   207 
       
   208      iIapNotifier = COMASuplIapNotifier::NewL(*this);
       
   209 
       
   210 
       
   211      iDialogTimer = COMASuplDialogTimer::NewL(*this);
       
   212 
       
   213      iIsQoPPresent = EFalse;	
       
   214      iIsFirstPOSMessage = ETrue;
       
   215      isTimeoutDialogTimerStarted = EFalse;
       
   216 
       
   217      iDiffTime = 0;
       
   218      iSessionCompletionCode = KErrCompletion;
       
   219 	 iClientName.CreateL(256);
       
   220         iRequestorName.CreateL(256);
       
   221         iRequestorName.Zero();
       
   222         iNetworkPrivacy 	= CPosNetworkPrivacy::NewL();
       
   223         iRequestorId = 0;
       
   224      iTrace->Trace(_L("End of COMASuplSession::ConstructL"), KTraceFileName, __LINE__); 
       
   225      }
       
   226 
       
   227 //
       
   228 // -----------------------------------------------------------------------------
       
   229 // COMASuplSession::NewL
       
   230 // Creates new instance of COMASuplSession 
       
   231 // (other items were commented in a header).
       
   232 // -----------------------------------------------------------------------------
       
   233 //
       
   234  COMASuplSession* COMASuplSession::NewL(CSuplCommunicationManager& aCommManager,
       
   235 																				RMobilePhone& aMobilePhone,
       
   236 																				COMASuplSettings*& aSettings,
       
   237 																				CSuplSettingsInternal* aSettingsStorage,
       
   238 																				TOMASuplReqType  aRequestType,
       
   239 																				MOMASuplSessionObserver& aSessionObserver,
       
   240 																				COMASuplPosHandlerBase *aPosHandler,
       
   241 																				TDes& aIMSI,
       
   242 																				COMASUPLProtocolManager2 &aProtoMgr,
       
   243 																				TInt aIpcSessionId,
       
   244 																				COMASuplAsnHandlerBase* aOMASuplAsnHandlerBase)
       
   245      { 	
       
   246      COMASuplSession* self = new( ELeave ) 
       
   247      COMASuplSession( aMobilePhone,aRequestType, aPosHandler, 
       
   248              aSessionObserver, aSettings, aProtoMgr, aIpcSessionId,aOMASuplAsnHandlerBase);
       
   249      CleanupStack::PushL( self );
       
   250      self->ConstructL( aCommManager, aSettingsStorage, aIMSI );
       
   251      CleanupStack::Pop(self);
       
   252      return self;
       
   253      }
       
   254     
       
   255 // -----------------------------------------------------------------------------
       
   256 // COMASuplSession::DestroySession
       
   257 // This method will delete this session..since only protocol manager will delete session object
       
   258 // (other items were commented in a header).
       
   259 // -----------------------------------------------------------------------------
       
   260 //
       
   261  void COMASuplSession::DestroySession()
       
   262      {
       
   263      iTrace->Trace(_L("COMASuplSession::DestroySession"), KTraceFileName, __LINE__); 
       
   264 
       
   265      //This is for sending SUPL_END if session is destroed while RunSession is going on.
       
   266      if(iRequestType == ESUPL_TERMINAL && iSuplSessionState!= ESUPL_TERMINATED)
       
   267          {
       
   268          CancelRunSession();
       
   269          SessionEnd();
       
   270          CompleteSession(KErrCancel);
       
   271          }
       
   272 
       
   273      delete this;
       
   274      }
       
   275 
       
   276 // -----------------------------------------------------------------------------
       
   277 // COMASuplSession::PosPlugInUnloaded
       
   278 // Handles Pos handler unload
       
   279 // -----------------------------------------------------------------------------
       
   280 void COMASuplSession::PosPlugInUnloaded() 
       
   281     {
       
   282     iTrace->Trace(_L("COMASuplSession::PosPlugInUnloaded"), KTraceFileName, __LINE__); 															
       
   283 
       
   284     // Cancel the Session
       
   285     CancelSession();
       
   286 
       
   287     // Delete the POS Requestor
       
   288     delete iOMASuplPOSRequestor;
       
   289     iOMASuplPOSRequestor = NULL;
       
   290 
       
   291     // Delete the POS Session
       
   292     delete iPOSSession;
       
   293     iPOSSession = NULL;
       
   294 
       
   295     if(iSuplSessionState == ESUPL_SEND)
       
   296         {
       
   297         CompleteSession(KErrCompletion);
       
   298         }
       
   299     else
       
   300         {
       
   301         //Close Connection : bug Fix.
       
   302         iConnRequestor->CloseConnection();
       
   303         iPortNum = 0;
       
   304         iSessionObserver.TerminateSession(this, KErrCompletion);	
       
   305         }
       
   306     }
       
   307 
       
   308 	
       
   309 //Desrtuctor    
       
   310  COMASuplSession::~COMASuplSession()
       
   311      {
       
   312      if(iTrace)
       
   313          iTrace->Trace(_L("Start ~COMASuplSession::COMASuplSession"), KTraceFileName, __LINE__); 
       
   314 
       
   315      CleanUp();
       
   316 
       
   317      delete iEncodedBuffer;
       
   318      delete iSuplState;
       
   319      delete iOMASuplPOSRequestor;
       
   320      delete iConnRequestor;
       
   321      delete iSuplSessionId; 
       
   322      delete iCompleteSelfRequestor;
       
   323      delete iDecodedAsnMessage;
       
   324      delete iSETCapabilities;
       
   325      delete iPosition;
       
   326      delete iEncodedSuplInit;
       
   327      delete iPOSSession;
       
   328      iPOSSession = NULL;
       
   329      delete iTimer;
       
   330      delete iIapNotifier;
       
   331      iIMSI.Close();
       
   332      delete iDialogTimer;
       
   333      iClientName.Close();
       
   334         iRequestorName.Close();
       
   335         delete iSuplReqInfo;
       
   336         delete iNetworkPrivacy;
       
   337 
       
   338      if(iTrace)
       
   339          iTrace->Trace(_L("End of ~COMASuplSession::COMASuplSession"), KTraceFileName, __LINE__); 
       
   340 
       
   341      delete iTrace;
       
   342      }
       
   343 
       
   344 // -----------------------------------------------------------------------------
       
   345 // COMASuplSession::Initialize
       
   346 // This method initializes the OMA SUPL Session Object
       
   347 // (other items were commented in a header).
       
   348 // -----------------------------------------------------------------------------
       
   349 //
       
   350  void COMASuplSession::InitializeL(TInt aRequestID)
       
   351      {
       
   352      iSuplSessionState = ESUPL_INITIALIZED;
       
   353      iRequestID = aRequestID;
       
   354      if(iPOSSession)
       
   355          {
       
   356          iTrace->Trace(_L("COMASuplSession::InitializeL of POS"), KTraceFileName, __LINE__); 
       
   357          iOMASuplPOSRequestor->SetObserver(this);
       
   358          TInt err = iOMASuplPOSRequestor->InitilizePOSSessionL(aRequestID);
       
   359          if(err != KErrNone)
       
   360              {
       
   361              iTrace->Trace(_L("Initilization Failed ..."), KTraceFileName, __LINE__); 
       
   362              CompleteSession(KErrNotReady);
       
   363              }
       
   364          }
       
   365      else
       
   366          {
       
   367          iTrace->Trace(_L("InitializeL, calling OperationCompleteL"), KTraceFileName, __LINE__); 
       
   368          OperationCompleteL(KErrNone);	
       
   369          }
       
   370      }
       
   371 
       
   372 // -----------------------------------------------------------------------------
       
   373 // COMASuplSession::CleanUp
       
   374 // Perfomrs clean up operations on the OMA SUPL Session Object
       
   375 // This releases any resource held by the object
       
   376 // (other items were commented in a header).
       
   377 // -----------------------------------------------------------------------------
       
   378 //
       
   379  void COMASuplSession::CleanUp()
       
   380      {
       
   381     	if(iTrace)
       
   382      iTrace->Trace(_L("COMASuplSession::CleanUp"), KTraceFileName, __LINE__); 
       
   383 
       
   384      if(iSuplState)
       
   385          {
       
   386          if(iSuplSessionState != ESUPL_SESSION_ERROR)
       
   387              {
       
   388              iSuplState->CancelOperation();
       
   389              }
       
   390          }
       
   391 
       
   392      iConnRequestor->Cancel();
       
   393 
       
   394      delete iEncodedBuffer;
       
   395      iEncodedBuffer = NULL;
       
   396      delete iDecodedAsnMessage; 
       
   397      iDecodedAsnMessage = NULL;
       
   398 	 RemoveActiveSession();
       
   399 		if(iTrace)
       
   400      iTrace->Trace(_L("End of COMASuplSession::CleanUp"), KTraceFileName, __LINE__); 
       
   401      }
       
   402 
       
   403 
       
   404 // -----------------------------------------------------------------------------
       
   405 // COMASuplSession::RequestType
       
   406 // Returns the type of request associated with the session
       
   407 // (other items were commented in a header).
       
   408 // -----------------------------------------------------------------------------
       
   409 //
       
   410 COMASuplSession::TOMASuplReqType COMASuplSession::RequestType()
       
   411     {
       
   412     return iRequestType; //SET OR NET
       
   413     }
       
   414 
       
   415 // -----------------------------------------------------------------------------
       
   416 // COMASuplSession::SessionEnd
       
   417 // Cleans up the session and completes
       
   418 // (other items were commented in a header).
       
   419 // -----------------------------------------------------------------------------
       
   420 //
       
   421  void COMASuplSession::SessionEnd()
       
   422      {	
       
   423      iSuplSessionState = ESUPL_TERMINATED;
       
   424 
       
   425      // Invoke SessionEnd on the POS Session
       
   426      iTrace->Trace(_L("COMASuplSession::SessionEnd"), KTraceFileName, __LINE__); 
       
   427      // CleanUp
       
   428      CleanUp();
       
   429      if(iPOSSession)
       
   430          {
       
   431          iPOSSession->SessionEnd();
       
   432          iTrace->Trace(_L("POS Session...COMASuplSession::SessionEnd."), KTraceFileName, __LINE__); 
       
   433          }
       
   434      }   
       
   435 // -----------------------------------------------------------------------------
       
   436 // COMASuplSession::RunSuplSession
       
   437 // Starts the SUPL Sesssion for Terminal Initiated Location Request
       
   438 // The call to this method will result in the generation of SUPL START 
       
   439 // and sending of the SUPL START packet to the SLP.
       
   440 // (other items were commented in a header).
       
   441 // -----------------------------------------------------------------------------
       
   442 //
       
   443  void COMASuplSession::RunSuplSessionL(TRequestStatus& aStatus, TBool aFirstReq, const TDesC& aHslpAddress, 
       
   444                                        TBool aFallBack, TInt aAllowedCapabilities,
       
   445  									  TInt aSessionIdSeed,TInt aRequestID)
       
   446      {
       
   447      iRunRequestStatus = & aStatus;
       
   448      *iRunRequestStatus = KRequestPending;
       
   449 
       
   450      iRequestID = aRequestID;
       
   451 
       
   452      iTrace->Trace(_L("Start COMASuplSession::RunSuplSession"), KTraceFileName, __LINE__); 
       
   453 
       
   454      // Log Session Id
       
   455      TBuf<64> id;
       
   456      id.Append(_L("Session  Id is "));
       
   457      id.AppendNum(aSessionIdSeed);
       
   458      iTrace->Trace(id,KTraceFileName, __LINE__); 
       
   459 
       
   460      // Log Capability from client
       
   461      id.Copy(_L("Received Capability is "));
       
   462      id.AppendNum(aAllowedCapabilities);
       
   463      iTrace->Trace(id,KTraceFileName, __LINE__); 
       
   464 
       
   465      iSETSessionUniqueId = aSessionIdSeed;
       
   466 
       
   467 
       
   468      TInt networkMode = 1;
       
   469      networkMode = GetNetworkModeL();
       
   470 
       
   471      if ( networkMode == ECoreAppUIsNetworkConnectionNotAllowed )
       
   472          {
       
   473          id.Copy(_L("The device is in OFFLINE mode."));
       
   474          iTrace->Trace(id,KTraceFileName, __LINE__); 
       
   475          iSessionObserver.TerminateSession(this, KErrGeneral);
       
   476          return;
       
   477          }
       
   478      else
       
   479          {
       
   480          id.Copy(_L("The device is in ON LINE mode."));
       
   481          iTrace->Trace(id,KTraceFileName, __LINE__); 
       
   482          }
       
   483 
       
   484      if(aAllowedCapabilities == 0)
       
   485          {
       
   486          iAllowedCapabilities = KGpsSETAssisted | KGpsSETBased | KAutonomousGps| KAFLT | KECID | KEOTD | KOTDOA | KCID; 
       
   487          }
       
   488      else
       
   489          {
       
   490          iAllowedCapabilities = aAllowedCapabilities;
       
   491          }
       
   492 
       
   493      //Ownership transfer to iSuplSessionId
       
   494      iSuplSessionId->SetSLPSessionID(NULL); 	
       
   495 
       
   496      iConnRequestor->SetDefaultParametersL(aHslpAddress,aFallBack);
       
   497 
       
   498      if (aFirstReq)
       
   499          CheckForSuplUsageL();
       
   500      else
       
   501          CheckForPreviousResultL();        
       
   502 
       
   503 
       
   504 
       
   505 // Clear  Position....
       
   506      delete iPosition;
       
   507      iPosition = NULL;
       
   508 
       
   509 
       
   510      iTrace->Trace(_L("End of COMASuplSession::RunSuplSession"), KTraceFileName, __LINE__); 
       
   511      }
       
   512 
       
   513 // -----------------------------------------------------------------------------
       
   514 // COMASuplSession::RunSuplSession
       
   515 // Starts the SUPL Sesssion for Terminal Initiated Location Request, with QoP
       
   516 // The call to this method will result in the generation of SUPL START 
       
   517 // and sending of the SUPL START packet to the SLP.
       
   518 // (other items were commented in a header).
       
   519 // -----------------------------------------------------------------------------
       
   520 //
       
   521   void COMASuplSession::RunSuplSessionL(TRequestStatus& aStatus, TBool aFirstReq,
       
   522                                         const TDesC& aHslpAddress, TBool aFallBack,
       
   523   										TInt aAllowedCapabilities,TInt aSessionIdSeed,
       
   524   										TSuplTerminalQop& aQop, TInt aRequestID)
       
   525       {
       
   526 
       
   527 
       
   528       iClientQop = aQop;
       
   529 
       
   530       TInt delay;
       
   531       if(iClientQop.GetDelay(delay) != KErrNotFound)
       
   532           {
       
   533           iSessionStartTime.HomeTime();
       
   534           }
       
   535 
       
   536       iIsQoPPresent = ETrue;	
       
   537       RunSuplSessionL(aStatus,aFirstReq, aHslpAddress, aFallBack, aAllowedCapabilities,aSessionIdSeed,aRequestID);
       
   538       }
       
   539 
       
   540 // -----------------------------------------------------------------------------
       
   541 // CSuplSession::RunInvalidSessionL
       
   542 // Starts the SUPL Sesssion for Invalid Session ID 
       
   543 // Completes Self so that protocol Manager can process other stuff 
       
   544 // (other items were commented in a header).
       
   545 // -----------------------------------------------------------------------------
       
   546 //    
       
   547 void COMASuplSession::RunInvalidSessionL(COMASuplAsnMessageBase* aDecodedMsg)
       
   548     {
       
   549 
       
   550     // Check if the message type is SUPL END
       
   551     COMASuplAsnMessageBase::TSuplMessageType messageType = aDecodedMsg->MessageType();
       
   552 
       
   553     if(messageType == COMASuplAsnMessageBase::ESUPL_END)
       
   554         {
       
   555         return;
       
   556         }
       
   557 
       
   558     COMASuplSessionID* retrivedSessionID = NULL;
       
   559     aDecodedMsg->SessionId(retrivedSessionID);
       
   560 
       
   561     // Set the SessionId.
       
   562     UpdateSLPSessionIDL(retrivedSessionID);
       
   563     UpdateSETSessionIDL(retrivedSessionID);
       
   564 
       
   565     //Set default slp to Conn Requestor...		
       
   566     iConnRequestor->UseDefaultServerL();
       
   567 
       
   568     // Complete Self
       
   569     iCompleteSelfRequestor->CompleteInvalidSession();
       
   570 
       
   571     }
       
   572 
       
   573 // -----------------------------------------------------------------------------
       
   574 // CSuplSession::StartInvalidSessionL
       
   575 // Starts the SUPL Sesssion for Invalid Session ID 
       
   576 // Generate SUPL End with error state set ti Invalid Session
       
   577 // (other items were commented in a header).
       
   578 // -----------------------------------------------------------------------------
       
   579 //    
       
   580 void COMASuplSession::StartInvalidSessionL()
       
   581     {
       
   582     iTrace->Trace(_L("Start COMASuplSession::StartInvalidSessionL"), KTraceFileName, __LINE__); 
       
   583     iErrorStatusCode = COMASuplEnd::EInvalidSessionId;
       
   584     GenerateSuplEndL();
       
   585     }
       
   586 
       
   587 // -----------------------------------------------------------------------------
       
   588 // CSuplSession::GenerateSuplMessage
       
   589 // This method generates an appropriate SUPL Message based on the state
       
   590 // of the SUPL object
       
   591 // 
       
   592 // (other items were commented in a header).
       
   593 // -----------------------------------------------------------------------------
       
   594 //
       
   595  void COMASuplSession::GenerateSuplMessageL()
       
   596      {
       
   597      switch(iSuplSessionState)
       
   598          {
       
   599          //case ESUPL_INITIALIZED:
       
   600          case ESUPL_CONNECTING:
       
   601              {
       
   602              if(iRequestType == ESUPL_TERMINAL )
       
   603                  {
       
   604                  if (iTriggerSession)
       
   605                      {   
       
   606                      if (iTrgCancelRequest)                                    
       
   607                          {                                    
       
   608                          iTrgCancelRequest = EFalse;                                        
       
   609                          iErrorStatusCode = COMASuplEnd::EVer2SessionStopped;
       
   610                          GenerateSuplTriggerStopL();	
       
   611                          }
       
   612                      else if (iSuplMsgType == ESUPL_TRIG_RESPONSE || iSuplMsgType == ESUPL_REPORT)
       
   613                          {                                    
       
   614                          GenerateSuplPosInitL();
       
   615                          }
       
   616                      else
       
   617                          {                                    
       
   618                          GenerateSuplTriggerStartL();
       
   619                          }
       
   620                      }
       
   621                  else                        
       
   622                      GenerateSuplStartL();	
       
   623                  }
       
   624              if(iRequestType == ESUPL_NETWORK )
       
   625                  {
       
   626                  if (iTriggerSession)
       
   627                      {                                
       
   628                      if (iTrgCancelRequest)                                    
       
   629                          {                                    
       
   630                          iTrgCancelRequest = EFalse;                                        
       
   631                          iErrorStatusCode = COMASuplEnd::EVer2SessionStopped;
       
   632                          GenerateSuplTriggerStopL();	
       
   633                          }
       
   634                      else if (iSuplMsgType == ESUPL_TRIG_RESPONSE || iSuplMsgType == ESUPL_REPORT)
       
   635                          {                                    
       
   636                          GenerateSuplPosInitL();	
       
   637                          }
       
   638                      else                                    
       
   639                          {                                    
       
   640                          GenerateSuplTriggerStartL();
       
   641                          }
       
   642                      }
       
   643                  else                        
       
   644                      GenerateSuplPosInitL();	
       
   645                  }
       
   646              if(iRequestType == ESUPL_INVALID_SESSION )
       
   647                  {
       
   648                  GenerateSuplEndL();	
       
   649                  }
       
   650 
       
   651              break;
       
   652              }
       
   653          case ESUPL_GENERATE:
       
   654              {
       
   655              switch(iSuplMsgType)
       
   656                  {
       
   657                  case ESUPL_RESPONSE:
       
   658                  case ESUPL_TRIG_RESPONSE:
       
   659                  case ESUPL_REPORT:
       
   660                  case ESUPL_INIT:
       
   661                      GenerateSuplPosInitL();
       
   662                      break;
       
   663                  case ESUPL_END:
       
   664                      GenerateSuplEndL();
       
   665                      break;
       
   666                  case ESUPL_POS:
       
   667                      GenerateSuplPosL();	
       
   668                      break;
       
   669 							case ESUPL_TRIG_STOP:
       
   670 								 GenerateSuplTriggerStopL();	
       
   671 								 break;
       
   672                  default:
       
   673                      // Error
       
   674                      break;
       
   675                  }
       
   676              break;		
       
   677              }
       
   678          }
       
   679      }
       
   680 
       
   681 // -----------------------------------------------------------------------------
       
   682 // COMASuplSession::GenerateSuplStart
       
   683 // Generate SUPL START from session
       
   684 // (other items were commented in a header).
       
   685 // -----------------------------------------------------------------------------
       
   686 // 
       
   687 void COMASuplSession::GenerateSuplStartL()			
       
   688     {
       
   689     iTrace->Trace(_L("Start of COMASuplSession::GenerateSuplStartL"), KTraceFileName, __LINE__);
       
   690 
       
   691     // Free the existing state if any
       
   692     delete iSuplState;
       
   693     iSuplState = NULL;
       
   694 
       
   695     iSuplState = COMASuplStartState::NewL(iMobilePhone, iUT1_StartTimer,iOMASuplPOSRequestor,iOMASuplAsnHandlerBaseImpl,iAllowedCapabilities);
       
   696     iSuplState->SetMsgStateObserver(this);
       
   697     if(iIsQoPPresent)
       
   698         {
       
   699         COMASuplStartState* startSuplState =  static_cast <COMASuplPosInitState *>(iSuplState);
       
   700         startSuplState->SetQop(iClientQop);
       
   701         }
       
   702 
       
   703     TInt err = iSuplState->GenerateMessageL();
       
   704     iSuplMsgType = ESUPL_START;
       
   705     SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplCreating);	
       
   706     }  
       
   707 
       
   708 // -----------------------------------------------------------------------------
       
   709 // COMASuplSession::GenerateSuplTriggerStart
       
   710 // Generate SUPL TRIGGER START from session
       
   711 // (other items were commented in a header).
       
   712 // -----------------------------------------------------------------------------
       
   713 // 
       
   714 void COMASuplSession::GenerateSuplTriggerStartL()			
       
   715     {
       
   716     iTrace->Trace(_L("Start of COMASuplSession::GenerateSuplTriggerStartL"), KTraceFileName, __LINE__);
       
   717 
       
   718     // Free the existing state if any
       
   719     delete iSuplState;
       
   720     iSuplState = NULL;
       
   721 
       
   722     iSuplState = COMASuplTriggerStartState::NewL(iMobilePhone, iUT1_StartTimer,iOMASuplPOSRequestor,iOMASuplAsnHandlerBaseImpl,iAllowedCapabilities, iTriggerParams, iRequestType);
       
   723     iSuplState->SetMsgStateObserver(this);
       
   724     if(iIsQoPPresent)
       
   725         {
       
   726         COMASuplTriggerStartState* startSuplState =  static_cast <COMASuplTriggerStartState *>(iSuplState);
       
   727         startSuplState->SetQop(iClientQop);
       
   728         }
       
   729 
       
   730     TInt err = iSuplState->GenerateMessageL();
       
   731     iSuplMsgType = ESUPL_TRIG_START;
       
   732     SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplCreating);	
       
   733     }  
       
   734 	 
       
   735 
       
   736 // -----------------------------------------------------------------------------
       
   737 // COMASuplSession::GenerateSuplPosInitL
       
   738 // Generate SUPL POS INIT from session
       
   739 // (other items were commented in a header).
       
   740 // -----------------------------------------------------------------------------
       
   741 //
       
   742 void COMASuplSession::GenerateSuplPosInitL()			
       
   743     {
       
   744     iTrace->Trace(_L("Start of COMASuplSession::GenerateSuplPosInitL"), KTraceFileName, __LINE__);
       
   745 
       
   746     // Free the existing state if any
       
   747     iTrace->Trace(_L("Deleting SUPL State"), KTraceFileName, __LINE__);
       
   748     delete iSuplState;
       
   749     iSuplState = NULL;
       
   750 
       
   751     iTrace->Trace(_L("Setting SUPL State to NULL - successful "), KTraceFileName, __LINE__);
       
   752     if(iRequestType == ESUPL_NETWORK)
       
   753         {
       
   754         iTrace->Trace(_L("iRequestType == ESUPL_NETWORK is true"), KTraceFileName, __LINE__);
       
   755         TBuf<256> serverAddress;
       
   756         HBufC8 *hslpAdress = HBufC8::NewL(256);
       
   757         iConnRequestor->GetUsedServerAddress(serverAddress);
       
   758         hslpAdress->Des().Copy(serverAddress);
       
   759         CleanupStack::PushL(hslpAdress);
       
   760         if (iTriggerSession)
       
   761             {                    
       
   762             iSuplState = COMASuplPosInitState::NewL(iSETCapabilities, iMobilePhone, iUT2_PosInitTimer,
       
   763                     iOMASuplPOSRequestor,iAllowedCapabilities, iRequestType, iPosMethod, iOMASuplAsnHandlerBaseImpl);
       
   764             }
       
   765         else
       
   766             {                    
       
   767             iSuplState = COMASuplPosInitState::NewL(iSETCapabilities, iMobilePhone, iUT2_PosInitTimer,
       
   768                     iOMASuplPOSRequestor,iAllowedCapabilities, iRequestType, iPosMethod, iOMASuplAsnHandlerBaseImpl,iEncodedSuplInit, hslpAdress);
       
   769             }
       
   770 
       
   771         if(hslpAdress)
       
   772             {
       
   773             CleanupStack::PopAndDestroy(hslpAdress);
       
   774             }
       
   775         }
       
   776     else
       
   777         {
       
   778         TBuf<128> msg(_L("COMASuplSession::GenerateSuplPosInitL() without last 2 params : "));
       
   779         msg.AppendNum(iPosMethod);
       
   780         iTrace->Trace(msg, KTraceFileName, __LINE__);
       
   781         iSuplState = COMASuplPosInitState::NewL(iSETCapabilities, iMobilePhone, iUT2_PosInitTimer,
       
   782                 iOMASuplPOSRequestor,iAllowedCapabilities,iRequestType, iPosMethod,iOMASuplAsnHandlerBaseImpl);
       
   783 
       
   784         }
       
   785     iSuplState->SetMsgStateObserver(this);
       
   786 
       
   787     //If trigger session, set flag
       
   788     if (iTriggerSession)
       
   789         {                    
       
   790         COMASuplPosInitState* state =  static_cast <COMASuplPosInitState *>(iSuplState);
       
   791         state->SetTriggerSessionFlag(ETrue);
       
   792         }                    
       
   793 
       
   794     iSuplState->GenerateMessageL();
       
   795 
       
   796     iSuplMsgType = ESUPL_POSINIT;
       
   797 
       
   798     SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplCreating);	
       
   799     }   
       
   800 
       
   801 // -----------------------------------------------------------------------------
       
   802 // COMASuplSession::GenerateSuplPosL
       
   803 // Generate SUPL POS from session
       
   804 // (other items were commented in a header).
       
   805 // -----------------------------------------------------------------------------
       
   806 //
       
   807 void COMASuplSession::GenerateSuplPosL()			
       
   808     {
       
   809     iTrace->Trace(_L("Start of COMASuplSession::GenerateSuplPosL"), KTraceFileName, __LINE__);
       
   810 
       
   811     if(COMASuplState::ESUPL_POS != iSuplState->GetSuplState()) // Check if existing is of POS type.
       
   812         {
       
   813         COMASuplPosPayload* remainingPosPayload = GetRemainingPosPayloadL();
       
   814         delete iSuplState;
       
   815         iSuplState = NULL;
       
   816         iSuplState = COMASuplPosState::NewL(iPOSSession,iUT3_PosTimer,iSETCapabilities,iOMASuplAsnHandlerBaseImpl);					
       
   817 
       
   818         COMASuplPosState* state =  static_cast <COMASuplPosState *>(iSuplState);
       
   819         state->SetRemainingPosPayloadFromSuplPosInitL(remainingPosPayload);//ownership transfered to POS state class
       
   820         }
       
   821 
       
   822     iSuplState->SetMsgStateObserver(this);
       
   823     iSuplMsgType = ESUPL_POS;
       
   824     SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplCreating);	
       
   825     COMASuplPosState* posState =  static_cast <COMASuplPosState*>(iSuplState);
       
   826     if(!(posState->IsGenerationInProgress()))
       
   827         {
       
   828         iSuplSessionState = ESUPL_ENCODE;
       
   829         TInt err = iSuplState->GenerateMessageL();
       
   830         if(err != KErrNone) 
       
   831             {
       
   832             iTrace->Trace(_L("COMASuplSession::GenerateSuplPosL Failed..."), KTraceFileName, __LINE__); 
       
   833             OperationCompleteL(err);//Error handling.
       
   834             }
       
   835         }
       
   836 
       
   837     }   
       
   838 
       
   839 // -----------------------------------------------------------------------------
       
   840 // COMASuplSession::GenerateSuplEndL
       
   841 // Generate SUPL END from session
       
   842 // (other items were commented in a header).
       
   843 // -----------------------------------------------------------------------------
       
   844 //
       
   845 void COMASuplSession::GenerateSuplEndL()			
       
   846     {
       
   847     iTrace->Trace(_L("Start of COMASuplSession::GenerateSuplEnd..."), KTraceFileName, __LINE__);
       
   848 
       
   849     // Free the existing state if any
       
   850     delete iSuplState;
       
   851     iSuplState = NULL;
       
   852 
       
   853     if(iRequestType == ESUPL_INVALID_SESSION )
       
   854         {
       
   855         iSuplSessionState = ESUPL_INITIALIZED;
       
   856         }
       
   857     else 							
       
   858         {
       
   859         iSuplSessionState = ESUPL_ENCODE;	//Normal End
       
   860         }
       
   861 
       
   862     iSuplState = COMASuplEndState::NewL(iErrorStatusCode,iOMASuplAsnHandlerBaseImpl);
       
   863     iSuplState->SetMsgStateObserver(this);
       
   864     iSuplMsgType = ESUPL_END;
       
   865     SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplCreating);	
       
   866     iSuplState->GenerateMessageL();
       
   867     }   
       
   868 
       
   869 // -----------------------------------------------------------------------------
       
   870 // COMASuplSession::GenerateTriggerStopL
       
   871 // Generate SUPL END from session
       
   872 // (other items were commented in a header).
       
   873 // -----------------------------------------------------------------------------
       
   874 //
       
   875 void COMASuplSession::GenerateSuplTriggerStopL()			
       
   876     {
       
   877     iTrace->Trace(_L("Start of COMASuplSession::GenerateSuplTriggerStopL..."), KTraceFileName, __LINE__);
       
   878 
       
   879     // Free the existing state if any
       
   880     delete iSuplState;
       
   881     iSuplState = NULL;
       
   882 
       
   883     iSuplSessionState = ESUPL_ENCODE;	//Normal End
       
   884 
       
   885     iSuplState = COMASuplTriggerStopState::NewL(iErrorStatusCode,iOMASuplAsnHandlerBaseImpl);
       
   886     iSuplState->SetMsgStateObserver(this);
       
   887     iSuplMsgType = ESUPL_TRIG_STOP;
       
   888     SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplCreating);	
       
   889     iSuplState->GenerateMessageL();
       
   890     }   
       
   891 
       
   892 // -----------------------------------------------------------------------------
       
   893 //COMASuplSession::CompleteSession
       
   894 //Informs to client about completion of location request, thro' active object
       
   895  void COMASuplSession::CompleteSession(TInt aCompletionCode)
       
   896      {	
       
   897      iTrace->Trace(_L("COMASuplSession::CompleteSession start"), KTraceFileName, __LINE__);
       
   898      if(iRunRequestStatus)
       
   899          {
       
   900 
       
   901          TTime currentTime;
       
   902          currentTime.HomeTime();
       
   903          iSessionCompletionCode = aCompletionCode;
       
   904 
       
   905          TBuf<64> errorCode;
       
   906          errorCode.Append(_L("Completing Session with error code : "));
       
   907          errorCode.AppendNum(aCompletionCode);
       
   908          iTrace->Trace(errorCode, KTraceFileName, __LINE__); 
       
   909 
       
   910          //Cell filtering is only for non-trigger requests    
       
   911          if (!iTriggerSession)    
       
   912          	iConnRequestor->UpdateNetInfo(currentTime,iCurrentCellId.iMCC,iCurrentCellId.iMNC,iCurrentCellId.iCid,iCurrentCellId.iLac,iNetworkType,aCompletionCode);
       
   913 
       
   914          User::RequestComplete(iRunRequestStatus,aCompletionCode);
       
   915          }
       
   916      }
       
   917 
       
   918 // -----------------------------------------------------------------------------
       
   919 // COMASuplSession::OperationComplete
       
   920 // Gets control when any of the asynchronous requests are completed
       
   921 // This is a very important method and drives the OMS SUPL
       
   922 // State Machine
       
   923 // (other items were commented in a header).
       
   924 // -----------------------------------------------------------------------------
       
   925 //
       
   926 void COMASuplSession::OperationCompleteL(TInt aErrorCode)
       
   927     {
       
   928     iTrace->Trace(_L("COMASuplSession::OperationCompleteL"), KTraceFileName, __LINE__);
       
   929     TBuf<128> msg;
       
   930 
       
   931     msg.Copy(_L("State is "));
       
   932     msg.AppendNum(iSuplSessionState);
       
   933 
       
   934     iTrace->Trace(msg, KTraceFileName, __LINE__);
       
   935 
       
   936     if(KErrNone != aErrorCode)
       
   937         {
       
   938         msg.Copy(_L("Actual Error Code : "));
       
   939         msg.AppendNum(aErrorCode);
       
   940         iTrace->Trace(msg, KTraceFileName, __LINE__); 
       
   941 
       
   942         if (iSuplSessionState == ESUPL_CONNECTING)
       
   943             CheckForPersistentFailure(aErrorCode);                    
       
   944         HandleSuplErrorL(aErrorCode);
       
   945         return;
       
   946         }
       
   947 
       
   948     TInt err = KErrNone;
       
   949 
       
   950     switch(iSuplSessionState)
       
   951         {
       
   952         case ESUPL_INITIALIZED:
       
   953             {
       
   954             if (iRequestType == ESUPL_NETWORK) 
       
   955                 {
       
   956                 iIapDialogShown = ETrue;                                                
       
   957                 TInt delay ;
       
   958                 iTrace->Trace(_L("Dialog timer not started earlier and request is NI, starting now"), KTraceFileName, __LINE__);
       
   959                 if (iDiffTime.Int() == 0)
       
   960                     {                                                
       
   961                     COMASuplInit* suplInit = static_cast <COMASuplInit*> (iDecodedAsnMessage);
       
   962                     TOMASuplQop qop;
       
   963                     TInt retVal = suplInit->Qop(qop);
       
   964 
       
   965                     qop.Delay(delay);
       
   966                     //if delay is > 7, it is not valid
       
   967                     if (delay > 7)
       
   968                         delay = 0;                                
       
   969                     if(retVal == KErrNone && delay > 0)
       
   970                         {
       
   971                         TReal delayReal;
       
   972                         Math::Pow(delayReal, 2, (TReal)delay);
       
   973                         delay = (TInt) delayReal;
       
   974                         msg.Copy(_L("Delay present in message, value is = "));
       
   975                         msg.AppendNum(delay);
       
   976                         iTrace->Trace(msg, KTraceFileName, __LINE__); 
       
   977                         isTimeoutDialogTimerStarted = ETrue;
       
   978                         }
       
   979                     else
       
   980                         {
       
   981                         if (iSuplInitTimeOut > 0)
       
   982                             {                                                        
       
   983                             iTrace->Trace(_L("Delay not present in message"), KTraceFileName, __LINE__);
       
   984                             msg.Copy(_L("Delay value in CR is"));
       
   985                             msg.AppendNum(iSuplInitTimeOut);
       
   986                             iTrace->Trace(msg, KTraceFileName, __LINE__);
       
   987                             isTimeoutDialogTimerStarted = ETrue;
       
   988                             delay = iSuplInitTimeOut * KSecond;
       
   989                             }
       
   990                         else
       
   991                             {
       
   992                             iTrace->Trace(_L("Timeout is <= 0"), KTraceFileName, __LINE__);
       
   993                             }    
       
   994                         }
       
   995                     }
       
   996                 else
       
   997                     {
       
   998                     msg.Copy(_L("Time diff used, diff = "));
       
   999                     msg.AppendNum(iDiffTime.Int());
       
  1000                     iTrace->Trace(msg, KTraceFileName, __LINE__);
       
  1001                     isTimeoutDialogTimerStarted = ETrue;	
       
  1002                     delay = iDiffTime.Int();
       
  1003                     }                                                
       
  1004                     if (iSuplMsgType == ESUPL_TRIG_RESPONSE || iSuplMsgType == ESUPL_REPORT || iDisconnected)
       
  1005                     {
       
  1006                     iTrace->Trace(_L("Calling CreateConnectionL() for trigger"), KTraceFileName, __LINE__);
       
  1007                     TRAP( err, iConnRequestor->CreateConnectionL(delay, ETrue) );
       
  1008                     }
       
  1009                 else                
       
  1010                     {
       
  1011                     iTrace->Trace(_L("Calling CreateConnectionL()"), KTraceFileName, __LINE__);
       
  1012                     TRAP( err, iConnRequestor->CreateConnectionL(delay, EFalse) );
       
  1013                     }
       
  1014                 }
       
  1015             else //terminal initiated case
       
  1016                 {
       
  1017                 if (iSuplMsgType == ESUPL_TRIG_RESPONSE || iSuplMsgType == ESUPL_REPORT || iDisconnected)
       
  1018                     {
       
  1019                     iTrace->Trace(_L("Calling CreateConnectionL() for trigger"), KTraceFileName, __LINE__);
       
  1020                     iDisconnected = EFalse;
       
  1021                     TRAP( err, iConnRequestor->CreateConnectionL(ETrue) );
       
  1022                     }                                                
       
  1023                 else
       
  1024                     {
       
  1025                     iTrace->Trace(_L("Calling CreateConnectionL()"), KTraceFileName, __LINE__);
       
  1026                     TRAP( err, iConnRequestor->CreateConnectionL(EFalse) );
       
  1027                     }                                                
       
  1028                 }
       
  1029             if(KErrNone != err)
       
  1030                 {
       
  1031                 HandleSuplErrorL(err);
       
  1032                 break;
       
  1033                 }
       
  1034             iSuplSessionState = ESUPL_CONNECTING;
       
  1035             break;
       
  1036             }
       
  1037 
       
  1038         case ESUPL_CONNECTING:
       
  1039         		{
       
  1040             //Retrieve the portnumber being used
       
  1041             iPortNum = iConnRequestor->GetPortNumber();
       
  1042 
       
  1043             if(iRequestType == ESUPL_INVALID_SESSION) 
       
  1044                 {
       
  1045                 iTrace->Trace(_L("Handling Invalid Session..."), KTraceFileName, __LINE__); 
       
  1046                 // ::POS::
       
  1047                 delete iEncodedBuffer;
       
  1048                 iEncodedBuffer = NULL;
       
  1049                 iSuplSessionState = ESUPL_ENCODE;
       
  1050                 iEncodedBuffer = iSuplState->EncodeMessageL(iSuplVersion, iSuplSessionId, err);
       
  1051                 if(KErrNone == err)
       
  1052                     {
       
  1053                     iConnRequestor->SendPacket(*iEncodedBuffer);
       
  1054                     iSuplSessionState = ESUPL_SEND;
       
  1055                     }
       
  1056                 }
       
  1057             else
       
  1058                 {
       
  1059                 GenerateSuplMessageL();
       
  1060                 if (iSuplMsgType != ESUPL_TRIG_STOP)
       
  1061 				    iSuplSessionState = ESUPL_GENERATE;
       
  1062                 }
       
  1063             break;
       
  1064             }
       
  1065 
       
  1066         case ESUPL_SEND:
       
  1067             {
       
  1068             // Clean up Encoding buffer before filling it up
       
  1069             delete iEncodedBuffer;
       
  1070             iEncodedBuffer = NULL;
       
  1071 
       
  1072             if(IsWholeMessageSentL())
       
  1073                 {
       
  1074                 SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplSent);
       
  1075                 } 
       
  1076 
       
  1077             if(  (iSuplMsgType == ESUPL_START || iSuplMsgType == ESUPL_POSINIT) && iRequestType == ESUPL_TERMINAL) // Manish : Added this to support Cell filtering...
       
  1078                 {
       
  1079                 COMASuplStartState* SuplStartState =  static_cast <COMASuplStartState *>(iSuplState);
       
  1080                 SuplStartState->GetCurrentCellID(iCurrentCellId,iNetworkType);
       
  1081 
       
  1082 #ifdef PRINT_MESSAGE
       
  1083                 
       
  1084                 msg.Copy(_L("After receiving from SUPL START/SUPL POS INIT"));
       
  1085                 iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1086 
       
  1087                 msg.Copy(_L("cid="));
       
  1088                 msg.AppendNum(iCurrentCellId.iCid);
       
  1089                 iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1090 
       
  1091                 msg.Copy(_L("Lac="));
       
  1092                 msg.AppendNum(iCurrentCellId.iLac);
       
  1093                 iTrace->Trace(msg,KTraceFileName, __LINE__);
       
  1094 
       
  1095                 msg.Copy(_L("MCC="));
       
  1096                 msg.AppendNum(iCurrentCellId.iMCC);
       
  1097                 iTrace->Trace(msg,KTraceFileName, __LINE__);
       
  1098 
       
  1099                 msg.Copy(_L("MNC="));
       
  1100                 msg.AppendNum(iCurrentCellId.iMNC);
       
  1101                 iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1102 #endif
       
  1103 
       
  1104                 }
       
  1105 
       
  1106             if(iPOSSession && iSuplMsgType == ESUPL_POSINIT) //Added while doing confirmance testing...
       
  1107                 {
       
  1108                 COMASuplPosInitState* SuplPosInitState =  static_cast <COMASuplPosInitState *>(iSuplState);
       
  1109                 if(!(SuplPosInitState->IsPosPayloadPresent()))
       
  1110                     {
       
  1111                     iTrace->Trace(_L("StartTimer for SUPL_POSINIT..."), KTraceFileName, __LINE__); 								
       
  1112                     iTimer->StartTimer(iUT2_PosInitTimer * KSecond); 	
       
  1113                     }
       
  1114                 else
       
  1115                     {
       
  1116                     iTrace->Trace(_L("Timer for SUPL_POSINIT not started ..since POS payload is present..."), KTraceFileName, __LINE__); 								
       
  1117                     }
       
  1118                 }
       
  1119             else if (iSuplMsgType == ESUPL_TRIG_STOP)
       
  1120                 {
       
  1121                 iTrace->Trace(_L("StartTimer for SUPL_TRIGGER_STOP..."), KTraceFileName, __LINE__); 
       
  1122                 iTimer->StartTimer(iUT2_PosInitTimer * KSecond); 	
       
  1123                 }                    
       
  1124             else
       
  1125                 {
       
  1126                 iSuplState->StartTimer();
       
  1127                 }
       
  1128 
       
  1129             if(iSuplMsgType == ESUPL_END)
       
  1130                 {
       
  1131                 //Close Connection : bug Fix.
       
  1132                 iConnRequestor->CloseConnection();
       
  1133 				iPortNum = 0;
       
  1134 				RemoveActiveSession();
       
  1135                 // Invoke Terminate Session
       
  1136                 if (iTriggerSession && iRequestType == COMASuplSession::ESUPL_TERMINAL)
       
  1137                     {                            
       
  1138                     iTrace->Trace(_L("COMASuplSession::OperationCompleted...SUPL_END send for trigger..."), KTraceFileName, __LINE__); 
       
  1139                     iSessionObserver.TerminateSession(this, KErrNone);
       
  1140                     }
       
  1141                 else
       
  1142                     {                            
       
  1143                     iTrace->Trace(_L("COMASuplSession::OperationCompleted...SUPL_END send for Error/cancellation..."), KTraceFileName, __LINE__); 
       
  1144                     iSessionObserver.TerminateSession(this, KErrCompletion);
       
  1145                     }
       
  1146                 break;
       
  1147                 }
       
  1148 
       
  1149             if(	iPOSSession && 
       
  1150                     (iSuplMsgType == ESUPL_POSINIT || (iSuplMsgType == ESUPL_POS  && (!IsLastPOSMessage() || IsSegmentationDone()) ) ))
       
  1151                 {
       
  1152                 iTrace->Trace(_L("Generating POS ..."), KTraceFileName, __LINE__); 
       
  1153                 iSuplMsgType = ESUPL_POS;
       
  1154                 iSuplSessionState = ESUPL_GENERATE;
       
  1155                 GenerateSuplMessageL();
       
  1156                 }
       
  1157             break;
       
  1158             }
       
  1159 
       
  1160         case ESUPL_GENERATE:
       
  1161             {
       
  1162             // Set the appropriate state
       
  1163             if(iRequestType == ESUPL_INVALID_SESSION) 
       
  1164                 {
       
  1165                 iTrace->Trace(_L("Handling Invalid Session..."), KTraceFileName, __LINE__); 
       
  1166                 // ::POS::
       
  1167                 delete iEncodedBuffer;
       
  1168                 iEncodedBuffer = NULL;
       
  1169                 iSuplSessionState = ESUPL_ENCODE;
       
  1170                 iEncodedBuffer = iSuplState->EncodeMessageL(iSuplVersion, iSuplSessionId, err);
       
  1171                 if(KErrNone == err)
       
  1172                     {
       
  1173                     iConnRequestor->SendPacket(*iEncodedBuffer);
       
  1174                     iSuplSessionState = ESUPL_SEND;
       
  1175                     }
       
  1176                 }
       
  1177             else
       
  1178                 {
       
  1179                 delete iEncodedBuffer;
       
  1180                 iEncodedBuffer = NULL;
       
  1181                 if(ConnectionRequired())				
       
  1182                     {
       
  1183                     iTrace->Trace(_L("ConnectionRequired returned TRUE"), KTraceFileName, __LINE__);
       
  1184                     err = SetApproriateSETSessionId();
       
  1185                     iSuplSessionState = ESUPL_ENCODE;
       
  1186                     CopySETCapabilities();//Copy this before and then & with Allowed Capabilities
       
  1187                     iEncodedBuffer = iSuplState->EncodeMessageL(iSuplVersion, iSuplSessionId, err);
       
  1188                     iConnRequestor->SendPacket(*iEncodedBuffer);
       
  1189                     iSuplSessionState = ESUPL_SEND;
       
  1190                     iConnRequestor->ListenToMessages();
       
  1191                     }
       
  1192                 else
       
  1193                     {
       
  1194                     iTrace->Trace(_L("ConnectionRequired returned False"), KTraceFileName, __LINE__);
       
  1195                     GenerateSuplMessageL();
       
  1196                     iSuplSessionState = ESUPL_ENCODE;
       
  1197                     }
       
  1198                 }
       
  1199 
       
  1200             if(KErrNone != err )
       
  1201                 {
       
  1202                 HandleSuplErrorL(err);
       
  1203                 }
       
  1204             break;
       
  1205             }
       
  1206 
       
  1207         case ESUPL_ENCODE:
       
  1208             {
       
  1209             // Clean up Encoding buffer before filling it up
       
  1210             delete iEncodedBuffer;
       
  1211             iEncodedBuffer = NULL;
       
  1212 
       
  1213             iEncodedBuffer = iSuplState->EncodeMessageL(iSuplVersion, iSuplSessionId, err);
       
  1214             if(KErrNone == err)
       
  1215                 {
       
  1216                 iConnRequestor->SendPacket(*iEncodedBuffer);
       
  1217                 iSuplSessionState = ESUPL_SEND;
       
  1218                 }
       
  1219             else
       
  1220                 {
       
  1221                 HandleSuplErrorL(err);
       
  1222                 }
       
  1223             break;
       
  1224             }
       
  1225 
       
  1226         case ESUPL_RECEIVED: break;
       
  1227 
       
  1228         default:
       
  1229             {                             
       
  1230             HandleSuplErrorL(KErrOMAUnknownState);
       
  1231             break;
       
  1232             }
       
  1233         }
       
  1234     }
       
  1235 // -----------------------------------------------------------------------------
       
  1236 // COMASuplSession::ConnectionRequired
       
  1237 // Determines of connection should be created
       
  1238 // (other items were commented in a header).
       
  1239 // -----------------------------------------------------------------------------
       
  1240 //
       
  1241 TBool COMASuplSession::ConnectionRequired()
       
  1242     {
       
  1243     iTrace->Trace(_L("COMASuplSession::ConnectionRequired"), KTraceFileName, __LINE__);
       
  1244     TBuf<128> logBuf;
       
  1245     logBuf.Copy(_L("Trigger session "));
       
  1246     if (iTriggerSession)
       
  1247         logBuf.Append(_L("True"));
       
  1248     else
       
  1249         logBuf.Append(_L("False"));
       
  1250     logBuf.Append(_L("Request type "));
       
  1251     logBuf.AppendNum(iRequestType);
       
  1252     logBuf.Append(_L("Message type "));
       
  1253     logBuf.AppendNum(iSuplMsgType);
       
  1254     iTrace->Trace(logBuf, KTraceFileName, __LINE__);
       
  1255 
       
  1256         {                
       
  1257         if (iTriggerSession && iRequestType == ESUPL_TERMINAL && iSuplMsgType == ESUPL_POSINIT)
       
  1258             return ETrue;
       
  1259         }
       
  1260 
       
  1261     if(iRequestType == ESUPL_INVALID_SESSION )
       
  1262         {
       
  1263         return ETrue;
       
  1264         }
       
  1265     if(iRequestType == ESUPL_TERMINAL && (iSuplMsgType == ESUPL_START || iSuplMsgType == ESUPL_TRIG_START))
       
  1266         {
       
  1267         return ETrue;
       
  1268         }
       
  1269     else
       
  1270         {
       
  1271         if(iRequestType == ESUPL_NETWORK)
       
  1272             {
       
  1273             if(iSuplMsgType == ESUPL_POSINIT || iSuplMsgType == ESUPL_END || iSuplMsgType == ESUPL_TRIG_START)
       
  1274                 {
       
  1275                 return ETrue;
       
  1276                 }
       
  1277             }
       
  1278         }
       
  1279     return EFalse;
       
  1280     }
       
  1281 
       
  1282 // -----------------------------------------------------------------------------
       
  1283 // COMASuplSession::ValidatePosition
       
  1284 // Validates position estimate 
       
  1285 // (other items were commented in a header).
       
  1286 // -----------------------------------------------------------------------------
       
  1287 //
       
  1288 TInt COMASuplSession::ValidatePosition(COMASuplPosition *aPosition)
       
  1289     {
       
  1290     TOMASuplUtcTime utcTime;
       
  1291     TOMASuplPositionEstimate pos;
       
  1292 
       
  1293     aPosition->GetPosition(utcTime, pos);        
       
  1294 
       
  1295     TOMASuplPositionEstimate::TOMASuplLatitudeSign  latSign;
       
  1296     TInt               latitude;
       
  1297     TInt               longitude;
       
  1298     pos.GetPositionEstimate(latSign,latitude,longitude);	
       
  1299 
       
  1300     // Set Position Estimate
       
  1301     if(latitude < KLatitudeMin || latitude > KLatitudeMax)
       
  1302         {
       
  1303         return KErrArgument;
       
  1304         }
       
  1305     if(longitude < KLongitudeMin || longitude > KLongitudeMax)
       
  1306         {
       
  1307         return KErrArgument;
       
  1308         }
       
  1309 
       
  1310     // Retrieve optional parametrs of Position Estimate
       
  1311     // Retrieve Uncertainity
       
  1312     TOMASuplUncertainty uncertainty;
       
  1313     TInt error = pos.GetUncertainty(uncertainty);
       
  1314     if(!error)
       
  1315         {
       
  1316         TInt uncertSemiMajor;
       
  1317         TInt uncertSemiMinor;
       
  1318         TInt orientMajorAxis;
       
  1319         uncertainty.GetUncertainty(uncertSemiMajor,uncertSemiMinor,orientMajorAxis);
       
  1320         if(uncertSemiMajor < KUncertSemiMajorMin || uncertSemiMajor > KUncertSemiMajorMax)
       
  1321             {
       
  1322             return KErrArgument;
       
  1323             }
       
  1324         if (uncertSemiMinor < KUncertSemiMinorMin || uncertSemiMinor > KUncertSemiMinorMax)
       
  1325             {
       
  1326             return KErrArgument;
       
  1327             }
       
  1328         if (orientMajorAxis < KOrientMajorAxisMin  || orientMajorAxis > KOrientMajorAxisMax)
       
  1329             {
       
  1330             return KErrArgument;
       
  1331             }
       
  1332         }
       
  1333 
       
  1334     TInt confidence;
       
  1335     error = pos.GetConfidence(confidence);
       
  1336     if(!error)
       
  1337         {
       
  1338         if(confidence < KConfidenceMin || confidence > KConfidenceMax)
       
  1339             {
       
  1340             return KErrArgument;
       
  1341             }
       
  1342         }
       
  1343     // Retrieve AltitudeInfo
       
  1344     TOMASuplAltitudeInfo altitudeInfo;
       
  1345     error = pos.GetAltitudeInfo(altitudeInfo);
       
  1346     if(!error)
       
  1347         {
       
  1348         TOMASuplAltitudeInfo::TOMASuplAltitudeDirection altDirection;
       
  1349         TInt altitude;
       
  1350         TInt altUncert;
       
  1351         altitudeInfo.GetAltitudeInfo(altDirection,altitude,altUncert);
       
  1352         if (altitude < KAltitudeMin  || altitude > KAltitudeMax)
       
  1353             {
       
  1354             return KErrArgument;
       
  1355             }
       
  1356         if (altUncert < KAltitudeUncertMin || altUncert > KAltitudeUncertMax)
       
  1357             {
       
  1358             return KErrArgument;
       
  1359             }
       
  1360         }
       
  1361 
       
  1362     return KErrNone;
       
  1363     }        
       
  1364 
       
  1365 // -----------------------------------------------------------------------------
       
  1366 // COMASuplSession::GetPositionComplete
       
  1367 // Handles any errors that may occur during protocol processing
       
  1368 // (other items were commented in a header).
       
  1369 // -----------------------------------------------------------------------------
       
  1370 //
       
  1371 void COMASuplSession::GetPositionCompleteL(TInt aError)
       
  1372     {
       
  1373     if (!iTriggerSession)
       
  1374         iConnRequestor->CloseConnection();
       
  1375 		
       
  1376 		iPortNum = 0;
       
  1377 
       
  1378     if (iTriggerSession)
       
  1379         {    
       
  1380         TPositionInfo position;        
       
  1381         GetPosition(position);
       
  1382         if( iTrgFireInfo )
       
  1383 	        {
       
  1384 	        iTrgFireInfo->Set(position);
       
  1385 	        }
       
  1386         if (iNumFixes == 0)
       
  1387             {                    
       
  1388             iTrace->Trace(_L("GetPositionComplete, last fix generation SUPL END"), KTraceFileName, __LINE__);
       
  1389             iSuplSessionState = ESUPL_GENERATE;
       
  1390             iSuplMsgType = ESUPL_END;
       
  1391             GenerateSuplMessageL();
       
  1392             }
       
  1393         else
       
  1394             {                    
       
  1395             iTrace->Trace(_L("GetPositionComplete, Completing session"), KTraceFileName, __LINE__);
       
  1396             CompleteSession(KErrNone);
       
  1397             }                    
       
  1398         }                
       
  1399     else
       
  1400         {                
       
  1401 
       
  1402         if(aError || iPosition->Status())
       
  1403             {
       
  1404             delete iPosition;
       
  1405             iPosition = NULL;
       
  1406             // Invoke SessionTerminate
       
  1407             iTrace->Trace(_L("Could not get position from POS Msg Plugin..."), KTraceFileName, __LINE__);
       
  1408             iSessionObserver.TerminateSession(this, KErrNone);
       
  1409             }
       
  1410         else
       
  1411             {
       
  1412             TInt err;
       
  1413             err = ValidatePosition(iPosition);                
       
  1414             if (err != KErrNone)
       
  1415                 {
       
  1416                 delete iPosition;
       
  1417                 iPosition = NULL;
       
  1418                 iSessionObserver.TerminateSession(this, KErrCompletion);	
       
  1419                 }
       
  1420             else                
       
  1421                 iSessionObserver.TerminateSession(this, KErrNone);	
       
  1422             }	
       
  1423         }	
       
  1424     }
       
  1425 
       
  1426 
       
  1427 
       
  1428 // -----------------------------------------------------------------------------
       
  1429 // COMASuplSession::HandleSuplErrorL
       
  1430 // Handles any errors that may occur during protocol processing
       
  1431 // (other items were commented in a header).
       
  1432 // -----------------------------------------------------------------------------
       
  1433 //
       
  1434 void COMASuplSession::HandleSuplErrorL(TInt aErr)	
       
  1435     {
       
  1436     // All Possible errors -
       
  1437     // 1. Packet generation failure
       
  1438     //    SUPL START - Complete the session with aErr
       
  1439     //    SUPL POS INIT - Send SUPL END with appropriate Error code
       
  1440     //    SUPL END - Complete Session with aErr and terminate the session
       
  1441     //    SUPL POS - Will be handled later
       
  1442     // 2. Secure Socket Connection failure
       
  1443     //    Complete the Session with aErr. Terminate the supl session
       
  1444     // 3. Local IP Address retrieval failure
       
  1445     //    Complete the session with aErr. Terminate the supl session
       
  1446     // 4. Packet Encoding error
       
  1447     //    SUPL START - Complete Session with aErr
       
  1448     //    SUPL POS INIT - Generate SUPL END and send to SLP
       
  1449     //    SUPL POS - Will be handled later
       
  1450     //    SUPL END - Complete session with aErr and terminate the session
       
  1451     // 5. Packet Send Error
       
  1452     //    Complete the session with aErr and terminate the session
       
  1453     // 6. Unknown State Error
       
  1454     //    SUPL START - Complete Session with invalid state
       
  1455     //    SUPL RESPONSE - Send SUPL END with appropriate error
       
  1456     //    SUPL POS INIT - Send SUPL END with appropriate error
       
  1457     //    SUPL POS - Will be handled later
       
  1458     //    SUPL END - Complete session with invalid state and terminate the session
       
  1459     //    SUPL INTI - Will be handled later
       
  1460     // 7. Message Processing error
       
  1461     //    SUPL RESPONSE - Send SUPL END with appropriate error code
       
  1462     //    SUPL POS - Will be handled later
       
  1463     //    SUPL END - Complete session with aErr and terminate the session
       
  1464     // 8. Time out Handling
       
  1465     //    SUPL START - Send SUPL END with appropriate error code
       
  1466     //    SUPL POS INIT - Send SUPL END with appropriate error code
       
  1467     //    SUPL END - There should be no timer started in the first place
       
  1468 
       
  1469     SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplError);	
       
  1470     iNumFixes = 0; //Making 0 will stop all further request done by client after errors
       
  1471 	RemoveActiveSession();//Remove session as there is error in session...
       
  1472     switch(iSuplSessionState) 
       
  1473         {
       
  1474 
       
  1475         //***************************************************************************************				 		
       
  1476 
       
  1477         case ESUPL_INITIALIZED: //Initilization error
       
  1478             {
       
  1479             aErr = KErrNotReady;
       
  1480             iTrace->Trace(_L("HandleInitilizationError..."), KTraceFileName, __LINE__); 
       
  1481             HandleInitilizationErrorL(aErr);
       
  1482             break;	
       
  1483             }
       
  1484 
       
  1485             //***************************************************************************************				 
       
  1486 
       
  1487         case ESUPL_CONNECTING:  //Error while retriving Local IP address
       
  1488             {
       
  1489             aErr = KErrGeneral;
       
  1490             iTrace->Trace(_L("HandleConnectionError..."), KTraceFileName, __LINE__); 
       
  1491             HandleConnectionErrorL(aErr);
       
  1492             break;					
       
  1493             }
       
  1494 
       
  1495             //***************************************************************************************				 
       
  1496 
       
  1497         case ESUPL_ENCODE:   //Encoding failure error
       
  1498             {
       
  1499 
       
  1500             iTrace->Trace(_L("HandleEncodingError..."), KTraceFileName, __LINE__); 
       
  1501             HandleEncodingErrorL(aErr);
       
  1502             break;
       
  1503             }
       
  1504 
       
  1505             //***************************************************************************************				 				
       
  1506 
       
  1507         case ESUPL_GENERATE : //Generation error
       
  1508             {
       
  1509             aErr = KErrGeneral;
       
  1510             iTrace->Trace(_L("HandleGenerationError..."), KTraceFileName, __LINE__); 
       
  1511             HandleGenerationErrorL(aErr);
       
  1512             break;
       
  1513             }						
       
  1514 
       
  1515             //***************************************************************************************				 				
       
  1516 
       
  1517         case ESUPL_SEND:	//Timeout & packet send error
       
  1518             {
       
  1519             iTrace->Trace(_L("HandleSendError..."), KTraceFileName, __LINE__); 
       
  1520             HandleSendErrorL(aErr);
       
  1521             break;
       
  1522             }
       
  1523 
       
  1524             //***************************************************************************************				 								 
       
  1525 
       
  1526 			case ESUPL_RECEIVED:	//Error while getting wrong message from SLP
       
  1527 				{
       
  1528 					iTrace->Trace(_L("HandlePacketsError..."), KTraceFileName, __LINE__); 					
       
  1529                     if (iSuplMsgType == ESUPL_REPORT)
       
  1530                         HandleSendErrorL(aErr);
       
  1531                     else                            
       
  1532 					    HandlePacketsErrorL(aErr);	
       
  1533 					break;		
       
  1534 				}
       
  1535 				
       
  1536 //***************************************************************************************				 								 				
       
  1537 
       
  1538         default:
       
  1539             {
       
  1540             TBuf<64> msg(_L("Unknown ERROR occured..."));
       
  1541             msg.AppendNum(aErr);
       
  1542             iTrace->Trace(msg, KTraceFileName, __LINE__); 					
       
  1543             break;	
       
  1544             } 
       
  1545 
       
  1546             //***************************************************************************************				 								 				
       
  1547         }
       
  1548 
       
  1549     }
       
  1550 	
       
  1551 // -----------------------------------------------------------------------------
       
  1552 // ReverseString
       
  1553 // Reverse the string
       
  1554 // -----------------------------------------------------------------------------
       
  1555 //
       
  1556 void ReverseString(TDes8& aLocalIPAddress,TInt aLength)
       
  1557     {
       
  1558     TBuf8<1> temp1;
       
  1559     TBuf8<1> temp2;
       
  1560     for(TInt i =0 ;i < aLength / 2; ++i)
       
  1561         {
       
  1562         temp1.Zero();
       
  1563         temp2.Zero();
       
  1564         temp1.Append(aLocalIPAddress[i]); 
       
  1565         temp2.Append(aLocalIPAddress[aLength - 1 - i]); 
       
  1566         aLocalIPAddress.Replace(i,1,temp2);
       
  1567         aLocalIPAddress.Replace(aLength - 1 - i,1,temp1);
       
  1568         }
       
  1569     }
       
  1570 	
       
  1571 // -----------------------------------------------------------------------------
       
  1572 // COMASuplSession::GetLocalIPAddress
       
  1573 // Gets Local IP address of SET
       
  1574 // (other items were commented in a header).
       
  1575 // -----------------------------------------------------------------------------
       
  1576 //
       
  1577 TInt COMASuplSession::GetLocalIPAddress()	
       
  1578     {
       
  1579     iTrace->Trace(_L("COMASuplSession::GetLocalIPAddress"), KTraceFileName, __LINE__); 
       
  1580 
       
  1581     if (iSessionIDFlag)
       
  1582         {
       
  1583         return KErrNone;
       
  1584         }                
       
  1585 
       
  1586     TInetAddr address;
       
  1587     TInt err = iConnRequestor->GetLocalIPAddress(address);  
       
  1588     if (err != KErrNone) 
       
  1589         {
       
  1590         return err;	
       
  1591         }
       
  1592 
       
  1593     if ( address.Family() == KAfInet) //This routine will convert IPV4 address in TBuf8<4>
       
  1594         {
       
  1595         TUint32 ipAddress = address.Address();
       
  1596         TPtr8 ptrIPAddress(reinterpret_cast<TUint8*>(&ipAddress), 
       
  1597                 sizeof(ipAddress), sizeof(ipAddress));
       
  1598         TBuf8<KIP4AddressLength> localIPAddress; 
       
  1599         localIPAddress.Append(ptrIPAddress);
       
  1600         COMASuplSETSessionID* suplSETSessionId = NULL;
       
  1601         iSuplSessionId->SETSessionID(suplSETSessionId);
       
  1602         ReverseString(localIPAddress,KIP4AddressLength);
       
  1603         suplSETSessionId->SetSuplSETSessionIDIPv4(iSETSessionUniqueId,
       
  1604                 localIPAddress);
       
  1605         //#if _DEBUG													  
       
  1606         TBuf<64> msg;
       
  1607         TBuf<16> ipaddress;
       
  1608         address.Output(ipaddress);
       
  1609         msg.Copy(_L("Its IP4 Address. Local IP Address is "));
       
  1610         msg.Append(ipaddress);
       
  1611         iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1612         //#endif	        
       
  1613         }
       
  1614 
       
  1615     if ( address.Family() == KAfInet6 )  // This routine will convert IPV6 address in TBuf8<16>
       
  1616         {
       
  1617         TBuf8<KIP6AddressLength> localIP6Address;
       
  1618         const TIp6Addr &ip6Addr = address.Ip6Address();
       
  1619         for(TInt i = 0;i < 4; ++i )
       
  1620             {
       
  1621             TUint32 ipAddress = ip6Addr.u.iAddr32[i]; 
       
  1622             TPtr8 ptrIPAddress(reinterpret_cast<TUint8*>(&ipAddress), 
       
  1623                     sizeof(ipAddress), sizeof(ipAddress));
       
  1624             TBuf8<KIP4AddressLength> localIPAddress;
       
  1625             localIPAddress.Append(ptrIPAddress);
       
  1626             localIP6Address.Append(localIPAddress);
       
  1627             }
       
  1628 
       
  1629         COMASuplSETSessionID* suplSETSessionId = NULL;
       
  1630         iSuplSessionId->SETSessionID(suplSETSessionId);
       
  1631         ReverseString(localIP6Address,KIP6AddressLength);
       
  1632         suplSETSessionId->SetSuplSETSessionIDIPv6(iSETSessionUniqueId,
       
  1633                 localIP6Address);
       
  1634         //#if _DEBUG													  
       
  1635         TBuf<64> msg;
       
  1636         TBuf<16> ipaddress;
       
  1637         address.Output(ipaddress);
       
  1638         msg.Copy(_L("Its IP6 Address. Local IP Address is "));
       
  1639         msg.Append(ipaddress);
       
  1640         iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1641         //#endif	        	    																	
       
  1642         }
       
  1643 
       
  1644     return KErrNone;
       
  1645     }
       
  1646 
       
  1647 
       
  1648 // -----------------------------------------------------------------------------
       
  1649 // COMASuplSession::SetEncodedSuplInitL
       
  1650 // Sets the Encoded SUPL INIT. This is required
       
  1651 // to compute the VER in SUPL POS INIT
       
  1652 // (other items were commented in a header).
       
  1653 // -----------------------------------------------------------------------------
       
  1654 //
       
  1655 void COMASuplSession::SetEncodedSuplInitL(HBufC8 *aEncodedSuplInit)	 
       
  1656     {
       
  1657     TInt len = aEncodedSuplInit->Length();
       
  1658     if(iEncodedSuplInit)
       
  1659         {
       
  1660         delete iEncodedSuplInit;
       
  1661         iEncodedSuplInit = NULL;
       
  1662         }
       
  1663 
       
  1664     iEncodedSuplInit = HBufC8::NewL(len);
       
  1665     *iEncodedSuplInit = *aEncodedSuplInit;
       
  1666     }
       
  1667 
       
  1668 // -----------------------------------------------------------------------------
       
  1669 // COMASuplSession::SuplSessionID
       
  1670 // Returns SessionID of Session
       
  1671 // (other items were commented in a header).
       
  1672 // -----------------------------------------------------------------------------
       
  1673 //
       
  1674 COMASuplSessionID* COMASuplSession::SuplSessionID() const	 
       
  1675     {
       
  1676     return iSuplSessionId;
       
  1677     }
       
  1678 	
       
  1679 // -----------------------------------------------------------------------------
       
  1680 // COMASuplSession::GetServerAddressL
       
  1681 // Gets the Server Name and returns it back to the client
       
  1682 // (other items were commented in a header).
       
  1683 // -----------------------------------------------------------------------------
       
  1684 //	
       
  1685 EXPORT_C TInt COMASuplSession::GetServerAddressL(TDes& ahslpAddress)
       
  1686     {
       
  1687     if(iSessionCompletionCode == KErrNone)
       
  1688         {
       
  1689         iConnRequestor->GetUsedServerAddress(ahslpAddress);
       
  1690         iTrace->Trace(_L("Session has suceeded...returning address"), KTraceFileName, __LINE__); 
       
  1691         iTrace->Trace(ahslpAddress, KTraceFileName, __LINE__); 
       
  1692         return KErrNone;
       
  1693         }
       
  1694     else
       
  1695         {
       
  1696         iTrace->Trace(_L("Session has failed...returning Error"), KTraceFileName, __LINE__); 
       
  1697         return KErrNotFound;
       
  1698         }
       
  1699     }
       
  1700     
       
  1701 // -----------------------------------------------------------------------------
       
  1702 // COMASuplSession::GetPosition
       
  1703 // Gets the Position from the SUPL framework and returns it back to the client
       
  1704 // (other items were commented in a header).
       
  1705 // -----------------------------------------------------------------------------
       
  1706 //	
       
  1707 EXPORT_C TInt COMASuplSession::GetPosition(TPositionInfo& aSuplPosInfo)	
       
  1708     {
       
  1709     TBool aPositionQualityError=TRUE;
       
  1710     iTrace->Trace(_L("COMASuplSession::GetPosition(TPositionInfo)"), KTraceFileName, __LINE__); 
       
  1711     if(!iPosition)	
       
  1712         {
       
  1713         iTrace->Trace(_L("COMASuplSession::GetPosition ... Position is Empty"), KTraceFileName, __LINE__); 
       
  1714         return KErrNotFound;	
       
  1715         }
       
  1716 
       
  1717     TPosition posInfo;
       
  1718     TOMASuplUtcTime UtcTime;
       
  1719     TOMASuplPositionEstimate PosEstimate;
       
  1720     TDateTime TimeStamp;
       
  1721     TInt ZoneCode,Zone,altitude,AltitudeUncertainty, HorizontalAccuracy;
       
  1722     TOMASuplAltitudeInfo AltitudeInfo;
       
  1723     TInt latitude,longitude;
       
  1724     TOMASuplPositionEstimate::TOMASuplLatitudeSign LatSign;
       
  1725     TOMASuplAltitudeInfo::TOMASuplAltitudeDirection altitudeDirection;
       
  1726     TOMASuplUncertainty Uncertainty;
       
  1727     TInt UncertaintySemiMajor, UncertaintySemiMinor, OrientationMajorAxis;
       
  1728     TReal UncertaintySemiMajorReal, UncertaintySemiMinorReal, AltitudeUncertaintyReal;
       
  1729     TInt confidence;
       
  1730 
       
  1731     iPosition->GetPosition(UtcTime,PosEstimate);
       
  1732     UtcTime.GetUtcTime(TimeStamp,ZoneCode,Zone);
       
  1733     TInt altErr = PosEstimate.GetAltitudeInfo(AltitudeInfo);
       
  1734     PosEstimate.GetPositionEstimate(LatSign,latitude,longitude);
       
  1735     TInt err = PosEstimate.GetConfidence(confidence);
       
  1736     altitude = 0;
       
  1737     if (altErr == KErrNone)
       
  1738         AltitudeInfo.GetAltitudeInfo(altitudeDirection,altitude,AltitudeUncertainty);
       
  1739 
       
  1740     TTime time(TimeStamp);
       
  1741     posInfo.SetTime(time);
       
  1742 
       
  1743     if(LatSign == TOMASuplPositionEstimate::ESouth )
       
  1744         {
       
  1745         latitude = latitude * -1;
       
  1746         }
       
  1747 
       
  1748     // Conversion of latitude and longitude
       
  1749     TReal64 newLat, newLong;
       
  1750     newLat = latitude;
       
  1751     newLong = longitude;
       
  1752             //Conversion as per GAD and OMA Spec
       
  1753     newLat = (newLat/8388608)*90;
       
  1754     newLong = (newLong/16777216)*360;
       
  1755 
       
  1756     if (altErr == KErrOMASuplParamNotSet)
       
  1757         posInfo.SetCoordinate((TReal64)newLat,(TReal64)newLong);
       
  1758     else                    
       
  1759         posInfo.SetCoordinate((TReal64)newLat,(TReal64)newLong,(float)altitude);
       
  1760     PosEstimate.GetUncertainty(Uncertainty);
       
  1761     Uncertainty.GetUncertainty(UncertaintySemiMajor,UncertaintySemiMinor,
       
  1762             OrientationMajorAxis);
       
  1763     TBuf<64> msg;
       
  1764     msg.Copy(_L("Uncertainty Semi major"));
       
  1765     msg.AppendNum(UncertaintySemiMajor);
       
  1766     iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1767     msg.Copy(_L("Uncertainty Semi Minor"));
       
  1768     msg.AppendNum(UncertaintySemiMinor);
       
  1769     iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1770     msg.Copy(_L("Orientation to Major axis "));
       
  1771     msg.AppendNum(OrientationMajorAxis);
       
  1772     iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1773     msg.Copy(_L("Altitude "));
       
  1774     msg.AppendNum(altitude);
       
  1775     iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1776     msg.Copy(_L("Altitude uncertainty "));
       
  1777     msg.AppendNum(AltitudeUncertainty);
       
  1778     iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1779 
       
  1780     // Convert uncertainty to meters
       
  1781     TReal pwrMjr, pwrMnr, pwrAlt;
       
  1782             Math::Pow(pwrMjr, 1.1, UncertaintySemiMajor);
       
  1783             Math::Pow(pwrMnr, 1.1, UncertaintySemiMinor);
       
  1784     Math::Pow(pwrAlt, 1.070000, AltitudeUncertainty); 
       
  1785     UncertaintySemiMajorReal = 10 * (pwrMjr -1);
       
  1786     UncertaintySemiMinorReal = 10 * (pwrMnr -1);
       
  1787     AltitudeUncertaintyReal = 10 * (pwrAlt -1);
       
  1788 
       
  1789     TReal MultiplyFactor;
       
  1790 
       
  1791     // Default set accuracy values to NaN
       
  1792     TRealX nan;
       
  1793     nan.SetNaN();
       
  1794 
       
  1795     posInfo.SetHorizontalAccuracy(nan);
       
  1796     posInfo.SetVerticalAccuracy(nan);
       
  1797     if (err == KErrOMASuplParamNotSet||confidence<=0 || confidence>=100)
       
  1798         {
       
  1799 
       
  1800 TReal32 horizAccr;
       
  1801 horizAccr = KUncertaintyConversionFactor * ( KCEP68ConversionFactor * (UncertaintySemiMajorReal + UncertaintySemiMinorReal ) );
       
  1802 posInfo.SetHorizontalAccuracy(horizAccr);
       
  1803 if (AltitudeUncertaintyReal > 0)
       
  1804     posInfo.SetVerticalAccuracy(AltitudeUncertaintyReal);
       
  1805 
       
  1806         }
       
  1807     else
       
  1808         {                    
       
  1809 
       
  1810         TReal lnResult,a_Sigma,b_Sigma;
       
  1811         Math::Ln(lnResult,(1-confidence/100.0));
       
  1812         Math::Sqrt(MultiplyFactor,(-2*lnResult));	
       
  1813 
       
  1814         	        a_Sigma=UncertaintySemiMajorReal/MultiplyFactor;
       
  1815         	
       
  1816         	        b_Sigma=UncertaintySemiMinorReal/MultiplyFactor;
       
  1817         	
       
  1818         	        HorizontalAccuracy=0.7542*(a_Sigma+b_Sigma);
       
  1819 
       
  1820         posInfo.SetHorizontalAccuracy(HorizontalAccuracy);
       
  1821         TReal32 clientHorAcc;
       
  1822         if(iClientQop.GetHorizontalAccuracy(clientHorAcc)!=KErrNotFound)
       
  1823             {
       
  1824             if(HorizontalAccuracy<clientHorAcc)
       
  1825                 {
       
  1826                 aPositionQualityError=FALSE;	
       
  1827                 }
       
  1828         }
       
  1829 
       
  1830         /* Calculation for vertical accuracy */
       
  1831         /* If confidence is 68, then vertical accuracy = altitude uncertainty */
       
  1832         if (altitude > 0 && altErr == KErrNone)
       
  1833             {                    
       
  1834             if (confidence == 68 && AltitudeUncertaintyReal > 0)
       
  1835                 posInfo.SetVerticalAccuracy(AltitudeUncertaintyReal);
       
  1836             else
       
  1837                 {
       
  1838                 TReal32 chiValue=0, verticalAccuracy=0;                        
       
  1839                 if (confidence < 6)
       
  1840                     {
       
  1841                     chiValue = chisquare[1];
       
  1842                     }
       
  1843                 else
       
  1844                     {
       
  1845                     chiValue = chisquare[confidence/5];
       
  1846                     }                
       
  1847                 verticalAccuracy = AltitudeUncertaintyReal/chiValue;
       
  1848                 if (verticalAccuracy > 0)
       
  1849                     {                                
       
  1850                     posInfo.SetVerticalAccuracy(verticalAccuracy);
       
  1851                     TReal32 clientVerAcc;
       
  1852                     if(iClientQop.GetVerticalAccuracy(clientVerAcc)!=KErrNotFound)
       
  1853                         {
       
  1854                         if(verticalAccuracy<clientVerAcc)
       
  1855                             {
       
  1856                             aPositionQualityError=FALSE;	
       
  1857                             }
       
  1858                         }
       
  1859                     }
       
  1860                 }
       
  1861             }                    
       
  1862         }                    
       
  1863 
       
  1864     TInt aClientTime;  
       
  1865     if(iClientQop.GetDelay(aClientTime)!=KErrNotFound)
       
  1866         {
       
  1867         TTimeIntervalSeconds aDelay;
       
  1868 
       
  1869         iSessionEndTime.SecondsFrom(iSessionStartTime,aDelay);
       
  1870 
       
  1871         if(aClientTime< aDelay.Int())
       
  1872             aPositionQualityError=FALSE;	
       
  1873         }
       
  1874 
       
  1875     /*Set the position to TPositionInfo*/
       
  1876     aSuplPosInfo.SetPosition(posInfo);			
       
  1877 
       
  1878     if(aPositionQualityError!=TRUE)
       
  1879         return KSuplPositionQualityLoss;
       
  1880     return KErrNone;
       
  1881     }
       
  1882 
       
  1883 // -----------------------------------------------------------------------------
       
  1884 // COMASuplSession::GetPosition
       
  1885 // Gets the Position from the SUPL framework and returns it back to the client
       
  1886 // (other items were commented in a header).
       
  1887 // -----------------------------------------------------------------------------
       
  1888 //	
       
  1889 EXPORT_C TInt COMASuplSession::GetPosition(HPositionGenericInfo& aSuplPosInfo )
       
  1890     {
       
  1891     TBool aPositionQualityError=TRUE;
       
  1892     iTrace->Trace(_L("COMASuplSession::GetPosition(HPositionGenericInfo)"), KTraceFileName, __LINE__); 
       
  1893     if(!iPosition)	
       
  1894         {
       
  1895         iTrace->Trace(_L("COMASuplSession::GetPosition ... Position is Empty"), KTraceFileName, __LINE__); 
       
  1896         return KErrNotFound;	
       
  1897         }
       
  1898 
       
  1899     TRAP_IGNORE(StoreCurrentCellIDL(aSuplPosInfo));
       
  1900 
       
  1901     TPosition posInfo;
       
  1902     TOMASuplUtcTime UtcTime;
       
  1903     TOMASuplPositionEstimate PosEstimate;
       
  1904     TDateTime TimeStamp;
       
  1905     TInt ZoneCode,Zone,altitude,AltitudeUncertainty, HorizontalAccuracy;
       
  1906     TOMASuplAltitudeInfo AltitudeInfo;
       
  1907     TInt latitude,longitude;
       
  1908     TOMASuplPositionEstimate::TOMASuplLatitudeSign LatSign;
       
  1909     TOMASuplAltitudeInfo::TOMASuplAltitudeDirection AltitudeDirection;
       
  1910     TOMASuplUncertainty Uncertainty;
       
  1911     TInt UncertaintySemiMajor, UncertaintySemiMinor, OrientationMajorAxis;
       
  1912     TReal UncertaintySemiMajorReal, UncertaintySemiMinorReal, AltitudeUncertaintyReal;
       
  1913     TInt confidence;
       
  1914 
       
  1915     iPosition->GetPosition(UtcTime,PosEstimate);
       
  1916     UtcTime.GetUtcTime(TimeStamp,ZoneCode,Zone);
       
  1917     TInt altErr = PosEstimate.GetAltitudeInfo(AltitudeInfo);
       
  1918     PosEstimate.GetPositionEstimate(LatSign,latitude,longitude);
       
  1919     TInt err = PosEstimate.GetConfidence(confidence);
       
  1920     altitude = 0;
       
  1921     if (altErr == KErrNone)
       
  1922         AltitudeInfo.GetAltitudeInfo(AltitudeDirection,altitude,AltitudeUncertainty);
       
  1923     PosEstimate.GetUncertainty(Uncertainty);
       
  1924     Uncertainty.GetUncertainty(UncertaintySemiMajor,UncertaintySemiMinor,
       
  1925             OrientationMajorAxis);
       
  1926     // Convert uncertainty to meters
       
  1927     TReal pwrMjr, pwrMnr, pwrAlt;
       
  1928             Math::Pow(pwrMjr, 1.1, UncertaintySemiMajor);
       
  1929             Math::Pow(pwrMnr, 1.1, UncertaintySemiMinor);
       
  1930     Math::Pow(pwrAlt, 1.070000, AltitudeUncertainty); 
       
  1931     UncertaintySemiMajorReal = 10 * (pwrMjr -1);
       
  1932     UncertaintySemiMinorReal = 10 * (pwrMnr -1);
       
  1933     AltitudeUncertaintyReal = 10 * (pwrAlt -1);
       
  1934 
       
  1935     TReal MultiplyFactor;
       
  1936 
       
  1937     TBuf<64> msg;
       
  1938     msg.Copy(_L("Uncertainty Semi major"));
       
  1939     msg.AppendNum(UncertaintySemiMajor);
       
  1940     iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1941     msg.Copy(_L("Uncertainty Semi Minor"));
       
  1942     msg.AppendNum(UncertaintySemiMinor);
       
  1943     iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1944     msg.Copy(_L("Orientation to Major axis "));
       
  1945     msg.AppendNum(OrientationMajorAxis);
       
  1946     iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1947     msg.Copy(_L("Altitude "));
       
  1948     msg.AppendNum(altitude);
       
  1949     iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1950     msg.Copy(_L("Altitude uncertainty "));
       
  1951     msg.AppendNum(AltitudeUncertainty);
       
  1952     iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  1953 
       
  1954     // Default set accuracy values to NaN
       
  1955     TRealX nan;
       
  1956     nan.SetNaN();
       
  1957 
       
  1958     posInfo.SetHorizontalAccuracy(nan);
       
  1959     posInfo.SetVerticalAccuracy(nan);
       
  1960 
       
  1961     if (err == KErrOMASuplParamNotSet||confidence<=0 || confidence>=100)
       
  1962         {
       
  1963         iTrace->Trace(_L("Confidance Not Set"), KTraceFileName, __LINE__); 
       
  1964 
       
  1965         TReal32 horizAccr;
       
  1966         horizAccr = KUncertaintyConversionFactor * ( KCEP68ConversionFactor * (UncertaintySemiMajorReal + UncertaintySemiMinorReal ) );
       
  1967         posInfo.SetHorizontalAccuracy(horizAccr);
       
  1968         if (AltitudeUncertaintyReal > 0)
       
  1969             posInfo.SetVerticalAccuracy(AltitudeUncertaintyReal);
       
  1970         }
       
  1971     else
       
  1972         {
       
  1973         iTrace->Trace(_L("Confidance is Set"), KTraceFileName, __LINE__); 
       
  1974 
       
  1975         TReal lnResult,a_Sigma,b_Sigma;
       
  1976         Math::Ln(lnResult,(1-confidence/100.0));
       
  1977         Math::Sqrt(MultiplyFactor,(-2*lnResult));	
       
  1978 
       
  1979 	        	    a_Sigma=UncertaintySemiMajorReal/MultiplyFactor;
       
  1980 	        	    b_Sigma=UncertaintySemiMinorReal/MultiplyFactor;
       
  1981 
       
  1982 	        	    HorizontalAccuracy=0.7542*(a_Sigma+b_Sigma);
       
  1983 
       
  1984         posInfo.SetHorizontalAccuracy(HorizontalAccuracy);
       
  1985         TReal32 clientHorAcc;
       
  1986         if(iClientQop.GetHorizontalAccuracy(clientHorAcc)!=KErrNotFound)
       
  1987             {
       
  1988             if(HorizontalAccuracy<clientHorAcc)
       
  1989                 {
       
  1990                 aPositionQualityError=FALSE;	
       
  1991                 }
       
  1992             }
       
  1993 
       
  1994 
       
  1995         /* If confidence is 68, then vertical accuracy = altitude uncertainty */
       
  1996         if (altitude > 0 && altErr == KErrNone)
       
  1997             {                    
       
  1998             if (confidence == 68 && AltitudeUncertaintyReal > 0)
       
  1999                 posInfo.SetVerticalAccuracy(AltitudeUncertaintyReal);
       
  2000             else
       
  2001                 {
       
  2002                 TReal32 chiValue=0, verticalAccuracy=0;                        
       
  2003                 if (confidence < 6)
       
  2004                     {
       
  2005                     chiValue = chisquare[1];
       
  2006                     }
       
  2007                 else
       
  2008                     {
       
  2009                     chiValue = chisquare[confidence/5];
       
  2010                     }                
       
  2011                 verticalAccuracy = AltitudeUncertaintyReal/chiValue;
       
  2012                 if (verticalAccuracy > 0)
       
  2013                     {                            
       
  2014                     posInfo.SetVerticalAccuracy(verticalAccuracy);
       
  2015                     TReal32 clientVerAcc;
       
  2016                     if(iClientQop.GetVerticalAccuracy(clientVerAcc)!=KErrNotFound)
       
  2017                         {
       
  2018                         if(verticalAccuracy<clientVerAcc)
       
  2019                             {
       
  2020                             aPositionQualityError=FALSE;	
       
  2021                             }
       
  2022                         else
       
  2023                             aPositionQualityError=FALSE;	
       
  2024                         }
       
  2025                     }
       
  2026                 }                    
       
  2027             }                    
       
  2028         }
       
  2029 
       
  2030     TTime time(TimeStamp);
       
  2031     posInfo.SetTime(time);
       
  2032 
       
  2033     if(LatSign == TOMASuplPositionEstimate::ESouth )
       
  2034         {
       
  2035         latitude = latitude * -1;
       
  2036         }
       
  2037 
       
  2038     // Conversion of latitude and longitude
       
  2039     TReal64 newLat, newLong;
       
  2040     newLat = latitude;
       
  2041     newLong = longitude;
       
  2042     newLat = (newLat/8388608)*90;
       
  2043     newLong = (newLong/16777216)*360;
       
  2044     if (altErr == KErrOMASuplParamNotSet)
       
  2045         posInfo.SetCoordinate((TReal64)newLat,(TReal64)newLong);
       
  2046     else                    
       
  2047         posInfo.SetCoordinate((TReal64)newLat,(TReal64)newLong,(float)altitude);
       
  2048 
       
  2049     /*Set the position to TPositionInfo*/
       
  2050     aSuplPosInfo.SetPosition(posInfo);			
       
  2051 
       
  2052     /* Set GenInfo related fields */
       
  2053     TOMASuplVelocityType    VelType;
       
  2054     COMASuplHorizVelocity*  HorizVel;
       
  2055     COMASuplVelocity*       SuplVel;
       
  2056     TUint16 HorSpeed;
       
  2057     TUint16 Bearing;
       
  2058     TUint8 VertDirection;
       
  2059     TUint8 VertSpeed;
       
  2060     TUint8 UncertSpeed;
       
  2061     TUint8 HorUncertSpeed,VerUncertSpeed;
       
  2062 
       
  2063     iTrace->Trace(_L("Before iPosition->GetVelocity"), KTraceFileName, __LINE__); 
       
  2064     TInt ret = iPosition->GetVelocity(SuplVel);
       
  2065     iTrace->Trace(_L("After iPosition->GetVelocity"), KTraceFileName, __LINE__); 
       
  2066     if (ret == KErrNone)
       
  2067         {
       
  2068 
       
  2069         VelType = SuplVel->VelType();
       
  2070 
       
  2071         HorizVel = SuplVel->Velocity();
       
  2072 
       
  2073         switch(VelType)
       
  2074             {
       
  2075             case EHorizVelocity:
       
  2076                 {
       
  2077                 iTrace->Trace(_L("Start of COMASuplSession::GetPosition(HPositionGenericInfo) velType = EHorizVelocity"), KTraceFileName, __LINE__); 
       
  2078                 aSuplPosInfo.SetRequestedField(EPositionFieldHorizontalSpeed);
       
  2079                 HorizVel->GetHorizVel(Bearing, HorSpeed);
       
  2080                 aSuplPosInfo.SetValue(EPositionFieldHorizontalSpeed, (TReal32)HorSpeed);
       
  2081                 iTrace->Trace(_L("End of COMASuplSession::GetPosition(HPositionGenericInfo) velType = EHorizVelocity"), KTraceFileName, __LINE__); 
       
  2082                 break;                        
       
  2083                 }
       
  2084             case EHorizAndVertVelocity:
       
  2085                 {
       
  2086                 iTrace->Trace(_L("Start of COMASuplSession::GetPosition(HPositionGenericInfo) velType = EHorizAndVertVelocity"), KTraceFileName, __LINE__); 
       
  2087                 COMASuplHorizAndVertVelocity* horizVertVel = (COMASuplHorizAndVertVelocity*)HorizVel;
       
  2088                 horizVertVel->GetHorizAndVertVel(Bearing, HorSpeed, VertDirection,
       
  2089                         VertSpeed);
       
  2090                 aSuplPosInfo.SetRequestedField(EPositionFieldHorizontalSpeed);
       
  2091                 aSuplPosInfo.SetValue(EPositionFieldHorizontalSpeed, (TReal32)HorSpeed);
       
  2092                 aSuplPosInfo.SetRequestedField(EPositionFieldVerticalSpeed);
       
  2093                 aSuplPosInfo.SetValue(EPositionFieldVerticalSpeed, (TReal32)VertSpeed);
       
  2094                 iTrace->Trace(_L("End of COMASuplSession::GetPosition(HPositionGenericInfo) velType = EHorizAndVertVelocity"), KTraceFileName, __LINE__); 
       
  2095                 break;
       
  2096                 }
       
  2097             case EHorizUncertVelocity:
       
  2098                 {
       
  2099                 iTrace->Trace(_L("Start of COMASuplSession::GetPosition(HPositionGenericInfo) velType = EHorizUncertVelocity"), KTraceFileName, __LINE__); 
       
  2100                 COMASuplHorizUncertVelocity* horizUncertVel = (COMASuplHorizUncertVelocity*)HorizVel;
       
  2101                 aSuplPosInfo.SetRequestedField(EPositionFieldHorizontalSpeed);
       
  2102                 horizUncertVel->GetHorizUncertVel(Bearing, HorSpeed, UncertSpeed); 
       
  2103                 aSuplPosInfo.SetValue(EPositionFieldHorizontalSpeed, (TReal32)HorSpeed);
       
  2104                 aSuplPosInfo.SetRequestedField(EPositionFieldHorizontalSpeedError);
       
  2105                 aSuplPosInfo.SetValue(EPositionFieldHorizontalSpeedError, (TReal32)UncertSpeed);
       
  2106                 iTrace->Trace(_L("End of COMASuplSession::GetPosition(HPositionGenericInfo) velType = EHorizUncertVelocity"), KTraceFileName, __LINE__); 
       
  2107                 break;
       
  2108                 }
       
  2109             case EHorizAndVertUncertVelocity:
       
  2110                 {
       
  2111                 iTrace->Trace(_L("Start of COMASuplSession::GetPosition(HPositionGenericInfo) velType = EHorizAndVertUncertVelocity"), KTraceFileName, __LINE__); 
       
  2112                 COMASuplHorizAndVertUncertVelocity* horizVertUncertVel = (COMASuplHorizAndVertUncertVelocity*)HorizVel;
       
  2113                 aSuplPosInfo.SetRequestedField(EPositionFieldHorizontalSpeed);
       
  2114                 horizVertUncertVel->GetHorizVertUncertVel(Bearing, HorSpeed,
       
  2115                         VertDirection,
       
  2116                         VertSpeed,HorUncertSpeed,VerUncertSpeed); 
       
  2117                 aSuplPosInfo.SetValue(EPositionFieldHorizontalSpeed, (TReal32)HorSpeed);
       
  2118                 aSuplPosInfo.SetRequestedField(EPositionFieldHorizontalSpeedError);
       
  2119                 aSuplPosInfo.SetValue(EPositionFieldHorizontalSpeedError, (TReal32)HorUncertSpeed);
       
  2120                 aSuplPosInfo.SetRequestedField(EPositionFieldVerticalSpeed);
       
  2121                 aSuplPosInfo.SetValue(EPositionFieldVerticalSpeed, (TReal32)VertSpeed);
       
  2122                 aSuplPosInfo.SetRequestedField(EPositionFieldVerticalSpeedError);
       
  2123                 aSuplPosInfo.SetValue(EPositionFieldVerticalSpeedError, (TReal32)VerUncertSpeed);
       
  2124                 iTrace->Trace(_L("End of COMASuplSession::GetPosition(HPositionGenericInfo) velType = EHorizAndVertUncertVelocity"), KTraceFileName, __LINE__); 
       
  2125                 break;
       
  2126                 }
       
  2127             }
       
  2128         }
       
  2129     TInt aClientTime;  
       
  2130     if(iClientQop.GetDelay(aClientTime)!=KErrNotFound)
       
  2131         {
       
  2132         TTimeIntervalSeconds aDelay;
       
  2133         iSessionEndTime.SecondsFrom(iSessionStartTime,aDelay);
       
  2134 
       
  2135         if(aClientTime< aDelay.Int())
       
  2136             aPositionQualityError=FALSE;	
       
  2137         }
       
  2138 
       
  2139     if(aPositionQualityError==FALSE)
       
  2140         return KSuplPositionQualityLoss;   
       
  2141     return KErrNone;
       
  2142     }
       
  2143 
       
  2144 	
       
  2145 // -----------------------------------------------------------------------------
       
  2146 // COMASuplSession::HandleOMASuplMessage
       
  2147 // Handles OMA Supl messages & starts processing according to state of session.
       
  2148 // (other items were commented in a header).
       
  2149 // -----------------------------------------------------------------------------
       
  2150 //
       
  2151 void COMASuplSession::HandleOMASuplMessageL(COMASuplAsnMessageBase* aDecodedAsnMessage,TRequestStatus& aStatus,TInt aSessionIdSeed,TInt aErrorCode)
       
  2152     {
       
  2153     delete iSuplState;
       
  2154     iSuplState = NULL;
       
  2155 
       
  2156     iSETSessionUniqueId = aSessionIdSeed;
       
  2157     iRunRequestStatus = & aStatus;
       
  2158     *iRunRequestStatus = KRequestPending;
       
  2159 
       
  2160     TInt networkMode = 1;
       
  2161     networkMode = GetNetworkModeL();
       
  2162 
       
  2163     TBuf<64> msg;
       
  2164     if ( networkMode == ECoreAppUIsNetworkConnectionNotAllowed )
       
  2165         {
       
  2166         msg.Copy(_L("The device is in OFFLINE mode."));
       
  2167         iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  2168         iSessionObserver.TerminateSession(this, KErrGeneral);
       
  2169         return;
       
  2170         }
       
  2171     else
       
  2172         {
       
  2173         msg.Copy(_L("The device is in ON LINE mode."));
       
  2174         iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  2175         }
       
  2176 
       
  2177     CSuplSettings::TSuplSettingsUsage usage = iSuplSettings->SUPLUsage();
       
  2178 
       
  2179     if (usage == CSuplSettings::ESuplUsageDisabled)
       
  2180         {                
       
  2181         msg.Copy(_L("SUPL Usage is disabled"));
       
  2182         iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  2183         iSessionObserver.TerminateSession(this, KErrGeneral);	
       
  2184         return;
       
  2185         }
       
  2186 
       
  2187     COMASuplAsnMessageBase::TSuplMessageType messageType = aDecodedAsnMessage->MessageType();
       
  2188 
       
  2189     if(messageType == COMASuplAsnMessageBase::ESUPL_INIT && aErrorCode == KErrNone)
       
  2190         {
       
  2191         HandleOMASuplMessageL(aDecodedAsnMessage);
       
  2192         }
       
  2193     else //Other messages than SUPL_INIT.... Send End
       
  2194         {
       
  2195         CreateCloneMessageL(aDecodedAsnMessage);		
       
  2196         UpdateSuplSessionIDL();
       
  2197  
       
  2198         iSuplSessionState = ESUPL_INITIALIZED;
       
  2199         iSuplMsgType = ESUPL_END;
       
  2200 
       
  2201         if((aErrorCode == KErrCompletion && messageType == COMASuplAsnMessageBase::ESUPL_INIT) ||
       
  2202                 (aErrorCode == KErrOMASuplOutOfRangeParameter && messageType == COMASuplAsnMessageBase::ESUPL_INIT) ||
       
  2203                 (aErrorCode == KErrOMASuplMessageLengthMismatch && messageType == COMASuplAsnMessageBase::ESUPL_INIT) ||
       
  2204                 (aErrorCode == KErrOMASuplShortFrame && messageType == COMASuplAsnMessageBase::ESUPL_INIT))	    			
       
  2205             {
       
  2206             iErrorStatusCode = COMASuplEnd::EUnexpectedDataValue;
       
  2207             if(aErrorCode == KErrOMASuplMessageLengthMismatch)
       
  2208                 {
       
  2209                 iErrorStatusCode = COMASuplEnd::EProtocolError;
       
  2210                 }
       
  2211             if(aErrorCode == KErrOMASuplShortFrame)
       
  2212                 {
       
  2213                 iErrorStatusCode = COMASuplEnd::EDataMissing;
       
  2214                 }
       
  2215             TInt len = iHSLPAddress.Length();
       
  2216             HBufC8 *hslpAdress = NULL;
       
  2217             if(len > 0)
       
  2218                 {
       
  2219                 hslpAdress = HBufC8::NewL(iHSLPAddress.Length());
       
  2220                 hslpAdress->Des().Copy(iHSLPAddress);
       
  2221                 }
       
  2222 
       
  2223             else if(len ==0)
       
  2224                 {
       
  2225                 iTrace->Trace(_L("Length of HSLP Address is = 0, passing the HSLP generated frm IMSI"), KTraceFileName, __LINE__);
       
  2226                 hslpAdress = HBufC8::NewL(iSuplSettings->SLPAddressfromImsi().Length());
       
  2227                 CleanupStack::PushL(hslpAdress);
       
  2228                 hslpAdress->Des().Copy(iSuplSettings->SLPAddressfromImsi());	
       
  2229                 CleanupStack::Pop(hslpAdress);						
       
  2230                 }
       
  2231             CleanupStack::PushL(hslpAdress);
       
  2232             iSuplState = COMASuplEndState::NewL(iErrorStatusCode,iOMASuplAsnHandlerBaseImpl,iEncodedSuplInit,hslpAdress);		
       
  2233             CleanupStack::PopAndDestroy(hslpAdress);
       
  2234             }
       
  2235         else
       
  2236             {
       
  2237             iErrorStatusCode = COMASuplEnd::EUnexpectedMessage;
       
  2238             iSuplState = COMASuplEndState::NewL(iErrorStatusCode,iOMASuplAsnHandlerBaseImpl);
       
  2239             }	
       
  2240 
       
  2241         SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplCreating);	
       
  2242         iSuplState->SetMsgStateObserver(this);
       
  2243         iSuplState->GenerateMessageL();
       
  2244         iSuplSessionState = ESUPL_GENERATE; 
       
  2245         }	
       
  2246     }
       
  2247 
       
  2248 // -----------------------------------------------------------------------------
       
  2249 // COMASuplSession::HandleOMASuplMessage
       
  2250 // Handles OMA Supl messages & starts processing according to state of session.
       
  2251 // (other items were commented in a header).
       
  2252 // -----------------------------------------------------------------------------
       
  2253 //
       
  2254 void COMASuplSession::HandleOMASuplMessageL(COMASuplAsnMessageBase* aDecodedAsnMessage)
       
  2255     {
       
  2256     CreateCloneMessageL(aDecodedAsnMessage);
       
  2257     if(CheckProtocolVersionL(aDecodedAsnMessage)) //Checks version with supported version
       
  2258         {
       
  2259         COMASuplAsnMessageBase::TSuplMessageType messageType = aDecodedAsnMessage->MessageType();
       
  2260 
       
  2261         if(messageType != COMASuplAsnMessageBase::ESUPL_POS)
       
  2262             {
       
  2263             iCompleteSelfRequestor->CompleteSelf(); //This will result in call of RequestCompleted()
       
  2264             }
       
  2265         else
       
  2266             {
       
  2267             RequestCompletedL();	
       
  2268             }
       
  2269         }
       
  2270     }
       
  2271 
       
  2272 // -----------------------------------------------------------------------------
       
  2273 // COMASuplSession::RequestCompleted
       
  2274 // 
       
  2275 // (other items were commented in a header).
       
  2276 // -----------------------------------------------------------------------------
       
  2277 //
       
  2278 void COMASuplSession::RequestCompletedL()
       
  2279     {
       
  2280     //Start Next Processing......	
       
  2281     iTrace->Trace(_L("COMASuplSession::RequestCompleted...Retriving message type"), KTraceFileName, __LINE__); 									
       
  2282 
       
  2283     COMASuplAsnMessageBase::TSuplMessageType messageType = iDecodedAsnMessage->MessageType();
       
  2284 
       
  2285     switch(messageType)
       
  2286         {
       
  2287         case COMASuplAsnMessageBase::ESUPL_RESPONSE:
       
  2288             {
       
  2289             iSuplSessionState = ESUPL_RECEIVED;
       
  2290             iTrace->Trace(_L("Received Message is of SUPL_RESPONSE type..."), KTraceFileName, __LINE__); 									
       
  2291             CancelAllOperations();
       
  2292             if(iSuplMsgType == ESUPL_START)
       
  2293                 {
       
  2294                 iSuplMsgType = ESUPL_RESPONSE; 
       
  2295                 ProcessSuplResponseL();
       
  2296                 }
       
  2297             else
       
  2298                 {
       
  2299                 iTrace->Trace(_L("COMASuplSession::RequestCompletedL...Protocol Error..."), KTraceFileName, __LINE__); 									
       
  2300                 // Send SUPL End with Protocol Error
       
  2301                 HandleSuplErrorL(KErrOMASuplProtocolError);				 		
       
  2302                 }
       
  2303             break;
       
  2304 
       
  2305             }
       
  2306         case COMASuplAsnMessageBase::ESUPL_POS: 
       
  2307             {
       
  2308             iTrace->Trace(_L("Received Message is of SUPL_POS type..."), KTraceFileName, __LINE__); 									
       
  2309             if(iOMASuplPOSRequestor) //
       
  2310                 {
       
  2311                 //if(((iSuplMsgType == ESUPL_POS || iSuplMsgType == ESUPL_POSINIT)) && !IsLastPOSMessage())
       
  2312                 if(((iSuplMsgType == ESUPL_POS || iSuplMsgType == ESUPL_POSINIT))) //Changed for SUPL_POS after UT3
       
  2313                     {
       
  2314                     iSuplMsgType = ESUPL_POS; 
       
  2315                     iTimer->StopTimer();	 // Added by Manish
       
  2316                     iSuplState->StopTimer();
       
  2317                     ProcessSuplPosL();
       
  2318                     }
       
  2319                 else
       
  2320                     {
       
  2321                     iSuplSessionState = ESUPL_RECEIVED; 
       
  2322                     CancelAllOperations();
       
  2323                     iTrace->Trace(_L("COMASuplSession::RequestCompletedL...Protocol Error..."), KTraceFileName, __LINE__); 									
       
  2324                     // Send SUPL End with Protocol Error
       
  2325                     HandleSuplErrorL(KErrOMASuplProtocolError);				 		
       
  2326                     }
       
  2327                 }
       
  2328             else // POS is not there
       
  2329                 {
       
  2330                 iSuplSessionState = ESUPL_RECEIVED; 
       
  2331                 CancelAllOperations();
       
  2332                 iTrace->Trace(_L("COMASuplSession::RequestCompletedL...Protocol Error..."), KTraceFileName, __LINE__); 									
       
  2333                 // Send SUPL End with Protocol Error
       
  2334                 HandleSuplErrorL(KErrOMASuplProtocolError);				 		
       
  2335                 }	
       
  2336             break;
       
  2337             }
       
  2338         case COMASuplAsnMessageBase::ESUPL_END:
       
  2339             {
       
  2340             iSuplSessionState = ESUPL_RECEIVED;
       
  2341             iTrace->Trace(_L("Received Message is of SUPL_END type..."), KTraceFileName, __LINE__); 									
       
  2342             CancelAllOperations();
       
  2343             //Close Connection--- Bug fix
       
  2344             iConnRequestor->CloseConnection();
       
  2345 			iPortNum = 0;
       
  2346 			//Remove entry from Settings to inform UI that trigger session has stop
       
  2347 			RemoveActiveSession();
       
  2348             if(IsGenerationInProgress()) //Check is generation going on
       
  2349                 {
       
  2350                 // Invoke SessionTerminate
       
  2351                 iSessionObserver.TerminateSession(this, KErrCompletion);
       
  2352                 break;
       
  2353                 }
       
  2354 
       
  2355             if(iSuplMsgType != ESUPL_END)
       
  2356                 {
       
  2357                 iSuplMsgType = ESUPL_END; //::POS::
       
  2358                 ProcessSuplEndL();		
       
  2359                 }						
       
  2360             break;
       
  2361             }
       
  2362 
       
  2363         case COMASuplAsnMessageBase::ESUPL_INIT:	 //::POS::
       
  2364             {
       
  2365             iTrace->Trace(_L("Received Message is of ESUPL_INIT type..."), KTraceFileName, __LINE__); 									
       
  2366             iSuplSessionState = ESUPL_RECEIVED;
       
  2367             CancelAllOperations();
       
  2368             iSuplMsgType = ESUPL_INIT; //::POS::
       
  2369             ProcessSuplInitL();
       
  2370             break;
       
  2371             }
       
  2372 
       
  2373         case COMASuplAsnMessageBase::ESUPL_AUTH_REQ:
       
  2374         case COMASuplAsnMessageBase::ESUPL_AUTH_RESP:
       
  2375             {
       
  2376             iTrace->Trace(_L("Received Message is of ESUPL_AUTH_RESPONCE/ESUPL_AUTH_REQ type..."), KTraceFileName, __LINE__); 									
       
  2377             iSuplSessionState = ESUPL_RECEIVED;
       
  2378             CancelAllOperations();
       
  2379             iSuplMsgType = ESUPL_AUTH_RESP; 
       
  2380             ProcessSuplAuthResponceL();
       
  2381             break;
       
  2382             }
       
  2383         case COMASuplAsnMessageBase::ESUPL_TRIG_RESPONSE:
       
  2384             {
       
  2385             iSuplSessionState = ESUPL_RECEIVED;
       
  2386             iTrace->Trace(_L("Received Message is of SUPL_TRIGGER_RESPONSE type..."), KTraceFileName, __LINE__); 									
       
  2387             CancelAllOperations();
       
  2388             if(iSuplMsgType == ESUPL_TRIG_START)
       
  2389                 {
       
  2390                 iSuplMsgType = ESUPL_TRIG_RESPONSE; 
       
  2391                 ProcessSuplTriggerResponseL();
       
  2392                 //Start timer without waiting for clientNotify
       
  2393 				if (iRequestType == ESUPL_TERMINAL)
       
  2394                 	StartPeriodicTriggerTimer();
       
  2395                 }
       
  2396             else
       
  2397                 {
       
  2398                 iTrace->Trace(_L("COMASuplSession::RequestCompletedL...Protocol Error..."), KTraceFileName, __LINE__); 									
       
  2399                 // Send SUPL End with Protocol Error
       
  2400                 HandleSuplErrorL(KErrOMASuplProtocolError);				 		
       
  2401                 }
       
  2402             break;
       
  2403 
       
  2404             }
       
  2405 
       
  2406         case COMASuplAsnMessageBase::ESUPL_REPORT:
       
  2407             {
       
  2408             iSuplSessionState = ESUPL_RECEIVED;
       
  2409             iTrace->Trace(_L("Received Message is of SUPL_REPORT type..."), KTraceFileName, __LINE__); 									
       
  2410             CancelAllOperations();
       
  2411 
       
  2412             if (iInterval > KMaxIntervalTime)
       
  2413                 iConnRequestor->CloseConnection();
       
  2414 
       
  2415             if(IsGenerationInProgress()) //Check is generation going on
       
  2416                 {
       
  2417                 // Invoke SessionTerminate
       
  2418                 if (iRequestType != ESUPL_NETWORK)
       
  2419                     iSessionObserver.TerminateSession(this, KErrCompletion);
       
  2420                 break;
       
  2421                 }
       
  2422 
       
  2423             //if(iSuplMsgType != ESUPL_REPORT)
       
  2424             if(iSuplMsgType == ESUPL_POS || iSuplMsgType == ESUPL_POSINIT)
       
  2425                 {
       
  2426                 iSuplMsgType = ESUPL_REPORT; //::POS::
       
  2427                 ProcessSuplReportL();		
       
  2428             	if (iNumFixes == 0 && iRequestType == ESUPL_NETWORK)
       
  2429                    {                                        
       
  2430 				   iTrace->Trace(_L("StartTimer for SUPL_TRIGGER_REPORT..."), KTraceFileName, __LINE__); 
       
  2431 		           iSuplState->SetMsgStateObserver(this);
       
  2432 				   iSuplState->StartTimer(); 	
       
  2433                    }
       
  2434                                                                             
       
  2435 				}
       
  2436             else
       
  2437                 {
       
  2438                 iTrace->Trace(_L("COMASuplSession::RequestCompletedL...Protocol Error..."), KTraceFileName, __LINE__);                                  
       
  2439                 // Send SUPL End with Protocol Error
       
  2440                 HandleSuplErrorL(KErrOMASuplProtocolError);                     
       
  2441                 }
       
  2442             /*	if(iSuplMsgType != ESUPL_REPORT)
       
  2443 							{
       
  2444 								iSuplMsgType = ESUPL_REPORT; //::POS::
       
  2445 								ProcessSuplReportL();		
       
  2446 							}			*/			
       
  2447             break;
       
  2448             }
       
  2449         case COMASuplAsnMessageBase::ESUPL_TRIG_STOP:
       
  2450             {
       
  2451             iSuplSessionState = ESUPL_RECEIVED;
       
  2452             iTrace->Trace(_L("Received Message is of SUPL_TRIGGER_STOP type..."), KTraceFileName, __LINE__); 									
       
  2453             CancelAllOperations();
       
  2454 
       
  2455             if(iSuplMsgType != ESUPL_TRIG_STOP)
       
  2456                 {
       
  2457                 iSuplMsgType = ESUPL_TRIG_STOP; //::POS::
       
  2458                 ProcessSuplTriggerStopL();		
       
  2459                 }						
       
  2460             break;
       
  2461             }
       
  2462         default:
       
  2463             {
       
  2464             iSuplSessionState = ESUPL_RECEIVED;	
       
  2465             iTrace->Trace(_L("Received Message is of UNKNOWN type..."), KTraceFileName, __LINE__); 									
       
  2466             CancelAllOperations();
       
  2467             HandleSuplErrorL(KErrOMASuplProtocolError);
       
  2468             break;	
       
  2469 
       
  2470             }
       
  2471         }
       
  2472     }
       
  2473 
       
  2474 
       
  2475 // -----------------------------------------------------------------------------
       
  2476 // COMASuplSession::CancelAllOperations
       
  2477 // 
       
  2478 // (other items were commented in a header).
       
  2479 // -----------------------------------------------------------------------------
       
  2480 //
       
  2481 void COMASuplSession::CancelAllOperations()
       
  2482     {
       
  2483     if(iSuplState)
       
  2484         {
       
  2485         iSuplState->CancelOperation();
       
  2486         }
       
  2487 
       
  2488     iTrace->Trace(_L("iConnRequestor->Cancel..."), KTraceFileName, __LINE__); 									
       
  2489     iConnRequestor->Cancel();
       
  2490     iTrace->Trace(_L("iCompleteSelfRequestor->Cancel..."), KTraceFileName, __LINE__); 									
       
  2491     iCompleteSelfRequestor->Cancel();
       
  2492 
       
  2493     if(iOMASuplPOSRequestor)
       
  2494         iOMASuplPOSRequestor->Cancel(); 
       
  2495 
       
  2496     iTrace->Trace(_L("iTimer->StopTimer..."), KTraceFileName, __LINE__); 									
       
  2497     iTimer->StopTimer();	   
       
  2498     }
       
  2499 
       
  2500 // -----------------------------------------------------------------------------
       
  2501 // COMASuplSession::ProcessSuplResponse
       
  2502 // Process SUPL RESPONSE
       
  2503 // (other items were commented in a header).
       
  2504 // -----------------------------------------------------------------------------
       
  2505 //
       
  2506 void COMASuplSession::ProcessSuplResponseL()
       
  2507     {
       
  2508     iTrace->Trace(_L("Processing SUPL Response..."), KTraceFileName, __LINE__); 							
       
  2509 
       
  2510     // Recreate SUPL STATE
       
  2511     delete iSuplState;
       
  2512     iSuplState = NULL;
       
  2513 
       
  2514     iSuplState = COMASuplResponseState::NewL();
       
  2515     iSuplState->SetVersion(iSuplVersion);
       
  2516     TInt err = iSuplState->ProcessMessageL(iDecodedAsnMessage);
       
  2517     SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplReceived);	
       
  2518     iSuplMsgType = ESUPL_RESPONSE;
       
  2519 
       
  2520     iPosMethod = static_cast<COMASuplResponseState *>(iSuplState)->GetPosMethod();
       
  2521 
       
  2522     TBuf<128> msg(_L("ProcessSuplResponseL() got iPosMethod: "));
       
  2523     msg.AppendNum(iPosMethod);
       
  2524     iTrace->Trace(msg, KTraceFileName, __LINE__);
       
  2525     if(KErrNone == err)
       
  2526         {
       
  2527         iSuplSessionState = ESUPL_GENERATE;
       
  2528         UpdateSuplSessionIDL();
       
  2529         OperationCompleteL(KErrNone);	
       
  2530         }
       
  2531     else
       
  2532         {
       
  2533         HandleSuplErrorL(err);
       
  2534         }
       
  2535 
       
  2536     }
       
  2537 
       
  2538 // -----------------------------------------------------------------------------
       
  2539 // COMASuplSession::ProcessSuplPosL
       
  2540 // Process SUPL POS
       
  2541 // (other items were commented in a header).
       
  2542 // -----------------------------------------------------------------------------
       
  2543 //
       
  2544 void COMASuplSession::ProcessSuplPosL()
       
  2545     {
       
  2546     iTrace->Trace(_L("Processing SUPL Pos..."), KTraceFileName, __LINE__); 							
       
  2547     TInt error = KErrNone;
       
  2548 
       
  2549     // Recreate SUPL STATE if the previous state was not ESUPL_POS
       
  2550     if(iSuplState)
       
  2551         {
       
  2552         if(COMASuplState::ESUPL_POS != iSuplState->GetSuplState())
       
  2553             {
       
  2554             delete iSuplState;
       
  2555             iSuplState = NULL;
       
  2556 
       
  2557             iSuplState = COMASuplPosState::NewL(iPOSSession,iUT3_PosTimer,iSETCapabilities,iOMASuplAsnHandlerBaseImpl);					
       
  2558             }
       
  2559 
       
  2560         iSuplState->SetVersion(iSuplVersion);
       
  2561         error = iSuplState->ProcessMessageL(iDecodedAsnMessage);
       
  2562 
       
  2563         //This is for generating SUPL_POS, after UT3 timer started & received SUPL_POS.
       
  2564 
       
  2565         //!iIsFirstPOSMessage this is for putting new request if we
       
  2566         //gets SUPL_POS even if first POS message from SET failed to generate data 
       
  2567         if( KErrNone == error && ( IsLastPOSMessage() || !iIsFirstPOSMessage )) 
       
  2568             {
       
  2569             iTrace->Trace(_L("Generating POS ... After starting UT3 OR After failing of Generation of first POS message..."), KTraceFileName, __LINE__); 
       
  2570             iSuplMsgType = ESUPL_POS;
       
  2571             iSuplSessionState = ESUPL_GENERATE;
       
  2572             GenerateSuplMessageL();
       
  2573             iSuplSessionState = ESUPL_ENCODE;
       
  2574             }
       
  2575         }
       
  2576 
       
  2577     if(KErrNone != error)
       
  2578         {				
       
  2579         TBuf<64> msg(_L("Error while Processing SUPL Pos is : "));
       
  2580         msg.AppendNum(error);
       
  2581         iTrace->Trace(msg, KTraceFileName, __LINE__); 
       
  2582         HandleSuplErrorL(error);
       
  2583         }
       
  2584 
       
  2585     }
       
  2586 	
       
  2587 // -----------------------------------------------------------------------------
       
  2588 // COMASuplSession::ProcessSuplEndL
       
  2589 // Process SUPL RESPONSE
       
  2590 // (other items were commented in a header).
       
  2591 // -----------------------------------------------------------------------------
       
  2592 //
       
  2593 void COMASuplSession::ProcessSuplEndL()
       
  2594     {
       
  2595     iTrace->Trace(_L("COMASuplSession::ProcessSuplEndL..."), KTraceFileName, __LINE__); 							
       
  2596 
       
  2597     // Recreate SUPL STATE
       
  2598     delete iSuplState;
       
  2599     iSuplState = NULL;
       
  2600 
       
  2601     iSuplState = COMASuplEndState::NewL(COMASuplEnd::EUnspecified,iOMASuplAsnHandlerBaseImpl);
       
  2602     iSuplState->SetVersion(iSuplVersion);
       
  2603     TInt err = iSuplState->ProcessMessageL(iDecodedAsnMessage);
       
  2604     SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplReceived);	
       
  2605 
       
  2606     LogEndTime(); //Log end time if QoP & delay in Qop is present.
       
  2607 
       
  2608     if(KErrOMASuplVersionNotMatching != err) //KErrNone == err)..changed for new requirement...
       
  2609         // Even if there is status code in SUPL_END ... still process SUPL_END 	
       
  2610         {
       
  2611         if(iRequestType == COMASuplSession::ESUPL_TERMINAL)
       
  2612             {
       
  2613             // if it is a trigger request, complete the
       
  2614             // request immediately as we don't expect position
       
  2615             // information in SUPL_END
       
  2616             if (iTriggerSession)
       
  2617                 {
       
  2618                 // Invoke SessionTerminate
       
  2619                 iTriggerSession = EFalse; // reset the flag
       
  2620                 iSessionObserver.TerminateSession(this, KErrNone);
       
  2621                 }	
       
  2622             else
       
  2623                 {                           
       
  2624                 // Delete Position
       
  2625                 delete iPosition;
       
  2626                 iPosition = NULL;
       
  2627 
       
  2628                 COMASuplEndState *currState = static_cast <COMASuplEndState *>(iSuplState);
       
  2629                 COMASuplEnd::TOMASuplStatusCode statusCode = currState->GetStatusCode();
       
  2630 
       
  2631                 if (statusCode == COMASuplEnd::EPosMethodMismatch)
       
  2632                     {                                
       
  2633                     iFailedCaps = iAllowedCapabilities;
       
  2634                     iCapsFail = ETrue;
       
  2635                     }                                    
       
  2636 
       
  2637                 // Retrieve Position
       
  2638                 COMASuplPosition *currPosition = currState->GetPosition();
       
  2639                 if(currPosition)  //Position is in SUPL_END
       
  2640                     {
       
  2641                     iPosition =static_cast <COMASuplPosition *>(currPosition->CloneL());	
       
  2642 
       
  2643                     if(KErrNone == err)
       
  2644                         {
       
  2645                         iTrace->Trace(_L("Received SUPL_END Without Status Code"), KTraceFileName, __LINE__);
       
  2646                         // Invoke SessionTerminate
       
  2647                         iSessionObserver.TerminateSession(this,KErrNone);
       
  2648                         }
       
  2649                     else  // Position & status code is present...thats why completing with KErrCompletion.
       
  2650                         {
       
  2651                         iTrace->Trace(_L("Received SUPL_END With Status Code"), KTraceFileName, __LINE__);
       
  2652                         // Invoke SessionTerminate
       
  2653                         // Changed error code as location Fw uses position if it completes with +ve value. //KErrCompletion
       
  2654                         iSessionObserver.TerminateSession(this,KSuplPositionPresent);
       
  2655                         }
       
  2656                     }
       
  2657                 else
       
  2658                     {
       
  2659                     if(iOMASuplPOSRequestor)
       
  2660                         {
       
  2661                         iPosition = COMASuplPosition::NewL();
       
  2662                         iOMASuplPOSRequestor->SetObserver(this);
       
  2663                         err = iOMASuplPOSRequestor->GetPositionL(iPosition);
       
  2664                         if(err != KErrNone)
       
  2665                             {
       
  2666                             delete iPosition;
       
  2667                             iPosition = NULL;
       
  2668                             // Invoke SessionTerminate
       
  2669                             iSessionObserver.TerminateSession(this, err);	
       
  2670                             }
       
  2671                         }
       
  2672                     else //Position && iOMASuplPOSRequestor are not there
       
  2673                         {
       
  2674                         // Invoke SessionTerminate
       
  2675                         iSessionObserver.TerminateSession(this, KErrNone);
       
  2676                         }	
       
  2677 
       
  2678                     }
       
  2679                 } 
       
  2680             } 
       
  2681         else
       
  2682             {
       
  2683             // Invoke SessionTerminate //Close session
       
  2684             iSessionObserver.TerminateSession(this, KErrNone);	
       
  2685             }				  	 
       
  2686         }
       
  2687     else
       
  2688         {
       
  2689         //  Handle Error
       
  2690         HandleSuplErrorL(err);
       
  2691         }
       
  2692     }
       
  2693 
       
  2694 
       
  2695 // -----------------------------------------------------------------------------
       
  2696 // COMASuplSession::ProcessSuplInitL
       
  2697 // Process SUPL INIT
       
  2698 // (other items were commented in a header).
       
  2699 // -----------------------------------------------------------------------------
       
  2700 //
       
  2701 void COMASuplSession::ProcessSuplInitL()
       
  2702     {
       
  2703     iTrace->Trace(_L("COMASuplSession::ProcessSuplInitL..."), KTraceFileName, __LINE__); 							
       
  2704 
       
  2705     TInt ret = ServerAddressCheckForSuplInitL();
       
  2706     if(ret != KErrNone)
       
  2707         {
       
  2708         HandleSuplErrorL(KErrGeneral);
       
  2709         return;
       
  2710         }
       
  2711 
       
  2712     // Recreate SUPL STATE
       
  2713     delete iSuplState;
       
  2714     iSuplState = NULL;
       
  2715     UpdateSuplSessionIDL();
       
  2716     iSuplState = COMASuplInitState::NewL(iPrivacyTimer,iHSLPAddress,*this,iSETMode,iNetworkPrivacy);
       
  2717     iSuplState->SetVersion(iSuplVersion);
       
  2718     static_cast<COMASuplInitState*>(iSuplState)->SetSessionId(iSETSessionUniqueId);
       
  2719     TInt err = iSuplState->ProcessMessageL(iDecodedAsnMessage);//will result in PrivacyCheckCompleteL
       
  2720 
       
  2721         if (static_cast<COMASuplInitState*>(iSuplState)->IsTriggerSession())
       
  2722             {                            
       
  2723             iTriggerSession = ETrue;                                
       
  2724             iTriggerType = static_cast<COMASuplInitState*>(iSuplState)->GetTriggerType();
       
  2725             }
       
  2726 
       
  2727 		SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplReceived);	
       
  2728 		
       
  2729 		iPosMethod  = static_cast<COMASuplInitState*>(iSuplState)->GetPosMethod();
       
  2730 		
       
  2731 		TBuf<128> msg(_L("COMASuplSession::ProcessSuplInitL() got iPosMethod : "));
       
  2732 		msg.AppendNum(iPosMethod);
       
  2733 		iTrace->Trace(msg, KTraceFileName, __LINE__);
       
  2734 		if(KErrOMASuplNoPosition == err || KErrSuplServiceNotSupported == err || 
       
  2735                         KErrOMANonProxyModeNotSupported == err )
       
  2736 			{
       
  2737 				HandleSuplInitErrorL(err);
       
  2738 				return;
       
  2739 			}
       
  2740 			
       
  2741 		if(KErrNone != err)
       
  2742 			{
       
  2743 				HandleSuplErrorL(err);
       
  2744 			}
       
  2745 	}
       
  2746 	
       
  2747 // -----------------------------------------------------------------------------
       
  2748 // COMASuplSession::ProcessSuplAuthResponceL
       
  2749 // Process SUPL AUTH  RESPONSE
       
  2750 // (other items were commented in a header).
       
  2751 // -----------------------------------------------------------------------------
       
  2752 //
       
  2753 void COMASuplSession::ProcessSuplAuthResponceL()
       
  2754     {
       
  2755     // No need to create state class object for now....
       
  2756     // if needed in future ... we can write it...since it will add more code which is 
       
  2757     //equivalent to current implementation.
       
  2758 
       
  2759     delete iSuplState;
       
  2760     iSuplState = NULL;
       
  2761     SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplReceived);	// inform to POS
       
  2762     HandleSuplErrorL(KErrOMASuplProtocolError);
       
  2763     }
       
  2764 
       
  2765 // -----------------------------------------------------------------------------
       
  2766 // COMASuplSession::ProcessSuplTriggerResponse
       
  2767 // Process SUPL RESPONSE
       
  2768 // (other items were commented in a header).
       
  2769 // -----------------------------------------------------------------------------
       
  2770 //
       
  2771 void COMASuplSession::ProcessSuplTriggerResponseL()
       
  2772     {
       
  2773     iTrace->Trace(_L("Processing SUPL Trigger Response..."), KTraceFileName, __LINE__); 							
       
  2774 
       
  2775     // Recreate SUPL STATE
       
  2776     if (iSuplState)
       
  2777         {                
       
  2778         iTrace->Trace(_L("Deleting SUPL state..."), KTraceFileName, __LINE__); 							
       
  2779         delete iSuplState;
       
  2780         iSuplState = NULL;
       
  2781         }
       
  2782 
       
  2783     iTrace->Trace(_L("Creating trigger Response..."), KTraceFileName, __LINE__); 							
       
  2784     iSuplState = COMASuplTriggerResponseState::NewL();
       
  2785     iTrace->Trace(_L("Setting version..."), KTraceFileName, __LINE__); 							
       
  2786     iSuplState->SetVersion(iSuplVersion);
       
  2787     iTrace->Trace(_L("Calling ProcessMessageL..."), KTraceFileName, __LINE__); 							
       
  2788     TInt err = iSuplState->ProcessMessageL(iDecodedAsnMessage);
       
  2789     SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplReceived);	
       
  2790     iSuplMsgType = ESUPL_TRIG_RESPONSE;
       
  2791 
       
  2792     iPosMethod = static_cast<COMASuplTriggerResponseState *>(iSuplState)->GetPosMethod();
       
  2793 
       
  2794     TBuf<128> msg(_L("ProcessSuplTriggerResponseL() got iPosMethod: "));
       
  2795     msg.AppendNum(iPosMethod);
       
  2796     iTrace->Trace(msg, KTraceFileName, __LINE__);
       
  2797 
       
  2798     //If no error, complete request
       
  2799     if (iRequestType == ESUPL_NETWORK)
       
  2800         {
       
  2801             //iTrace->Trace(_L(" Calling COMASuplSession2::LaunchNotifyDialogL..."), KTraceFileName, __LINE__);
       
  2802             	//LaunchNotifyDialogL();
       
  2803 							//Inform UI that ,trigger session has started...
       
  2804 								//InsertActiveSessionL();
       
  2805         TBool trgFlag = static_cast<COMASuplTriggerResponseState *>(iSuplState)->GetTriggerParamsFlag();
       
  2806 
       
  2807         // If it is a NI request, read trigger params                    
       
  2808         if (trgFlag)
       
  2809             {                    
       
  2810             TOMASuplTriggerParams trgParams = static_cast<COMASuplTriggerResponseState *>(iSuplState)->GetTriggerParams();
       
  2811             TOMASuplPeriodicParams perTrgParams;
       
  2812             trgParams.GetPeriodicParams(perTrgParams);
       
  2813 
       
  2814                 perTrgParams.GetSuplPeriodicParams((TInt32&)iNumFixes, (TInt32&)iInterval);
       
  2815                 perTrgParams.GetStartTimeSet((TInt32&)iStartTime);
       
  2816                 iTotalNoOfFixes = iNumFixes;
       
  2817                 iStartTimeCopy = iStartTime;
       
  2818 
       
  2819                 //Close connection
       
  2820                 if (iInterval > KMaxIntervalTime || iStartTime > KMaxStartTime)
       
  2821 				    iConnRequestor->CloseConnection();
       
  2822                 //For NI request, we don't get notify request
       
  2823                 StartPeriodicTriggerTimer();
       
  2824                 iClientNotify = ETrue;
       
  2825             }
       
  2826 		    else
       
  2827 			    {
       
  2828 				//HandleSuplErrorL(err);
       
  2829 				iErrorStatusCode = COMASuplEnd::EDataMissing;
       
  2830 				iSuplSessionState = ESUPL_GENERATE;
       
  2831 				iSuplMsgType = ESUPL_END;
       
  2832 				GenerateSuplMessageL();
       
  2833 			    }
       
  2834             }
       
  2835         else        
       
  2836             {                
       
  2837 		    if(KErrNone == err)
       
  2838 			    {
       
  2839     	        if(iRunRequestStatus)
       
  2840     		        {
       
  2841    		            User::RequestComplete(iRunRequestStatus,KErrNone);
       
  2842                     }
       
  2843                 GetPeriodicTriggerParams();
       
  2844                 //Inform UI that ,trigger session has started...
       
  2845 								InsertActiveSessionL();
       
  2846                 //Close connection
       
  2847                 if (iInterval > KMaxIntervalTime || iStartTime > KMaxStartTime)
       
  2848 				    iConnRequestor->CloseConnection();
       
  2849                 }
       
  2850 		    else
       
  2851 			    {
       
  2852 				HandleSuplErrorL(err);
       
  2853 			    }
       
  2854             }
       
  2855         //Update session ID received in trigger response
       
  2856 	    UpdateSuplSessionIDL();
       
  2857 	       //Inform UI that ,trigger session has started...
       
  2858 	      //  InsertActiveSessionL();
       
  2859 
       
  2860 
       
  2861     }
       
  2862 
       
  2863 // -----------------------------------------------------------------------------
       
  2864 // COMASuplSession::ProcessSuplReportL
       
  2865 // Process SUPL RESPONSE
       
  2866 // (other items were commented in a header).
       
  2867 // -----------------------------------------------------------------------------
       
  2868 //
       
  2869 void COMASuplSession::ProcessSuplReportL()
       
  2870     {
       
  2871     iTrace->Trace(_L("COMASuplSession::ProcessSuplReportL..."), KTraceFileName, __LINE__); 							
       
  2872 
       
  2873     // Recreate SUPL STATE
       
  2874     delete iSuplState;
       
  2875     iSuplState = NULL;
       
  2876 		iTrace->Trace(_L("After state delete ProcessSuplReportL..."), KTraceFileName, __LINE__); 							
       
  2877 		TBuf<32> tempBuf;
       
  2878 		tempBuf.Append(_L("Timer Value:"));
       
  2879 		tempBuf.AppendNum(iUT2_PosInitTimer);
       
  2880 		iTrace->Trace(tempBuf, KTraceFileName, __LINE__); 
       
  2881     iSuplState = COMASuplReportState::NewL(iUT2_PosInitTimer, iOMASuplAsnHandlerBaseImpl);
       
  2882     iSuplState->SetVersion(iSuplVersion);
       
  2883     TInt err = iSuplState->ProcessMessageL(iDecodedAsnMessage);
       
  2884     SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplReceived);	
       
  2885 
       
  2886     LogEndTime(); //Log end time if QoP & delay in Qop is present.
       
  2887 
       
  2888     //Decrement number of fixes requested	
       
  2889     iNumFixes--;
       
  2890     
       
  2891     
       
  2892     if(iRequestType == COMASuplSession::ESUPL_TERMINAL)
       
  2893         {
       
  2894         iTrace->Trace(_L("ProcessSuplReportL..., terminal request"), KTraceFileName, __LINE__); 							
       
  2895         // Delete Position
       
  2896         delete iPosition;
       
  2897         iPosition = NULL;
       
  2898         UpdateActiveTriggerSession(); //Update UI for trigger info...
       
  2899         COMASuplReportState *currState = static_cast <COMASuplReportState *>(iSuplState);
       
  2900         // Retrieve Position
       
  2901         COMASuplPosition *currPosition = currState->GetPositionL();
       
  2902         if(currPosition)  //Position is in SUPL_REPORT for network based positioning
       
  2903             {
       
  2904             iTrace->Trace(_L("ProcessSuplReportL..., Position present"), KTraceFileName, __LINE__);
       
  2905             iPosition = static_cast <COMASuplPosition *>(currPosition->CloneL());	
       
  2906             TPositionInfo position;        
       
  2907             GetPosition(position);
       
  2908             if (iNumFixes == 0)
       
  2909                 {                    
       
  2910                 iTrace->Trace(_L("ProcessSuplReportL, last fix generation SUPL END"), KTraceFileName, __LINE__);
       
  2911                 iSuplSessionState = ESUPL_GENERATE;
       
  2912                 iSuplMsgType = ESUPL_END;
       
  2913                 GenerateSuplMessageL();
       
  2914                 }
       
  2915             else
       
  2916                 {                    
       
  2917                 if (iTotalNoOfFixes != iNumFixes || iClientNotify)//if this is the first fix and client notify is true then complete the request
       
  2918                     {                        
       
  2919                     iTrace->Trace(_L("ProcessSuplReportL, Completing session"), KTraceFileName, __LINE__);
       
  2920                     if( iTrgFireInfo )
       
  2921 	                    {
       
  2922 	                    iTrgFireInfo->Set(position);
       
  2923 	                    }
       
  2924                     CompleteSession(KErrNone);
       
  2925                     }
       
  2926                 }
       
  2927             }
       
  2928         else  //Position is with POS Plugin for MS-BASED case
       
  2929             {
       
  2930             if(iOMASuplPOSRequestor)
       
  2931                 {
       
  2932                 iPosition = COMASuplPosition::NewL();
       
  2933                 iOMASuplPOSRequestor->SetObserver(this);
       
  2934                 err = iOMASuplPOSRequestor->GetPositionL(iPosition);
       
  2935                 if(err != KErrNone)
       
  2936                     {
       
  2937                     delete iPosition;
       
  2938                     iPosition = NULL;
       
  2939                     // Invoke SessionTerminate
       
  2940                     if (iRequestType != ESUPL_NETWORK)
       
  2941                         iSessionObserver.TerminateSession(this, err);	
       
  2942                     }
       
  2943                 }
       
  2944             else //Position && iOMASuplPOSRequestor are not there
       
  2945                 {
       
  2946                 // Invoke SessionTerminate
       
  2947                 if (iRequestType != ESUPL_NETWORK)
       
  2948                     {			
       
  2949                     if (iNumFixes == 0)
       
  2950                         {                    
       
  2951                         iTrace->Trace(_L("ProcessSuplReportL, last fix generation SUPL END"), KTraceFileName, __LINE__);
       
  2952                         iSuplSessionState = ESUPL_GENERATE;
       
  2953                         iSuplMsgType = ESUPL_END;
       
  2954                         GenerateSuplMessageL();
       
  2955                         }
       
  2956                     else
       
  2957                         {                            
       
  2958                         iTrace->Trace(_L("ProcessSuplReportL...,  completing session"), KTraceFileName, __LINE__);
       
  2959                         iSessionObserver.TerminateSession(this, KErrNone);
       
  2960                         }
       
  2961                     }
       
  2962                 }	
       
  2963             }
       
  2964         //Start timer without waiting for client's Notify request
       
  2965         if (iNumFixes != 0)
       
  2966             StartPeriodicTriggerTimer();
       
  2967         } 
       
  2968 
       
  2969     //For NI request, we don't get notify request
       
  2970     if (iNumFixes != 0 && iRequestType == ESUPL_NETWORK)
       
  2971         {            
       
  2972         iClientNotify = ETrue;
       
  2973         StartPeriodicTriggerTimer();
       
  2974         LaunchNotifyDialogL();
       
  2975         //UpdateActiveTriggerSession(); //Update UI for trigger info...
       
  2976     		}
       
  2977     		
       
  2978     if (iNumFixes == 0 && iRequestType == ESUPL_NETWORK)
       
  2979         {            
       
  2980         LaunchNotifyDialogL();
       
  2981         }
       
  2982 }
       
  2983 
       
  2984 // -----------------------------------------------------------------------------
       
  2985 // COMASuplSession::ProcessSuplTriggerStopL
       
  2986 // Process SUPL RESPONSE
       
  2987 // (other items were commented in a header).
       
  2988 // -----------------------------------------------------------------------------
       
  2989 //
       
  2990 void COMASuplSession::ProcessSuplTriggerStopL()
       
  2991     {
       
  2992     iTrace->Trace(_L("COMASuplSession::ProcessSuplTriggerStopL..."), KTraceFileName, __LINE__); 							
       
  2993 
       
  2994     // Recreate SUPL STATE
       
  2995     delete iSuplState;
       
  2996     iSuplState = NULL;
       
  2997     iTrace->Trace(_L("After state delete ProcessSuplTriggerStopL..."), KTraceFileName, __LINE__); 							
       
  2998 
       
  2999     iSuplState = COMASuplTriggerStopState::NewL(iOMASuplAsnHandlerBaseImpl);
       
  3000     iSuplState->SetVersion(iSuplVersion);
       
  3001     TInt err = iSuplState->ProcessMessageL(iDecodedAsnMessage);
       
  3002     SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplReceived);	
       
  3003 
       
  3004     LogEndTime(); //Log end time if QoP & delay in Qop is present.
       
  3005 
       
  3006         // For all requests, send SUPL END                    
       
  3007         {            
       
  3008         iErrorStatusCode = COMASuplEnd::EVer2SessionStopped;
       
  3009         GenerateSuplEndL();
       
  3010         }
       
  3011     }
       
  3012 // -----------------------------------------------------------------------------
       
  3013 // COMASuplSession::UpdateSuplSessionIDL
       
  3014 //  Update SLP Sesssion ID with rececived slp id.
       
  3015 // (other items were commented in a header).
       
  3016 // -----------------------------------------------------------------------------
       
  3017 //
       
  3018 void COMASuplSession::UpdateSuplSessionIDL()	
       
  3019     {
       
  3020     iTrace->Trace(_L("COMASuplSession::UpdateSuplSessionIDL"), KTraceFileName, __LINE__); 		
       
  3021     COMASuplSessionID* retrivedSessionID = NULL;
       
  3022 
       
  3023     if(!iDecodedAsnMessage)
       
  3024         return;
       
  3025 
       
  3026     iDecodedAsnMessage->SessionId(retrivedSessionID);
       
  3027     UpdateSLPSessionIDL(retrivedSessionID);
       
  3028     }
       
  3029 
       
  3030 // -----------------------------------------------------------------------------
       
  3031 // COMASuplSession::UpdateSessionID
       
  3032 // Update SLP Sesssion ID with received session ID.
       
  3033 // (other items were commented in a header).
       
  3034 // -----------------------------------------------------------------------------
       
  3035 //
       
  3036 void COMASuplSession::UpdateSLPSessionIDL(COMASuplSessionID *aSessionID)
       
  3037     {
       
  3038     iTrace->Trace(_L("Start of COMASuplSession::UpdateSLPSessionIDL"), KTraceFileName, __LINE__); 		
       
  3039     if(aSessionID)
       
  3040         {
       
  3041         COMASuplSLPSessionID* suplSLPID = NULL;
       
  3042         aSessionID->SLPSessionID(suplSLPID);
       
  3043 
       
  3044         if(suplSLPID)
       
  3045             {
       
  3046             TBuf8<KSLPSessionID> sessionId;
       
  3047             COMASuplSLPSessionID* slpNewSessionId  = COMASuplSLPSessionID::NewL();		
       
  3048             CleanupStack::PushL(slpNewSessionId);
       
  3049             COMASuplSLPAddress* slpNewIPAddress = COMASuplSLPAddress::NewL();
       
  3050             CleanupStack::Pop(slpNewSessionId);
       
  3051 
       
  3052             COMASuplSLPAddress* slpIPAddress = NULL;
       
  3053             suplSLPID->SuplSLPSessionID(sessionId,slpIPAddress);
       
  3054             slpNewSessionId->SetSuplSLPSessionID(sessionId,slpNewIPAddress);
       
  3055 
       
  3056             if(slpIPAddress)
       
  3057                 {	
       
  3058                 COMASuplSLPAddress::TSuplSLPAddressType addressType = slpIPAddress->SLPAddressType();
       
  3059                 if(addressType == COMASuplSLPAddress::EFqdn)
       
  3060                     {
       
  3061                     HBufC8* fqdn = NULL;
       
  3062                     TInt err = slpIPAddress->Fqdn(fqdn);
       
  3063                     if(err == KErrNone)
       
  3064                         {
       
  3065                         //Ownership transfer towords COMASuplSLPAddress
       
  3066                         HBufC8* newFqdn = fqdn->AllocL();
       
  3067                         slpNewIPAddress->SetFqdn(newFqdn);
       
  3068                         }
       
  3069                     }
       
  3070 
       
  3071                 if(  addressType == COMASuplSLPAddress::EIPv4Address )	
       
  3072                     {
       
  3073                     TBuf8<KIPv4Address> ipAddress;
       
  3074                     TInt err = slpIPAddress->IPvAddress(ipAddress);
       
  3075                     if(err == KErrNone)
       
  3076                         slpNewIPAddress->SetIPv4Address(ipAddress);
       
  3077                     }
       
  3078 
       
  3079                 if(addressType == COMASuplSLPAddress::EIPv6Address )	
       
  3080                     {
       
  3081                     TBuf8<KIPv6Address> ipAddress;
       
  3082                     TInt err = slpIPAddress->IPvAddress(ipAddress);
       
  3083                     if(err == KErrNone)
       
  3084                         slpNewIPAddress->SetIPv6Address(ipAddress);
       
  3085                     }
       
  3086                 }
       
  3087 
       
  3088             iSuplSessionId->SetSLPSessionID(slpNewSessionId);	
       
  3089             }
       
  3090 
       
  3091         ///////////log //////////////////
       
  3092 
       
  3093 #if defined(_DEBUG)  //This is only for logging purpose. 
       
  3094         iTrace->Trace(_L("After UpdateSuplSessionIDL"), KTraceFileName, __LINE__); 		
       
  3095         TBuf<128> msg; 
       
  3096         COMASuplSETSessionID* suplSETID = NULL;
       
  3097         iSuplSessionId->SETSessionID(suplSETID);
       
  3098 
       
  3099         COMASuplSLPSessionID* suplSlpID = NULL;
       
  3100         iSuplSessionId->SLPSessionID(suplSlpID);
       
  3101 
       
  3102         //SET Part			
       
  3103         if(suplSETID)
       
  3104             {
       
  3105             msg.Copy(_L("SET Session ID : "));
       
  3106             TBuf<4> id;	
       
  3107             TInt      SETSessionID;
       
  3108             TBuf8<32> IPvAddress8;
       
  3109             TBuf<32>  ipAddress;
       
  3110             suplSETID->SuplSETSessionID(SETSessionID,IPvAddress8);	
       
  3111 
       
  3112             TLex8 lex(IPvAddress8);
       
  3113             TChar chr;	
       
  3114 
       
  3115             chr = lex.Get();
       
  3116             TUint i = chr;
       
  3117             ipAddress.AppendNum(i);
       
  3118             ipAddress.Append(_L("."));
       
  3119 
       
  3120             chr = lex.Get();
       
  3121             i = chr;
       
  3122             ipAddress.AppendNum(i);
       
  3123             ipAddress.Append(_L("."));
       
  3124 
       
  3125             chr = lex.Get();
       
  3126             i = chr;
       
  3127             ipAddress.AppendNum(i);
       
  3128             ipAddress.Append(_L("."));
       
  3129 
       
  3130             chr = lex.Get();
       
  3131             i = chr;
       
  3132             ipAddress.AppendNum(i);
       
  3133 
       
  3134             id.AppendNum(SETSessionID);
       
  3135             msg.Append(id);
       
  3136             msg.Append(_L("  IPAddress/IMSI :"));
       
  3137             msg.Append(ipAddress);
       
  3138             }
       
  3139         else
       
  3140             {
       
  3141             msg.Copy(_L("SET Session Id is not set."));
       
  3142             }
       
  3143 
       
  3144         iTrace->Trace(msg,KTraceFileName, __LINE__); 							
       
  3145 
       
  3146         //SLP Part			
       
  3147         if(suplSlpID)
       
  3148             {
       
  3149             msg.Copy(_L("SLP Session ID : "));
       
  3150             TBuf8<4> sessionId8;
       
  3151             TBuf<32> sessionId;
       
  3152             TBuf8<64> ipAddress8(_L8("No Address field in SLP Session ID"));				
       
  3153             TBuf<64> ipAddress;
       
  3154 
       
  3155             COMASuplSLPAddress* slpIPAddress = NULL;
       
  3156             suplSlpID->SuplSLPSessionID(sessionId8,slpIPAddress);
       
  3157 
       
  3158             if(slpIPAddress)
       
  3159                 {
       
  3160                 COMASuplSLPAddress::TSuplSLPAddressType addrType = slpIPAddress->SLPAddressType();
       
  3161                 TInt err;
       
  3162                 HBufC8 *fqdnAddr;
       
  3163 
       
  3164                 if (addrType == COMASuplSLPAddress::EFqdn)
       
  3165                     {                                    
       
  3166                     iTrace->Trace(_L("SLP Address is of type FQDN"),KTraceFileName, __LINE__); 								
       
  3167                     err = slpIPAddress->Fqdn(fqdnAddr);	
       
  3168                     }
       
  3169                 else
       
  3170                     {
       
  3171                     iTrace->Trace(_L("SLP Address is of type IPv*"),KTraceFileName, __LINE__); 								
       
  3172                     err = slpIPAddress->IPvAddress(ipAddress8);	
       
  3173                     }                                    
       
  3174 
       
  3175                 if(err != KErrNone)
       
  3176                     {
       
  3177                     msg.Copy(_L("SLP Address is not set."));
       
  3178                     iTrace->Trace(msg,KTraceFileName, __LINE__); 								
       
  3179                     return;
       
  3180                     }
       
  3181                 }
       
  3182 
       
  3183             TLex8 lex(ipAddress8);
       
  3184             TChar chr;	
       
  3185 
       
  3186             chr = lex.Get();
       
  3187             TUint i = chr;
       
  3188             ipAddress.AppendNum(i);
       
  3189             ipAddress.Append(_L("."));
       
  3190 
       
  3191             chr = lex.Get();
       
  3192             i = chr;
       
  3193             ipAddress.AppendNum(i);
       
  3194             ipAddress.Append(_L("."));
       
  3195 
       
  3196             chr = lex.Get();
       
  3197             i = chr;
       
  3198             ipAddress.AppendNum(i);
       
  3199             ipAddress.Append(_L("."));
       
  3200 
       
  3201             chr = lex.Get();
       
  3202             i = chr;
       
  3203             ipAddress.AppendNum(i);
       
  3204 
       
  3205             TLex8 lex1(sessionId8);
       
  3206             for(i = 0; i < 4; ++i)	
       
  3207                 {
       
  3208                 chr = lex1.Get();
       
  3209                 TUint num = chr;
       
  3210                 sessionId.Append(chr);
       
  3211                 }
       
  3212 
       
  3213             msg.Append(sessionId);
       
  3214             msg.Append(_L("  IPAddress : "));
       
  3215             msg.Append(ipAddress);
       
  3216             iTrace->Trace(msg,KTraceFileName, __LINE__); 								
       
  3217 
       
  3218             }
       
  3219         else
       
  3220             {
       
  3221             msg.Copy(_L("SLP Session Id is not set."));
       
  3222             iTrace->Trace(msg,KTraceFileName, __LINE__); 								
       
  3223             }
       
  3224 
       
  3225 #endif
       
  3226         ////////////////////////////////			
       
  3227         }
       
  3228     }
       
  3229 
       
  3230 // -----------------------------------------------------------------------------
       
  3231 // COMASuplSession::UpdateSETSessionID
       
  3232 // Update SET Sesssion ID with received session ID.
       
  3233 // (other items were commented in a header).
       
  3234 // -----------------------------------------------------------------------------
       
  3235 //
       
  3236 void COMASuplSession::UpdateSETSessionIDL(COMASuplSessionID *aSessionID)
       
  3237     {
       
  3238 
       
  3239     iTrace->Trace(_L("Start of COMASuplSession::UpdateSETSessionIDL"), KTraceFileName, __LINE__); 		
       
  3240     if(aSessionID)
       
  3241         {
       
  3242         COMASuplSETSessionID* retrivedSETSessionId = NULL;
       
  3243         aSessionID->SETSessionID(retrivedSETSessionId);
       
  3244 
       
  3245         if(retrivedSETSessionId)
       
  3246             {
       
  3247             COMASuplSETSessionID::TSuplSETIDType addressType = retrivedSETSessionId->SuplSETIDType();
       
  3248 
       
  3249             if(addressType == COMASuplSETSessionID::EIPv4Address)
       
  3250                 {
       
  3251                 TInt sessionUniqueNo;
       
  3252                 TBuf8<KIP4AddressLength>  IPvAddress;
       
  3253                 retrivedSETSessionId->SuplSETSessionID(sessionUniqueNo,IPvAddress);
       
  3254 
       
  3255                 COMASuplSETSessionID* suplSETSessionId = NULL;
       
  3256                 iSuplSessionId->SETSessionID(suplSETSessionId);
       
  3257                 suplSETSessionId->SetSuplSETSessionIDIPv4(sessionUniqueNo,IPvAddress);
       
  3258                 iSessionIDFlag = ETrue;
       
  3259                 }
       
  3260             else if(addressType == COMASuplSETSessionID::EIPv6Address)
       
  3261                 {
       
  3262                 TInt sessionUniqueNo;
       
  3263                 TBuf8<KIP6AddressLength>  IPvAddress;
       
  3264                 retrivedSETSessionId->SuplSETSessionID(sessionUniqueNo,IPvAddress);
       
  3265 
       
  3266                 COMASuplSETSessionID* suplSETSessionId = NULL;
       
  3267                 iSuplSessionId->SETSessionID(suplSETSessionId);
       
  3268                 suplSETSessionId->SetSuplSETSessionIDIPv6(sessionUniqueNo,IPvAddress);
       
  3269                 iSessionIDFlag = ETrue;
       
  3270                 }
       
  3271             else    // IMSI
       
  3272                 {
       
  3273                 TInt sessionUniqueNo;
       
  3274                 TBuf8<KIMSILength>  IMSI;
       
  3275                 retrivedSETSessionId->SuplSETSessionID(sessionUniqueNo, IMSI);
       
  3276 
       
  3277                 COMASuplSETSessionID* suplSETSessionId = NULL;
       
  3278                 iSuplSessionId->SETSessionID(suplSETSessionId);
       
  3279                 suplSETSessionId->SetSuplSETSessionIDIMSI(sessionUniqueNo, IMSI);
       
  3280                 iSessionIDFlag = ETrue;
       
  3281                 }
       
  3282             }
       
  3283         } 
       
  3284     iTrace->Trace(_L("End of COMASuplSession::UpdateSETSessionIDL"), KTraceFileName, __LINE__); 			
       
  3285     }
       
  3286 
       
  3287 // -----------------------------------------------------------------------------
       
  3288 // COMASuplSession::CreateCloneMessageL
       
  3289 // Creates Clone of COMASuplAsnMessageBase
       
  3290 // (other items were commented in a header).
       
  3291 // -----------------------------------------------------------------------------
       
  3292 //
       
  3293 void COMASuplSession::CreateCloneMessageL(COMASuplAsnMessageBase* aDecodedAsnMessage)	
       
  3294     {		
       
  3295     iTrace->Trace(_L("COMASuplSession::CreateCloneMessageL"), KTraceFileName, __LINE__); 		
       
  3296     delete iDecodedAsnMessage; 
       
  3297     iDecodedAsnMessage = NULL;
       
  3298 
       
  3299     COMASuplAsnMessageBase::TSuplMessageType messageType = aDecodedAsnMessage->MessageType();
       
  3300     TInt error;
       
  3301     switch(messageType)
       
  3302         {
       
  3303         case COMASuplAsnMessageBase::ESUPL_START:
       
  3304             iTrace->Trace(_L("COMASuplSession::CreateCloneMessageL : ESUPL_START"), KTraceFileName, __LINE__); 		
       
  3305             iDecodedAsnMessage = COMASuplStart::NewL(); 
       
  3306             iDecodedAsnMessage->Clone(aDecodedAsnMessage,error);
       
  3307             break;
       
  3308         case COMASuplAsnMessageBase::ESUPL_RESPONSE:
       
  3309             iTrace->Trace(_L("COMASuplSession::CreateCloneMessageL : ESUPL_RESPONSE"), KTraceFileName, __LINE__); 		
       
  3310             iDecodedAsnMessage = COMASuplResponse::NewL(); 
       
  3311             iDecodedAsnMessage->Clone(aDecodedAsnMessage,error);
       
  3312             break;
       
  3313         case COMASuplAsnMessageBase::ESUPL_POSINIT:
       
  3314             iTrace->Trace(_L("COMASuplSession::CreateCloneMessageL : ESUPL_POSINIT"), KTraceFileName, __LINE__); 		
       
  3315             iDecodedAsnMessage = COMASuplPosInit::NewL(); 
       
  3316             iDecodedAsnMessage->Clone(aDecodedAsnMessage,error);
       
  3317             break;	                
       
  3318         case COMASuplAsnMessageBase::ESUPL_POS:
       
  3319             iTrace->Trace(_L("COMASuplSession::CreateCloneMessageL : SUPL_POS"), KTraceFileName, __LINE__); 		
       
  3320             iDecodedAsnMessage = COMASuplPos::NewL(); 
       
  3321             iDecodedAsnMessage->Clone(aDecodedAsnMessage,error);
       
  3322             break;
       
  3323 
       
  3324         case COMASuplAsnMessageBase::ESUPL_END:
       
  3325             iTrace->Trace(_L("COMASuplSession::CreateCloneMessageL : ESUPL_END"), KTraceFileName, __LINE__); 		
       
  3326             iDecodedAsnMessage = COMASuplEnd::NewL(); 
       
  3327             iDecodedAsnMessage->Clone(aDecodedAsnMessage,error);
       
  3328             break;
       
  3329         case COMASuplAsnMessageBase::ESUPL_INIT:
       
  3330             iTrace->Trace(_L("COMASuplSession::CreateCloneMessageL : ESUPL_INIT"), KTraceFileName, __LINE__); 		
       
  3331             iDecodedAsnMessage = COMASuplInitVer2::NewL(); 
       
  3332             iDecodedAsnMessage->Clone(aDecodedAsnMessage,error);
       
  3333             break;
       
  3334         case COMASuplAsnMessageBase::ESUPL_AUTH_RESP:
       
  3335             iTrace->Trace(_L("COMASuplSession::CreateCloneMessageL : ESUPL_AUTH_RESP"), KTraceFileName, __LINE__); 		
       
  3336             iDecodedAsnMessage = COMASuplAuthResponse::NewL(); 
       
  3337             iDecodedAsnMessage->Clone(aDecodedAsnMessage,error);
       
  3338             break;
       
  3339         case COMASuplAsnMessageBase::ESUPL_AUTH_REQ:
       
  3340             iTrace->Trace(_L("COMASuplSession::CreateCloneMessageL : ESUPL_AUTH_RESP"), KTraceFileName, __LINE__); 		
       
  3341             iDecodedAsnMessage = COMASuplAuthRequest::NewL(); 
       
  3342             iDecodedAsnMessage->Clone(aDecodedAsnMessage,error);
       
  3343             break;
       
  3344 
       
  3345         case COMASuplAsnMessageBase::ESUPL_TRIG_START:
       
  3346             iTrace->Trace(_L("COMASuplSession::CreateCloneMessageL : ESUPL_TRIG_START"), KTraceFileName, __LINE__);
       
  3347             iDecodedAsnMessage = COMASuplTriggeredStart::NewL(); 
       
  3348             iDecodedAsnMessage->Clone(aDecodedAsnMessage,error);
       
  3349             break;
       
  3350 
       
  3351         case COMASuplAsnMessageBase::ESUPL_TRIG_RESPONSE:
       
  3352             iTrace->Trace(_L("COMASuplSession::CreateCloneMessageL:ESUPL_TRIG_RESPONSE"), KTraceFileName, __LINE__);
       
  3353             iDecodedAsnMessage = COMASuplTriggeredResponse::NewL(); 
       
  3354             iDecodedAsnMessage->Clone(aDecodedAsnMessage,error);
       
  3355             break;
       
  3356 
       
  3357         case COMASuplAsnMessageBase::ESUPL_TRIG_STOP:
       
  3358             iTrace->Trace(_L("COMASuplSession::CreateCloneMessageL:ESUPL_TRIG_STOP"), KTraceFileName, __LINE__);
       
  3359             iDecodedAsnMessage = COMASuplTriggeredStop::NewL(); 
       
  3360             iDecodedAsnMessage->Clone(aDecodedAsnMessage,error);
       
  3361             break;
       
  3362 
       
  3363         case COMASuplAsnMessageBase::ESUPL_REPORT:
       
  3364             iTrace->Trace(_L("COMASuplSession::CreateCloneMessageL:ESUPL_REPORT"), KTraceFileName, __LINE__);
       
  3365             iDecodedAsnMessage = COMASuplReport::NewL(); 
       
  3366             iDecodedAsnMessage->Clone(aDecodedAsnMessage,error);
       
  3367             break;
       
  3368         default:
       
  3369             break;	
       
  3370         }
       
  3371     }
       
  3372 
       
  3373 // -----------------------------------------------------------------------------
       
  3374 // COMASuplSession::CancelSession
       
  3375 // Cancels an in-progress RunSession on the Session
       
  3376 // What action to be taken for cancelRunSession will be depend on State of session.
       
  3377 // (other items were commented in a header).
       
  3378 // -----------------------------------------------------------------------------
       
  3379 //	
       
  3380 void COMASuplSession::CancelSession()
       
  3381     {
       
  3382     iTrace->Trace(_L("COMASuplSession::CancelSession"), KTraceFileName, __LINE__); 		
       
  3383     CancelAllOperations();
       
  3384     iConnRequestor->CancelReadOperation();
       
  3385 
       
  3386     switch(iSuplSessionState)
       
  3387         {
       
  3388         case ESUPL_INITIALIZED:
       
  3389         case ESUPL_CONNECTING:
       
  3390         case ESUPL_SESSION_ERROR:
       
  3391             {
       
  3392             iSuplSessionState = ESUPL_SESSION_ERROR;
       
  3393             break;
       
  3394             }
       
  3395 
       
  3396         case ESUPL_RECEIVED:
       
  3397             {	
       
  3398             if (iSuplMsgType == ESUPL_TRIG_RESPONSE)                            
       
  3399                 {
       
  3400                 }
       
  3401             else
       
  3402                 {                        
       
  3403                 iSuplSessionState = ESUPL_SESSION_ERROR;
       
  3404                 if(iSuplMsgType == ESUPL_END)
       
  3405                     {
       
  3406                     if(iOMASuplPOSRequestor)
       
  3407                         iOMASuplPOSRequestor->Cancel();
       
  3408                     }
       
  3409                 }
       
  3410             break;
       
  3411             }
       
  3412 
       
  3413         case ESUPL_GENERATE:
       
  3414         case ESUPL_ENCODE:
       
  3415             {
       
  3416             if(iSuplMsgType == ESUPL_START)	//No need to send SUPL_END to SLP
       
  3417                 {
       
  3418                 iSuplSessionState = ESUPL_SESSION_ERROR;
       
  3419                 break;
       
  3420                 }
       
  3421             }
       
  3422         case ESUPL_SEND:
       
  3423             {
       
  3424             iErrorStatusCode = COMASuplEnd::EUnspecified;
       
  3425             iSuplSessionState = ESUPL_GENERATE;
       
  3426             iSuplMsgType = ESUPL_END;
       
  3427             if(iOMASuplPOSRequestor) //Reset observer
       
  3428                 {
       
  3429                 iOMASuplPOSRequestor->SetObserver(NULL);	
       
  3430                 }
       
  3431             TRAP_IGNORE(GenerateSuplMessageL());				
       
  3432             //iSuplSessionState = ESUPL_SESSION_ERROR; Cancel Bug
       
  3433             break;
       
  3434             }
       
  3435         default: break;
       
  3436         }
       
  3437     }
       
  3438 
       
  3439 // -----------------------------------------------------------------------------
       
  3440 // COMASuplSession::CancelRunSession
       
  3441 // Cancels an in-progress RunSession on the Session
       
  3442 // What action to be taken for cancelRunSession will be depend on State of session.
       
  3443 // (other items were commented in a header).
       
  3444 // -----------------------------------------------------------------------------
       
  3445 //	
       
  3446 void COMASuplSession::CancelRunSession()
       
  3447     {
       
  3448     CancelSession();
       
  3449     if(iSuplSessionState == ESUPL_SEND)
       
  3450         {
       
  3451         CompleteSession(KErrCancel);
       
  3452         }
       
  3453     else
       
  3454         {
       
  3455         //Close Connection : bug Fix.
       
  3456         iConnRequestor->CloseConnection();
       
  3457         iPortNum = 0;
       
  3458         iSessionObserver.TerminateSession(this, KErrCancel);	
       
  3459         }
       
  3460     }
       
  3461 
       
  3462 // -----------------------------------------------------------------------------
       
  3463 // COMASuplSession::HandleGenerationErrorL
       
  3464 // Cancels an in-progress RunSession on the Session
       
  3465 // What action to be taken for cancelRunSession will be depend on State of session.
       
  3466 // (other items were commented in a header).
       
  3467 // -----------------------------------------------------------------------------
       
  3468 //	
       
  3469 void COMASuplSession::HandleGenerationErrorL(TInt aErr)
       
  3470     {
       
  3471     TBool cancelSendRequestor  = ETrue;
       
  3472     if(iSuplState)
       
  3473         {
       
  3474         switch(iSuplState->GetSuplState())
       
  3475             {
       
  3476             case COMASuplState::ESUPL_START:
       
  3477                 {
       
  3478                 break;
       
  3479                 }
       
  3480             case COMASuplState::ESUPL_POS:
       
  3481             case COMASuplState::ESUPL_POS_INIT:
       
  3482                 {
       
  3483                 iErrorStatusCode = COMASuplEnd::EUnspecified;
       
  3484                 if(aErr == KErrSuplposMethodMismatch)
       
  3485                     iErrorStatusCode = COMASuplEnd::EPosProtocolMismatch;//COMASuplEnd::EPosMethodMismatch;
       
  3486                 cancelSendRequestor = EFalse;
       
  3487                 iSuplSessionState = ESUPL_GENERATE;
       
  3488                 iSuplMsgType = ESUPL_END;
       
  3489                 GenerateSuplMessageL();
       
  3490                 break;		
       
  3491                 }
       
  3492             case COMASuplState::ESUPL_END:
       
  3493                 {
       
  3494                 //Close Connection : bug Fix.
       
  3495                 iConnRequestor->CloseConnection();
       
  3496                     iPortNum = 0;
       
  3497                 iSessionObserver.TerminateSession(this, aErr);
       
  3498                 cancelSendRequestor = EFalse;
       
  3499                 break;
       
  3500                 }
       
  3501             default: break;
       
  3502             }
       
  3503         }
       
  3504 
       
  3505     if(cancelSendRequestor)
       
  3506         {
       
  3507         CancelAllOperations();
       
  3508         CleanUp();
       
  3509         CompleteSession(aErr);
       
  3510         }
       
  3511 
       
  3512     }
       
  3513 // -----------------------------------------------------------------------------
       
  3514 // COMASuplSession::HandleInitilizationErrorL
       
  3515 // Cancels an in-progress RunSession on the Session
       
  3516 // What action to be taken for cancelRunSession will be depend on State of session.
       
  3517 // (other items were commented in a header).
       
  3518 // -----------------------------------------------------------------------------
       
  3519 //		
       
  3520 void COMASuplSession::HandleInitilizationErrorL(TInt aErr)
       
  3521     {
       
  3522     CancelAllOperations();
       
  3523     CleanUp();
       
  3524     CompleteSession(aErr);
       
  3525     }
       
  3526 	
       
  3527 // -----------------------------------------------------------------------------
       
  3528 // COMASuplSession::HandleConnectionErrorL
       
  3529 // Cancels an in-progress RunSession on the Session
       
  3530 // What action to be taken for cancelRunSession will be depend on State of session.
       
  3531 // (other items were commented in a header).
       
  3532 // -----------------------------------------------------------------------------
       
  3533 //	
       
  3534 void COMASuplSession::HandleConnectionErrorL(TInt aErr)
       
  3535     {
       
  3536     CancelAllOperations();
       
  3537     //Close Connection
       
  3538     iConnRequestor->CloseConnection();
       
  3539         iPortNum = 0;
       
  3540     iSessionObserver.TerminateSession(this, aErr);
       
  3541     }
       
  3542 	
       
  3543 // -----------------------------------------------------------------------------
       
  3544 // COMASuplSession::HandleEncodingErrorL
       
  3545 // Cancels an in-progress RunSession on the Session
       
  3546 // What action to be taken for cancelRunSession will be depend on State of session.
       
  3547 // (other items were commented in a header).
       
  3548 // -----------------------------------------------------------------------------
       
  3549 //	
       
  3550 void COMASuplSession::HandleEncodingErrorL(TInt aErr)
       
  3551     {
       
  3552     TBool cancelSendRequestor  = ETrue;
       
  3553     if(iSuplState)
       
  3554         {
       
  3555         iErrorStatusCode = COMASuplEnd::EUnspecified;					
       
  3556 
       
  3557         if(aErr == KErrOMASETCapMisMatch )
       
  3558             {
       
  3559             iErrorStatusCode = COMASuplEnd::EPosMethodMismatch;
       
  3560             iFailedCaps = iAllowedCapabilities;
       
  3561             iCapsFail = ETrue;
       
  3562             }
       
  3563 
       
  3564         if(aErr == KErrSuplposMethodMismatch)
       
  3565             {
       
  3566             iErrorStatusCode = COMASuplEnd::EPosProtocolMismatch;
       
  3567             }
       
  3568         if(aErr == KErrOMAManParamMissing)
       
  3569             {
       
  3570             iErrorStatusCode = COMASuplEnd::EDataMissing;
       
  3571             }
       
  3572 
       
  3573         if(aErr == KErrArgument)
       
  3574             {
       
  3575             iErrorStatusCode = COMASuplEnd::EUnexpectedDataValue;
       
  3576             }
       
  3577 
       
  3578         if(aErr == KErrOMASuplPosInfo || aErr == KErrOMASuplPosInActive || aErr == KErrOMASuplDataMissing)
       
  3579             {
       
  3580             iErrorStatusCode = COMASuplEnd::EDataMissing;
       
  3581             }
       
  3582 
       
  3583         switch(iSuplState->GetSuplState())
       
  3584             {
       
  3585             case COMASuplState::ESUPL_START:break;
       
  3586             case COMASuplState::ESUPL_POS: 
       
  3587                 {
       
  3588                 //This is for,even though we gets error(no pos payload data) for first POS message from plugin
       
  3589                 // Just ignore it ... Don't put new pending request for POS message plugin.
       
  3590                 if(iIsFirstPOSMessage && ( aErr == KErrOMAManParamMissing || aErr ==  KErrOMASuplParamNotSet || aErr == KErrOMASuplPosInfo))
       
  3591                     {
       
  3592                     iTrace->Trace(_L("Failed to Generate First messsage from POS...still continueing.."), KTraceFileName, __LINE__); 		
       
  3593                     iIsFirstPOSMessage = EFalse;
       
  3594                     return;
       
  3595                     }
       
  3596                 }
       
  3597             case COMASuplState::ESUPL_POS_INIT:
       
  3598                 {
       
  3599                 cancelSendRequestor = EFalse;
       
  3600                 iSuplSessionState = ESUPL_GENERATE;
       
  3601                 iSuplMsgType = ESUPL_END;
       
  3602                 GenerateSuplMessageL();
       
  3603                 break;			
       
  3604                 }
       
  3605 
       
  3606             case COMASuplState::ESUPL_END:
       
  3607                 {
       
  3608                 iConnRequestor->CloseConnection();
       
  3609                     iPortNum = 0;
       
  3610                 iSessionObserver.TerminateSession(this, KErrGeneral);
       
  3611                 return;
       
  3612                 }
       
  3613 
       
  3614             default: break;
       
  3615             }
       
  3616         }
       
  3617 
       
  3618     if(cancelSendRequestor)
       
  3619         {
       
  3620         CancelAllOperations();
       
  3621         CleanUp();
       
  3622         CompleteSession(KErrGeneral);
       
  3623         }
       
  3624 
       
  3625     }
       
  3626 // -----------------------------------------------------------------------------
       
  3627 // COMASuplSession::HandleSendErrorL
       
  3628 // Cancels an in-progress RunSession on the Session
       
  3629 // What action to be taken for cancelRunSession will be depend on State of session.
       
  3630 // (other items were commented in a header).
       
  3631 // -----------------------------------------------------------------------------
       
  3632 //		
       
  3633 void COMASuplSession::HandleSendErrorL(TInt aErr)
       
  3634     {
       
  3635     // if error code is KErrDisconnected, then close connection
       
  3636     // and set the state accordingly            
       
  3637     if (aErr == KErrDisconnected)
       
  3638         {
       
  3639 		//Close Connection
       
  3640 		iConnRequestor->CloseConnection();
       
  3641 		iSessionObserver.TerminateSession(this, aErr);
       
  3642         iDisconnected = ETrue;
       
  3643         }
       
  3644     else
       
  3645         {                
       
  3646     TBool cancelSendRequestor  = ETrue;
       
  3647     if(aErr == KErrTimedOut)				
       
  3648         {
       
  3649         iErrorStatusCode = COMASuplEnd::EUnspecified;
       
  3650         cancelSendRequestor = EFalse;
       
  3651         iSuplSessionState = ESUPL_GENERATE;
       
  3652         iSuplMsgType = ESUPL_END;
       
  3653         GenerateSuplMessageL();				
       
  3654         }
       
  3655 
       
  3656     if(aErr == KErrSuplposMethodMismatch)				 
       
  3657         {
       
  3658         iErrorStatusCode = COMASuplEnd::EPosProtocolMismatch;
       
  3659         cancelSendRequestor = EFalse;
       
  3660         iSuplSessionState = ESUPL_GENERATE;
       
  3661         iSuplMsgType = ESUPL_END;
       
  3662         GenerateSuplMessageL();				
       
  3663         }
       
  3664 
       
  3665     aErr = KErrCompletion;
       
  3666 
       
  3667     if(cancelSendRequestor)
       
  3668         {
       
  3669         CancelAllOperations();
       
  3670         CleanUp();
       
  3671         CompleteSession(aErr);
       
  3672 		}
       
  3673     }
       
  3674 
       
  3675     }
       
  3676 // -----------------------------------------------------------------------------
       
  3677 // COMASuplSession::HandlePacketsErrorL
       
  3678 // HandlePacketsErrorL
       
  3679 // 
       
  3680 // (other items were commented in a header).
       
  3681 // -----------------------------------------------------------------------------
       
  3682 //		
       
  3683 void COMASuplSession::HandlePacketsErrorL(TInt aErr)
       
  3684     {
       
  3685     TBool cancelSendRequestor  = ETrue;
       
  3686 
       
  3687     if(iSuplMsgType == ESUPL_INIT)
       
  3688         {
       
  3689         HandleSuplInitErrorL(aErr);
       
  3690         return;
       
  3691         }
       
  3692 
       
  3693     if(aErr == KErrSuplEndProtocolError )
       
  3694         {
       
  3695         aErr = KErrCompletion;
       
  3696         switch(iSuplMsgType)
       
  3697             {
       
  3698             case ESUPL_START: 
       
  3699             case ESUPL_RESPONSE:
       
  3700             case ESUPL_END:
       
  3701                 {
       
  3702                 //Close Connection
       
  3703                 iConnRequestor->CloseConnection();
       
  3704                 iPortNum = 0;
       
  3705                 iSessionObserver.TerminateSession(this, aErr);
       
  3706                 break;
       
  3707                 }
       
  3708             case ESUPL_REPORT: 
       
  3709                 {
       
  3710                 //Close Connection
       
  3711                 iConnRequestor->CloseConnection();
       
  3712                 break;
       
  3713                 }
       
  3714             default: break;
       
  3715             }
       
  3716         }
       
  3717 
       
  3718     if(aErr == KErrOMASuplProtocolError )
       
  3719         {
       
  3720         aErr = KErrCompletion;
       
  3721         switch(iSuplMsgType)
       
  3722             {
       
  3723             case ESUPL_START: 
       
  3724             case ESUPL_INIT:
       
  3725             case ESUPL_POS:
       
  3726             case ESUPL_RESPONSE:
       
  3727             case ESUPL_POSINIT:
       
  3728             case ESUPL_TRIG_START:    
       
  3729             case ESUPL_AUTH_RESP:
       
  3730                 {
       
  3731                 iErrorStatusCode = COMASuplEnd::EUnexpectedMessage;
       
  3732                 cancelSendRequestor = EFalse;
       
  3733                 iSuplSessionState = ESUPL_GENERATE;
       
  3734                 iSuplMsgType = ESUPL_END;
       
  3735                 GenerateSuplMessageL();				
       
  3736                 break;			
       
  3737                 }
       
  3738 
       
  3739             case ESUPL_END:
       
  3740                 {
       
  3741                 //Close Connection
       
  3742                 iConnRequestor->CloseConnection();
       
  3743                 iPortNum = 0;
       
  3744                 iSessionObserver.TerminateSession(this, aErr);
       
  3745                 break;
       
  3746                 }
       
  3747 
       
  3748             default: break;
       
  3749             }
       
  3750         }
       
  3751 
       
  3752     if( aErr == KErrOMANonProxyModeNotSupported) //aErr == KErrOMASuplVersionNotMatching ||
       
  3753         {
       
  3754         iErrorStatusCode = COMASuplEnd::ENonProxyModeNotSupported;
       
  3755 
       
  3756         aErr = KErrCompletion;
       
  3757 
       
  3758         if(iSuplState)
       
  3759             {
       
  3760             switch(iSuplState->GetSuplState())
       
  3761                 {
       
  3762                 case COMASuplState::ESUPL_RESPONSE:
       
  3763                     {
       
  3764                     cancelSendRequestor = EFalse;
       
  3765                     iSuplSessionState = ESUPL_GENERATE;
       
  3766                     iSuplMsgType = ESUPL_END;
       
  3767                     GenerateSuplMessageL();
       
  3768                     break;
       
  3769                     }
       
  3770                 default: break;
       
  3771                 }
       
  3772             }
       
  3773         }
       
  3774 
       
  3775     if(cancelSendRequestor)
       
  3776         {
       
  3777         CancelAllOperations();
       
  3778         CleanUp();
       
  3779         CompleteSession(aErr);
       
  3780         }
       
  3781     }
       
  3782 
       
  3783 // -----------------------------------------------------------------------------
       
  3784 // COMASuplSession::HandleSuplInitErrorL
       
  3785 // Handle Init related error
       
  3786 // (other items were commented in a header).
       
  3787 // -----------------------------------------------------------------------------
       
  3788 //
       
  3789 void COMASuplSession::HandleSuplInitErrorL(TInt aErr)
       
  3790     {
       
  3791     iTrace->Trace(_L("Start COMASuplSession::HandleSuplInitError"), KTraceFileName, __LINE__); 
       
  3792 
       
  3793     if(aErr == KErrOMAInvalidHSLPAddress)
       
  3794         {
       
  3795         iTrace->Trace(_L("COMASuplSession::HandleSuplInitError HSLP Address is not matching..."), KTraceFileName, __LINE__);
       
  3796         //Close Connection : bug Fix.
       
  3797         iConnRequestor->CloseConnection();
       
  3798                 iPortNum = 0;
       
  3799         iSessionObserver.TerminateSession(this, KErrCompletion);
       
  3800         return;
       
  3801         }
       
  3802 
       
  3803     TBool setStatusCode = ETrue;
       
  3804 
       
  3805 
       
  3806     if(aErr == KErrSuplInvalidSessionID)
       
  3807         {
       
  3808         iTrace->Trace(_L("COMASuplSession::HandleSuplInitError Received SET Session ID"), KTraceFileName, __LINE__);
       
  3809         iErrorStatusCode = COMASuplEnd::EInvalidSessionId;	
       
  3810 
       
  3811         COMASuplSessionID* retrivedSessionID = NULL;
       
  3812         iDecodedAsnMessage->SessionId(retrivedSessionID);
       
  3813 
       
  3814         // Set the SessionId.
       
  3815         iTrace->Trace(_L("COMASuplSession::HandleSuplInitError Update SET Session ID"), KTraceFileName, __LINE__);
       
  3816         UpdateSETSessionIDL(retrivedSessionID);
       
  3817 
       
  3818         }
       
  3819 
       
  3820     if(aErr == KErrOMANonProxyModeNotSupported)
       
  3821         {
       
  3822         iTrace->Trace(_L("COMASuplSession::HandleSuplInitError Received Nonproxymode data"), KTraceFileName, __LINE__);
       
  3823         iErrorStatusCode = COMASuplEnd::ENonProxyModeNotSupported;	
       
  3824         }
       
  3825 
       
  3826     if(KErrAccessDenied == aErr || KErrOMASuplDenied == aErr)
       
  3827         {
       
  3828         iTrace->Trace(_L("COMASuplSession::HandleSuplInitError KErrAccessDenied|| KErrOMASuplDenied"), KTraceFileName, __LINE__);
       
  3829         iErrorStatusCode = COMASuplEnd::EConsentDeniedByUser;	
       
  3830         }
       
  3831 
       
  3832     if(aErr == KErrOMASuplNoPosition || KErrOMASuplInformationOnly == aErr)
       
  3833         {
       
  3834         //Supl End with No Position
       
  3835         iTrace->Trace(_L("COMASuplSession::HandleSuplInitError KErrOMASuplNoPosition || KErrOMASuplInformationOnly"), KTraceFileName, __LINE__);
       
  3836         setStatusCode = EFalse;
       
  3837         }
       
  3838 
       
  3839     if(KErrOMASuplAccepted == aErr)
       
  3840         {
       
  3841         iTrace->Trace(_L("COMASuplSession::HandleSuplInitError EConsentGrantedByUser"), KTraceFileName, __LINE__);
       
  3842         iErrorStatusCode = COMASuplEnd::EConsentGrantedByUser;	
       
  3843         }
       
  3844 
       
  3845     if (KErrSuplServiceNotSupported == aErr)    
       
  3846         {
       
  3847         iTrace->Trace(_L("COMASuplSession::HandleSuplInitError E"), KTraceFileName, __LINE__);
       
  3848         iErrorStatusCode = COMASuplEnd::EVer2ServiceNotSupported;	
       
  3849         }
       
  3850     TInt len = iHSLPAddress.Length();
       
  3851     HBufC8 *hslpAdress = NULL;
       
  3852     if(len > 0)
       
  3853         {
       
  3854         hslpAdress = HBufC8::NewL(iHSLPAddress.Length());
       
  3855         hslpAdress->Des().Copy(iHSLPAddress);
       
  3856         }
       
  3857 
       
  3858     else if(len ==0)
       
  3859         {
       
  3860         iTrace->Trace(_L("HSLP generated frm IMSI"), KTraceFileName, __LINE__);
       
  3861         hslpAdress = HBufC8::NewL(iSuplSettings->SLPAddressfromImsi().Length());
       
  3862         CleanupStack::PushL(hslpAdress);
       
  3863         hslpAdress->Des().Copy(iSuplSettings->SLPAddressfromImsi());
       
  3864         CleanupStack::Pop(hslpAdress);	
       
  3865 
       
  3866         }
       
  3867     CleanupStack::PushL(hslpAdress);
       
  3868 
       
  3869     delete iSuplState;
       
  3870     iSuplState = NULL;
       
  3871 
       
  3872     if(setStatusCode)
       
  3873         {
       
  3874         iSuplState = COMASuplEndState::NewL(iErrorStatusCode,iOMASuplAsnHandlerBaseImpl,iEncodedSuplInit,hslpAdress);		
       
  3875         }
       
  3876     else
       
  3877         {
       
  3878         iSuplState = COMASuplEndState::NewL(iOMASuplAsnHandlerBaseImpl,iEncodedSuplInit,hslpAdress );
       
  3879         } 		
       
  3880 
       
  3881     CleanupStack::PopAndDestroy(hslpAdress);
       
  3882 
       
  3883     iTrace->Trace(_L("COMASuplSession::HandleSuplInitError Send SUPL_END for SUPL_INIT"), KTraceFileName, __LINE__);
       
  3884 
       
  3885 	
       
  3886     iSuplSessionState = ESUPL_INITIALIZED;
       
  3887     iSuplState->SetMsgStateObserver(this);
       
  3888     iSuplMsgType = ESUPL_END;
       
  3889     SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplCreating);	
       
  3890     iSuplState->GenerateMessageL();
       
  3891     iSuplSessionState = ESUPL_GENERATE;
       
  3892     }
       
  3893 
       
  3894 // -----------------------------------------------------------------------------
       
  3895 // COMASuplSession::HandleInvalidParameterErrorL
       
  3896 // Handles error occured related invalid parameter.
       
  3897 // (other items were commented in a header).
       
  3898 // -----------------------------------------------------------------------------
       
  3899 //
       
  3900 void COMASuplSession::HandleInvalidParameterErrorL(COMASuplAsnMessageBase* aDecodedAsnMessage)
       
  3901     {
       
  3902     iTrace->Trace(_L("COMASuplSession::HandleInvalidParameterErrorL"), KTraceFileName, __LINE__);
       
  3903     if(CheckProtocolVersionL(aDecodedAsnMessage)) //Checks version with supported version
       
  3904         {
       
  3905         COMASuplAsnMessageBase::TSuplMessageType messageType = aDecodedAsnMessage->MessageType();
       
  3906         CancelAllOperations();	
       
  3907         if(messageType == COMASuplAsnMessageBase::ESUPL_END)
       
  3908             {
       
  3909             //Close Connection : bug Fix.
       
  3910             iConnRequestor->CloseConnection();
       
  3911             iPortNum = 0;
       
  3912             iSessionObserver.TerminateSession(this, KErrCompletion);
       
  3913             }
       
  3914         else
       
  3915             {
       
  3916 
       
  3917             iErrorStatusCode = COMASuplEnd::EUnexpectedDataValue;
       
  3918 
       
  3919             if((messageType == COMASuplAsnMessageBase::ESUPL_POSINIT || 
       
  3920                     messageType == COMASuplAsnMessageBase::ESUPL_START || 
       
  3921                     messageType == COMASuplAsnMessageBase::ESUPL_RESPONSE) 
       
  3922                     && (iRequestType == ESUPL_NETWORK))
       
  3923                 {
       
  3924                 iErrorStatusCode = COMASuplEnd::EUnexpectedMessage;
       
  3925                 }
       
  3926 
       
  3927             if(iRequestType == ESUPL_TERMINAL )					//Protocol errors
       
  3928                 {
       
  3929                 if( !	(iSuplMsgType == ESUPL_START && messageType == COMASuplAsnMessageBase::ESUPL_RESPONSE)
       
  3930                         || 				
       
  3931                         (iSuplMsgType == ESUPL_POSINIT && messageType == COMASuplAsnMessageBase::ESUPL_POS)
       
  3932                 )		
       
  3933 
       
  3934                     {
       
  3935                     iErrorStatusCode = COMASuplEnd::EUnexpectedMessage;
       
  3936                     }
       
  3937                 }
       
  3938 
       
  3939             iSuplSessionState = ESUPL_GENERATE;
       
  3940             iSuplMsgType = ESUPL_END;
       
  3941             GenerateSuplMessageL();				
       
  3942             }
       
  3943         }	
       
  3944     }
       
  3945 // -----------------------------------------------------------------------------
       
  3946 // COMASuplSession::TerminateSession
       
  3947 // Terminates session
       
  3948 // (other items were commented in a header).
       
  3949 // -----------------------------------------------------------------------------
       
  3950 //
       
  3951 void COMASuplSession::TerminateSession()
       
  3952     {
       
  3953     iTrace->Trace(_L("COMASuplSession::TerminateSession"), KTraceFileName, __LINE__);
       
  3954     if(iSuplSessionState != ESUPL_SESSION_ERROR)
       
  3955         {
       
  3956         CancelRunSession();
       
  3957         }
       
  3958     else
       
  3959         {
       
  3960         SessionEnd();
       
  3961         CompleteSession(KErrCancel);
       
  3962         }
       
  3963     return;
       
  3964     }
       
  3965 
       
  3966 // -----------------------------------------------------------------------------
       
  3967 // COMASuplSession::SuplVersion
       
  3968 // returns SUPL Version
       
  3969 // (other items were commented in a header).
       
  3970 // -----------------------------------------------------------------------------
       
  3971 //
       
  3972 TReal COMASuplSession::SuplVersion() 
       
  3973     {
       
  3974     return KSuplPOSPluginVersion;
       
  3975     }
       
  3976 
       
  3977 // -----------------------------------------------------------------------------
       
  3978 // COMASuplSession::SetPOSMsgPluginState
       
  3979 // Informs Protocol state to POS if present
       
  3980 // (other items were commented in a header).
       
  3981 // -----------------------------------------------------------------------------
       
  3982 //	
       
  3983 void COMASuplSession::SetPOSMsgPluginState(COMASuplPosSessionBase::TOMASuplMsgState aSuplMsgState)
       
  3984     {
       
  3985     if(iPOSSession != NULL)
       
  3986         {
       
  3987         iTrace->Trace(_L("Setting State of POS Msg Plugin"), KTraceFileName, __LINE__); 															
       
  3988 
       
  3989         COMASuplPosSessionBase::TOMASuplMsg SuplMsg = COMASuplPosSessionBase::EOMASuplStart;
       
  3990 
       
  3991         switch(iSuplMsgType) 
       
  3992             {
       
  3993             case ESUPL_START:
       
  3994                 SuplMsg = COMASuplPosSessionBase::EOMASuplStart;	
       
  3995                 break;
       
  3996             case ESUPL_RESPONSE:
       
  3997                 SuplMsg = COMASuplPosSessionBase::EOMASuplResponse;	
       
  3998                 break;			
       
  3999             case ESUPL_INIT:
       
  4000                 SuplMsg = COMASuplPosSessionBase::EOMASuplInit;	
       
  4001                 break;			
       
  4002             case ESUPL_POSINIT:
       
  4003                 SuplMsg = COMASuplPosSessionBase::EOMASuplPosInit;	
       
  4004                 break;			
       
  4005             case ESUPL_POS:
       
  4006                 SuplMsg = COMASuplPosSessionBase::EOMASuplPos;	
       
  4007                 break;			
       
  4008             case ESUPL_END:
       
  4009                 SuplMsg = COMASuplPosSessionBase::EOMASuplEnd;				
       
  4010                 break;			
       
  4011             default:			
       
  4012                 break;
       
  4013             }
       
  4014 
       
  4015         iPOSSession->SetSuplState(SuplMsg,aSuplMsgState); 
       
  4016         }
       
  4017 
       
  4018     }
       
  4019 // -----------------------------------------------------------------------------
       
  4020 // COMASuplSession::IsLastPOSMessage
       
  4021 // Checks about last POS message with POS handler
       
  4022 // (other items were commented in a header).
       
  4023 // -----------------------------------------------------------------------------
       
  4024 //	
       
  4025 TBool COMASuplSession::IsLastPOSMessage()
       
  4026     {
       
  4027     if( iPOSSession && iSuplState)
       
  4028         {
       
  4029         COMASuplPosState* state =  static_cast <COMASuplPosState *>(iSuplState);
       
  4030         TBool ret = state->IsLastMessage();
       
  4031         return ret;
       
  4032         }
       
  4033     else 
       
  4034         {
       
  4035         return EFalse;	
       
  4036         }
       
  4037     }
       
  4038 // -----------------------------------------------------------------------------
       
  4039 // COMASuplSession::IsSegmentedDone()
       
  4040 // Checks about segmentation of pospayload
       
  4041 // (other items were commented in a header).
       
  4042 // -----------------------------------------------------------------------------
       
  4043 //	
       
  4044 TBool COMASuplSession::IsSegmentationDone()
       
  4045     {
       
  4046     if( iPOSSession && iSuplState)
       
  4047         {
       
  4048         COMASuplPosState* state =  static_cast <COMASuplPosState *>(iSuplState);
       
  4049         TBool ret = state->IsSegmentationDone();
       
  4050         return ret;
       
  4051         }
       
  4052     else 
       
  4053         {
       
  4054         return EFalse;	
       
  4055         }
       
  4056     }
       
  4057 
       
  4058 
       
  4059 // -----------------------------------------------------------------------------
       
  4060 // COMASuplSession::CopySETCapabilities
       
  4061 // (other items were commented in a header).
       
  4062 // -----------------------------------------------------------------------------
       
  4063 void COMASuplSession::CopySETCapabilities()	 
       
  4064     {
       
  4065     if(iSuplMsgType == ESUPL_START)
       
  4066         {
       
  4067         COMASuplStartState *startState = static_cast <COMASuplStartState *>(iSuplState);
       
  4068         COMASuplSETCapabilities *setCaps = startState->Capabilities();
       
  4069 
       
  4070         TOMASuplPosTechnology posTech;
       
  4071         COMASuplSETCapabilities::TOMASuplPrefMethod prefMethod;
       
  4072         TOMASuplPosProtocol posProtocol;
       
  4073 
       
  4074         setCaps->GetSETCapabilities(posTech,prefMethod,posProtocol);
       
  4075 
       
  4076         iSETCapabilities->SetSETCapabilities(posTech,prefMethod, posProtocol);
       
  4077         }
       
  4078 
       
  4079     if (iTriggerSession && iSuplMsgType == ESUPL_TRIG_START)
       
  4080         {
       
  4081         COMASuplTriggerStartState *trgStartState = static_cast <COMASuplTriggerStartState *>(iSuplState);
       
  4082         COMASuplSETCapabilities *setCaps = trgStartState->Capabilities();
       
  4083 
       
  4084         TOMASuplPosTechnology posTech;
       
  4085         COMASuplSETCapabilities::TOMASuplPrefMethod prefMethod;
       
  4086         TOMASuplPosProtocol posProtocol;
       
  4087 
       
  4088         setCaps->GetSETCapabilities(posTech,prefMethod,posProtocol);
       
  4089 
       
  4090         iSETCapabilities->SetSETCapabilities(posTech,prefMethod, posProtocol);
       
  4091         }
       
  4092 
       
  4093     if(iSuplMsgType == ESUPL_POSINIT && iRequestType == ESUPL_NETWORK && !iTriggerSession)
       
  4094         {
       
  4095         TOMASuplPosTechnology posTechnology;
       
  4096         COMASuplSETCapabilities::TOMASuplPrefMethod    prefMethod;
       
  4097         TOMASuplPosProtocol   posProtocol;
       
  4098 
       
  4099         TBool  GpsSETAssisted 	= EFalse;
       
  4100         TBool  GpsSETBased 		= EFalse;
       
  4101         TBool  AutonomousGps 	= EFalse;
       
  4102         TBool  FLT 			 	= EFalse;
       
  4103         TBool  eOTD 		 	= EFalse;
       
  4104         TBool  oTDOA 		 	= EFalse;
       
  4105 
       
  4106         TBool TIA801 = EFalse;
       
  4107         TBool RRLP = EFalse;
       
  4108         TBool RRC =  EFalse;
       
  4109 
       
  4110         posTechnology.SetPosTechnology(GpsSETAssisted,GpsSETBased,AutonomousGps,FLT,
       
  4111                 eOTD,oTDOA);
       
  4112         posProtocol.SetPosProtocol(TIA801,RRLP,RRC);
       
  4113         prefMethod = COMASuplSETCapabilities::EOMANoPreferred; 
       
  4114         iSETCapabilities->SetSETCapabilities(posTechnology,prefMethod,posProtocol);	
       
  4115         }
       
  4116     }
       
  4117 
       
  4118 // -----------------------------------------------------------------------------
       
  4119 // COMASuplSession::PrivacyCheckCompleteL
       
  4120 // (other items were commented in a header).
       
  4121 // -----------------------------------------------------------------------------
       
  4122 void COMASuplSession::PrivacyCheckCompleteL(TInt aCompletionCode)
       
  4123     {
       
  4124     if(aCompletionCode == KErrNone)
       
  4125         {
       
  4126         iTrace->Trace(_L("COMASuplSession::PrivacyCheckCompleteL No Error"), KTraceFileName, __LINE__);
       
  4127 				static_cast<COMASuplInitState*>(iSuplState)->GetRequestorIDAndName(iRequestID,iRequestorName);  
       
  4128 				static_cast<COMASuplInitState*>(iSuplState)->GetPrivacyStatus(iPrivacyOverride); 
       
  4129 				static_cast<COMASuplInitState*>(iSuplState)->GetSuplPrivacyRequestInfo(iSuplReqInfo);
       
  4130 				
       
  4131         iSuplSessionState = ESUPL_INITIALIZED;
       
  4132         iSuplMsgType = ESUPL_POSINIT;
       
  4133         if (iSuplUsage >= 2)
       
  4134             {                        
       
  4135             COMASuplInit* suplInit = static_cast <COMASuplInit *>(iDecodedAsnMessage);
       
  4136             COMASuplNotification* notif;
       
  4137             TInt error	= suplInit->Notification(notif);
       
  4138             COMASuplNotification::TOMASuplNotificationType notifType = notif->SuplNotification();
       
  4139             if (notifType == COMASuplNotification::ENotificationOnly)
       
  4140                 {                            
       
  4141 				        						InitializeL(iRequestID); //APE Centric 
       
  4142                 }
       
  4143             else
       
  4144                 {                            
       
  4145                         //iRequestID = 0;               //APE Centric 
       
  4146                 CheckForSuplUsageL();                            
       
  4147                 }
       
  4148             }
       
  4149         else
       
  4150 				    InitializeL(iRequestID);
       
  4151         }
       
  4152     else
       
  4153         {
       
  4154         iTrace->Trace(_L("COMASuplSession::PrivacyCheckCompleteL with Error "), KTraceFileName, __LINE__);
       
  4155         if (iSuplUsage >= 2)                    
       
  4156             {
       
  4157             iNwInitError = ETrue;                            
       
  4158             iNwInitCompletionCode = aCompletionCode;
       
  4159             CheckForSuplUsageL();                            
       
  4160             }
       
  4161         else
       
  4162             HandleSuplInitErrorL(aCompletionCode);
       
  4163         }	
       
  4164     }
       
  4165 
       
  4166 // -----------------------------------------------------------------------------
       
  4167 // COMASuplSession::SetConfigurationParameters...sets configuration parameters
       
  4168 // (other items were commented in a header).
       
  4169 // -----------------------------------------------------------------------------
       
  4170 void COMASuplSession::SetConfigurationParameters(TInt& aUT1_StartTimer,TInt& aUT2_PosInitTimer,
       
  4171  	 											TInt& aUT3_PosTimer,TInt& aPrivacyTimer, 
       
  4172 												TInt& aSETMode,
       
  4173                                                 TInt& aSuplUsage,
       
  4174                                                 TInt& aPersistFailTimer,
       
  4175                                                 TInt& aSuplInitTimeOut)
       
  4176     {
       
  4177     iUT1_StartTimer = aUT1_StartTimer;
       
  4178     iUT2_PosInitTimer = aUT2_PosInitTimer;
       
  4179     iUT3_PosTimer = aUT3_PosTimer;
       
  4180     iPrivacyTimer = aPrivacyTimer;
       
  4181     iSETMode = aSETMode;
       
  4182     iSuplUsage = aSuplUsage;
       
  4183     iPersistFailTimer = aPersistFailTimer; 
       
  4184     iSuplInitTimeOut = aSuplInitTimeOut;
       
  4185     }
       
  4186 	
       
  4187 // -----------------------------------------------------------------------------
       
  4188 // COMASuplSession::IsGenerationInProgress...check about status of generation of message
       
  4189 // (other items were commented in a header).
       
  4190 // -----------------------------------------------------------------------------
       
  4191 TBool COMASuplSession::IsGenerationInProgress()
       
  4192     {
       
  4193     if( iSuplMsgType == ESUPL_POSINIT && iSuplState)
       
  4194         {
       
  4195         COMASuplPosInitState* state =  static_cast <COMASuplPosInitState *>(iSuplState);
       
  4196         TBool ret = state->IsGenerationInProgress();
       
  4197         return ret;
       
  4198         }
       
  4199     else 
       
  4200         {
       
  4201         return EFalse;	
       
  4202         }
       
  4203     }
       
  4204 
       
  4205 // -----------------------------------------------------------------------------
       
  4206 // COMASuplSession::LogEndTime...log the end time if delay is present in QoP
       
  4207 // (other items were commented in a header).
       
  4208 // -----------------------------------------------------------------------------
       
  4209 void COMASuplSession::LogEndTime()
       
  4210 	{
       
  4211 		if(!iIsQoPPresent) 
       
  4212 			{
       
  4213 				return;
       
  4214 			}
       
  4215 			
       
  4216 		TInt delay;
       
  4217 		if(iClientQop.GetDelay(delay) != KErrNotFound)
       
  4218 		{
       
  4219 			iSessionEndTime.HomeTime();
       
  4220 		}
       
  4221 	}
       
  4222 
       
  4223 // -----------------------------------------------------------------------------
       
  4224 // COMASuplSession::SetIMSIL
       
  4225 // Updates IMSI value in SET Session ID
       
  4226 // -----------------------------------------------------------------------------
       
  4227 void COMASuplSession::SetIMSI()
       
  4228     {
       
  4229 
       
  4230         {
       
  4231 	    iTrace->Trace(_L("COMASuplSession::SetIMSIL Start"), KTraceFileName, __LINE__);
       
  4232 	    TInt length = iIMSI.Length();
       
  4233         TBuf8<KIMSILength> imsi;	    
       
  4234         TUint8 val;
       
  4235         TInt index = 0;
       
  4236       
       
  4237         while ( index <= length )
       
  4238             {
       
  4239             val = 0;
       
  4240             if (index == length)
       
  4241                     {
       
  4242                         val = 15 << 4;
       
  4243                         val |= 15;
       
  4244                         imsi.Append(val);
       
  4245                         break;
       
  4246                     }
       
  4247             const TUint16& t = iIMSI[index];
       
  4248             TInt8 i = t - 48;
       
  4249             if ( ++index != length )
       
  4250                 {
       
  4251                 const TUint16& h = iIMSI[index];
       
  4252     			TInt8 j = h - 48;
       
  4253                 val = j << 4;
       
  4254                 val |= i;
       
  4255                 }
       
  4256             else
       
  4257                 {
       
  4258                 val = 15 << 4;
       
  4259                 val |= i;
       
  4260                 }
       
  4261     		
       
  4262             imsi.Append(val);
       
  4263             index++;
       
  4264             }
       
  4265        
       
  4266         if (!iSessionIDFlag)
       
  4267         {                
       
  4268         COMASuplSETSessionID* suplSETSessionId = NULL;
       
  4269 		iSuplSessionId->SETSessionID( suplSETSessionId );
       
  4270 		suplSETSessionId->SetSuplSETSessionIDIMSI( iSETSessionUniqueId, imsi );
       
  4271         }
       
  4272         
       
  4273         iTrace->Trace(_L("COMASuplSession::SetIMSI End"), KTraceFileName, __LINE__);
       
  4274         }
       
  4275     }
       
  4276 			
       
  4277 // -----------------------------------------------------------------------------
       
  4278 // COMASuplSession::IsIMSIVariant
       
  4279 // Checks to determine if IMSI needs to be included in the SUPL message
       
  4280 // -----------------------------------------------------------------------------
       
  4281 TBool COMASuplSession::IsIMSIVariant()
       
  4282     {
       
  4283     if(iIMSI.Length() && 
       
  4284     (
       
  4285     (iRequestType == ESUPL_TERMINAL && iSuplMsgType == ESUPL_START) || 
       
  4286     (iRequestType == ESUPL_TERMINAL && iSuplMsgType == ESUPL_TRIG_START) ||
       
  4287     (iRequestType == ESUPL_NETWORK && iSuplMsgType == ESUPL_TRIG_START && iTriggerSession) ||
       
  4288     (iRequestType == ESUPL_TERMINAL && iSuplMsgType == ESUPL_POSINIT && iTriggerSession) ||
       
  4289     (iRequestType == ESUPL_NETWORK && iSuplMsgType == ESUPL_POSINIT) || 
       
  4290     (iRequestType == ESUPL_NETWORK && iSuplMsgType == ESUPL_END)
       
  4291     ))
       
  4292         {
       
  4293         return ETrue;
       
  4294         }
       
  4295     else
       
  4296         {
       
  4297         return EFalse;    
       
  4298         }
       
  4299     }
       
  4300 
       
  4301 
       
  4302 // -----------------------------------------------------------------------------
       
  4303 // COMASuplSession::SettingsUICompleted
       
  4304 // 
       
  4305 // -----------------------------------------------------------------------------
       
  4306 
       
  4307 void COMASuplSession::SettingsUICompletedL(TInt /*aError*/)
       
  4308 	{
       
  4309 		iTrace->Trace(_L("COMASuplSession::SettingsUICompleted ..."), KTraceFileName, __LINE__);
       
  4310 
       
  4311 	}
       
  4312 
       
  4313 
       
  4314 // -----------------------------------------------------------------------------
       
  4315 // COMASuplSession::HandleInvalidMessageL
       
  4316 // Sends SUPL_END with status code with wrong message
       
  4317 // -----------------------------------------------------------------------------
       
  4318 void COMASuplSession::HandleInvalidMessageL(COMASuplAsnMessageBase* aDecodedAsnMessage)
       
  4319     {
       
  4320 
       
  4321     if(CheckProtocolVersionL(aDecodedAsnMessage)) //Checks version with supported version 
       
  4322         {
       
  4323         iTrace->Trace(_L("COMASuplSession::HandleInvalidMessageL...Sending SUPL_END for invalid message"), KTraceFileName, __LINE__);
       
  4324         iErrorStatusCode = COMASuplEnd::EUnexpectedMessage;
       
  4325         iSuplSessionState = ESUPL_GENERATE;
       
  4326         iSuplMsgType = ESUPL_END;
       
  4327         GenerateSuplMessageL();				
       
  4328         }
       
  4329     }
       
  4330 
       
  4331 // -----------------------------------------------------------------------------
       
  4332 // COMASuplSession::HandleInvalidMessageLengthL
       
  4333 // Sends SUPL_END with status code with protocol error
       
  4334 // -----------------------------------------------------------------------------
       
  4335 void COMASuplSession::HandleInvalidMessageLengthL()
       
  4336 	{
       
  4337 			iTrace->Trace(_L("COMASuplSession::HandleInvalidMessageLengthL...Sending SUPL_END for invalid message length"), KTraceFileName, __LINE__);
       
  4338 			iErrorStatusCode = COMASuplEnd::EProtocolError;
       
  4339 			iSuplSessionState = ESUPL_GENERATE;
       
  4340 			iSuplMsgType = ESUPL_END;
       
  4341 			GenerateSuplMessageL();				
       
  4342 	}
       
  4343 	
       
  4344 // -----------------------------------------------------------------------------
       
  4345 // COMASuplSession::CheckProtocolVersion
       
  4346 // Returns true if its matching else false
       
  4347 // -----------------------------------------------------------------------------
       
  4348 TBool COMASuplSession::CheckProtocolVersionL(COMASuplAsnMessageBase* aDecodedAsn)
       
  4349     {
       
  4350     TOMASuplVersion version;
       
  4351     COMASuplSessionID* SessionID = NULL;
       
  4352     aDecodedAsn->MessageBase(version,SessionID);
       
  4353 
       
  4354     TInt recMajor,recMinor,recServInd;
       
  4355     version.SuplVersion(recMajor,recMinor,recServInd);		
       
  4356 
       
  4357     if(recMajor == KSuplMajorVersion )
       
  4358         {
       
  4359         return  ETrue;
       
  4360         } 
       
  4361     else
       
  4362         {
       
  4363         COMASuplAsnMessageBase::TSuplMessageType messageType = aDecodedAsn->MessageType();
       
  4364         if(messageType == COMASuplAsnMessageBase::ESUPL_END) 
       
  4365             {
       
  4366             iTrace->Trace(_L("Received message is SUPL_END...with wrong Version.Terminating session"), KTraceFileName, __LINE__); 
       
  4367             iSessionObserver.TerminateSession(this, KErrCompletion);	
       
  4368             }
       
  4369         else
       
  4370             {
       
  4371             iTrace->Trace(_L("Received message with wrong version."), KTraceFileName, __LINE__); 
       
  4372 
       
  4373             delete iSuplState;
       
  4374             iSuplState = NULL;
       
  4375             iSuplMsgType = ESUPL_END;
       
  4376             iErrorStatusCode = COMASuplEnd::EVersionNotSupported;	
       
  4377             SetPOSMsgPluginState(COMASuplPosSessionBase::EOMASuplCreating);	
       
  4378 
       
  4379             if(iRequestType == ESUPL_NETWORK )
       
  4380                 {
       
  4381                 if (messageType == COMASuplAsnMessageBase::ESUPL_INIT)    
       
  4382                    {                                
       
  4383                 	iSuplSessionState = ESUPL_INITIALIZED;
       
  4384                 	TInt len = iHSLPAddress.Length();
       
  4385                 	HBufC8 *hslpAdress = NULL;
       
  4386                 	if(len > 0)
       
  4387                     	{
       
  4388                     	hslpAdress = HBufC8::NewL(iHSLPAddress.Length());
       
  4389                     	hslpAdress->Des().Copy(iHSLPAddress);
       
  4390                     	}
       
  4391                 	else if(len ==0)
       
  4392                     	{
       
  4393                     	iTrace->Trace(_L("Length of HSLP Address is = 0, passing the HSLP generated frm IMSI"), KTraceFileName, __LINE__);
       
  4394                     	hslpAdress = HBufC8::NewL(iSuplSettings->SLPAddressfromImsi().Length());
       
  4395                     	CleanupStack::PushL(hslpAdress);
       
  4396                     	hslpAdress->Des().Copy(iSuplSettings->SLPAddressfromImsi());	
       
  4397                     	CleanupStack::Pop(hslpAdress);
       
  4398                     	}
       
  4399 
       
  4400                 CleanupStack::PushL(hslpAdress);
       
  4401                 ServerAddressCheckForSuplInitL();
       
  4402                 iSuplState = COMASuplEndState::NewL(iErrorStatusCode,iOMASuplAsnHandlerBaseImpl,iEncodedSuplInit,hslpAdress);		
       
  4403                 CleanupStack::PopAndDestroy(hslpAdress);
       
  4404 
       
  4405                 // Set the SessionId.
       
  4406                 iTrace->Trace(_L("COMASuplSession::CheckProtocolVersionL Update SLP Session ID"), KTraceFileName, __LINE__);
       
  4407                 UpdateSLPSessionIDL(SessionID);
       
  4408 
       
  4409                 iTrace->Trace(_L("COMASuplSession::CheckProtocolVersionL Update SET Session ID"), KTraceFileName, __LINE__);
       
  4410                 UpdateSETSessionIDL(SessionID);
       
  4411                 iSuplState->SetMsgStateObserver(this);
       
  4412                 iSuplState->GenerateMessageL();
       
  4413                 iSuplSessionState = ESUPL_GENERATE;
       
  4414                             }
       
  4415                         else
       
  4416                             {                                
       
  4417 					        iSuplState = COMASuplEndState::NewL(iErrorStatusCode,iOMASuplAsnHandlerBaseImpl);		
       
  4418 						    UpdateSLPSessionIDL(SessionID);
       
  4419 						    UpdateSETSessionIDL(SessionID);
       
  4420 						    iSuplState->SetMsgStateObserver(this);
       
  4421                             iRequestType = ESUPL_INVALID_SESSION;
       
  4422 						    iSuplSessionState = ESUPL_GENERATE;
       
  4423 						    iSuplState->GenerateMessageL();
       
  4424                             }
       
  4425 
       
  4426                 } 
       
  4427             else 							
       
  4428                 {
       
  4429                 iSuplState = COMASuplEndState::NewL(iErrorStatusCode,iOMASuplAsnHandlerBaseImpl);
       
  4430                 iSuplSessionState = ESUPL_ENCODE;
       
  4431                 iSuplState->SetMsgStateObserver(this);
       
  4432                 UpdateSLPSessionIDL(SessionID);
       
  4433                 UpdateSETSessionIDL(SessionID);
       
  4434                 iSuplState->GenerateMessageL();
       
  4435                 }
       
  4436             }	
       
  4437 
       
  4438         return EFalse;
       
  4439         }	
       
  4440 
       
  4441     }
       
  4442 
       
  4443 // -----------------------------------------------------------------------------
       
  4444 // COMASuplSession::GetRemainingPosPayloadL
       
  4445 // Returns remaining pos payload
       
  4446 // -----------------------------------------------------------------------------
       
  4447 COMASuplPosPayload* COMASuplSession::GetRemainingPosPayloadL()
       
  4448     {
       
  4449     if( iSuplState && COMASuplState::ESUPL_POS_INIT == iSuplState->GetSuplState())
       
  4450         {
       
  4451         COMASuplPosInitState* state =  static_cast <COMASuplPosInitState *>(iSuplState);
       
  4452         return state->GetRemainingPospayLoadL(); 
       
  4453         }
       
  4454     else
       
  4455         {
       
  4456         return NULL;
       
  4457         }
       
  4458     }
       
  4459 
       
  4460 // -----------------------------------------------------------------------------
       
  4461 // COMASuplSession::IsWholeMessageSent
       
  4462 // Is whole message get sent
       
  4463 // -----------------------------------------------------------------------------
       
  4464 TBool COMASuplSession::IsWholeMessageSentL()
       
  4465     {
       
  4466     COMASuplState::TSuplMessageType msgType = iSuplState->GetSuplState();
       
  4467     switch(msgType)
       
  4468         {
       
  4469         case COMASuplState::ESUPL_POS_INIT:
       
  4470             {
       
  4471             COMASuplPosPayload* remainingPosPayload = GetRemainingPosPayloadL();
       
  4472             if(remainingPosPayload )
       
  4473                 return EFalse;
       
  4474             else
       
  4475                 return ETrue;
       
  4476             }
       
  4477 
       
  4478         case COMASuplState::ESUPL_POS:
       
  4479             {
       
  4480             return !IsSegmentationDone();
       
  4481             }
       
  4482         default : //For Start , End
       
  4483             {
       
  4484             return ETrue;	
       
  4485             } 
       
  4486         }
       
  4487     }
       
  4488 
       
  4489 // -----------------------------------------------------------------------------
       
  4490 // COMASuplSession::GetNetworkModeL()
       
  4491 // Checks wheather phone is online or Offline mode...
       
  4492 // -----------------------------------------------------------------------------
       
  4493 
       
  4494 TInt COMASuplSession::GetNetworkModeL()
       
  4495 	{
       
  4496 	
       
  4497 	TInt networkMode;
       
  4498 	// get network mode
       
  4499 	CRepository* centralRepository = CRepository::NewLC(KCRUidCoreApplicationUIs);
       
  4500 	User::LeaveIfError(centralRepository->Get(KCoreAppUIsNetworkConnectionAllowed, networkMode));
       
  4501     CleanupStack::PopAndDestroy(centralRepository);
       
  4502 	return networkMode;
       
  4503 	}
       
  4504 
       
  4505 // -----------------------------------------------------------------------------
       
  4506 // COMASuplSession::SetSessionUIFlag
       
  4507 // Sets/Resets the Session UI flag 
       
  4508 // -----------------------------------------------------------------------------
       
  4509 void COMASuplSession::SetSessionUIFlag(TBool aValue)
       
  4510     {
       
  4511     iUIFlag = aValue;
       
  4512     }        
       
  4513 
       
  4514 // -----------------------------------------------------------------------------
       
  4515 // COMASuplSession::GetSessionUIFlag
       
  4516 // Returns Session UI flag 
       
  4517 // -----------------------------------------------------------------------------
       
  4518 TBool COMASuplSession::GetSessionUIFlag()
       
  4519     {
       
  4520     return iUIFlag;
       
  4521     }    
       
  4522 
       
  4523 
       
  4524 
       
  4525 // -----------------------------------------------------------------------------
       
  4526 // -----------------------------------------------------------------------------
       
  4527 // COMASuplSession::CloseAllOperations
       
  4528 // Close all operations...from here we will stop all processing releated with session and will 
       
  4529 // not send SUPL_END 
       
  4530 // -----------------------------------------------------------------------------
       
  4531 void COMASuplSession::CloseAllOperations()
       
  4532     {
       
  4533     	iCompleteSelfRequestor->CompleteInvalidSLPSession();
       
  4534     }    
       
  4535     
       
  4536 // -----------------------------------------------------------------------------
       
  4537 // COMASuplSession::HandleInvalidSLPSessionL
       
  4538 // Relinquish control to Communication manager....
       
  4539 // 
       
  4540 // -----------------------------------------------------------------------------
       
  4541 void COMASuplSession::HandleInvalidSLPSession()
       
  4542 	{
       
  4543     iTrace->Trace(_L("Cancelling All operations..since received invalid SLP session..."), KTraceFileName, __LINE__); 
       
  4544     iConnRequestor->CancelReadOperation();
       
  4545 		CancelAllOperations();
       
  4546 		iConnRequestor->CloseConnection();
       
  4547         iPortNum = 0;
       
  4548 		iSessionObserver.TerminateSession(this, KErrCompletion);//// Invoke Terminate Session
       
  4549 	}
       
  4550 	
       
  4551 // -----------------------------------------------------------------------------
       
  4552 // COMASuplSession::IsUIDisplayedL
       
  4553 // Checks whether UI is displayed or not previously
       
  4554 // 
       
  4555 // -----------------------------------------------------------------------------
       
  4556 	
       
  4557 TBool COMASuplSession::IsUIDisplayedL()	
       
  4558 	{
       
  4559 	/*
       
  4560 	TBool retValue = EFalse;
       
  4561 	RBuf HSLPIPAddress;
       
  4562 	RBuf IAP_Name;
       
  4563 	RBuf Imsi;
       
  4564 	CSuplSettings::TSuplSettingsChangedBy changedBy;
       
  4565 				
       
  4566 	HSLPIPAddress.CreateL(KMaxIPAddressLength);
       
  4567 	CleanupClosePushL(HSLPIPAddress);
       
  4568 			
       
  4569 	IAP_Name.CreateL(KMaxIapNameLength);
       
  4570 	CleanupClosePushL(IAP_Name);
       
  4571 				
       
  4572 	Imsi.CreateL(KMaxImsiLength);
       
  4573 	CleanupClosePushL(Imsi);
       
  4574 		
       
  4575 	TInt error = iSuplStorageSettings->Get(HSLPIPAddress, IAP_Name, Imsi, changedBy); 
       
  4576 				
       
  4577 	if(!error && (IAP_Name.Length() != 0))
       
  4578 	{
       
  4579 		if (IAP_Name.Compare(_L("-")) == 0)			
       
  4580 			retValue = ETrue;
       
  4581 	}
       
  4582 	CleanupStack::PopAndDestroy(3);	
       
  4583 	return retValue;
       
  4584 	*/
       
  4585 	return EFalse;
       
  4586 	}
       
  4587 
       
  4588 
       
  4589 // -----------------------------------------------------------------------------
       
  4590 // COMASuplSession::SetSETSessionIdL
       
  4591 // Sets the proper SET Session id depending on the type of Varient.
       
  4592 // 
       
  4593 // -----------------------------------------------------------------------------
       
  4594 
       
  4595 TInt COMASuplSession::SetApproriateSETSessionId()
       
  4596     {
       
  4597     TInt err = KErrNone;
       
  4598     if( IsIMSIVariant() )
       
  4599         {
       
  4600         SetIMSI();  
       
  4601         }
       
  4602     else
       
  4603         {
       
  4604         err = GetLocalIPAddress();
       
  4605         }	
       
  4606 
       
  4607     return err;	
       
  4608     }
       
  4609 
       
  4610 // -----------------------------------------------------------------------------
       
  4611 // COMASuplSession::TimerExpiredL
       
  4612 // Checks whether UI is displayed or not previously
       
  4613 // 
       
  4614 // -----------------------------------------------------------------------------
       
  4615 void COMASuplSession::TimerExpiredL()
       
  4616     {
       
  4617     iTrace->Trace(_L("Timer Expired for SUPL_POSINIT"), KTraceFileName, __LINE__); 
       
  4618     OperationCompleteL(KErrTimedOut);
       
  4619     }
       
  4620 
       
  4621 // -----------------------------------------------------------------------------
       
  4622 // COMASuplSession::SettingsUsageUICompletedL
       
  4623 // 
       
  4624 // -----------------------------------------------------------------------------
       
  4625 void COMASuplSession::SettingsUsageUICompletedL(TInt aError)
       
  4626     {
       
  4627     iUIFlag = EFalse;
       
  4628     TBuf<64> msg;	
       
  4629     msg.Copy(_L("SUPL Usage UI completed with ... "));
       
  4630     msg.AppendNum(aError);
       
  4631     iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  4632 
       
  4633     iPrevUsageResult = aError;                    
       
  4634 
       
  4635 
       
  4636 
       
  4637     if (aError == KErrNone)
       
  4638         {
       
  4639         iProtocolManager.UpdateAllSubSessnsInSameSession(iIpcSessionId);                
       
  4640 
       
  4641         if (isTimeoutDialogTimerStarted)
       
  4642             {                
       
  4643             iTrace->Trace(_L("COMASuplSession::SettingsUsageUICompletedL, stopping timer "), KTraceFileName, __LINE__);
       
  4644             isTimeoutDialogTimerStarted = EFalse;                    
       
  4645             iDialogTimer->StopTimer();
       
  4646 
       
  4647             //Compute how log the dialog was on
       
  4648             TTime nowTime;
       
  4649             nowTime.HomeTime();
       
  4650             nowTime.SecondsFrom(iDlgStartTime, iDiffTime);	
       
  4651             }
       
  4652         if (iNwInitError)
       
  4653             {
       
  4654             iNwInitError = EFalse;                    
       
  4655             HandleSuplInitErrorL(iNwInitCompletionCode);                             
       
  4656             }                
       
  4657         else
       
  4658             InitializeL(iRequestID); 
       
  4659         }            
       
  4660     else if (aError == KErrCompletion)
       
  4661         CheckForSuplUsageL();
       
  4662     else 
       
  4663         {
       
  4664         TBuf<64> msg;	
       
  4665         msg.Copy(_L("Error after SUPL Usage Popup... "));
       
  4666         msg.AppendNum(aError);
       
  4667         iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  4668         iSessionObserver.TerminateSession(this, KErrGeneral);	
       
  4669         return;
       
  4670         }
       
  4671     }
       
  4672 
       
  4673 // -----------------------------------------------------------------------------
       
  4674 // COMASuplSession::CheckForSuplUsageL
       
  4675 // 
       
  4676 // -----------------------------------------------------------------------------
       
  4677 void COMASuplSession::CheckForSuplUsageL()
       
  4678     {
       
  4679     iTrace->Trace(_L("COMASuplSession::CheckForSuplUsageL Start"), KTraceFileName, __LINE__); 
       
  4680 
       
  4681     if (iSuplUsage >= 1)
       
  4682         {            
       
  4683         CSuplSettings::TSuplSettingsUsage usage = iSuplSettings->SUPLUsage();
       
  4684         if (usage == CSuplSettings::ESuplUsageDisabled)
       
  4685             {            
       
  4686             iTrace->Trace(_L("CheckForSuplUsageL, SUPL disabled"), KTraceFileName, __LINE__); 
       
  4687             iSessionObserver.TerminateSession(this, KErrGeneral);	
       
  4688             }
       
  4689         else if (usage == CSuplSettings::ESuplUsageAutomatic)
       
  4690             {            
       
  4691             if (iNwInitError)
       
  4692                 {
       
  4693                 iNwInitError = EFalse;                    
       
  4694                 HandleSuplInitErrorL(iNwInitCompletionCode);                             
       
  4695                 }                
       
  4696             else
       
  4697                 {                    
       
  4698                 iTrace->Trace(_L("CheckForSuplUsageL, Initializing"), KTraceFileName, __LINE__); 
       
  4699                 InitializeL(iRequestID); 
       
  4700                 }
       
  4701             }
       
  4702 
       
  4703         else if (usage == CSuplSettings::ESuplUsageHomeAutomatic || usage == CSuplSettings::ESuplUsageAlwaysAsk)
       
  4704             {
       
  4705             if (iRoaming)                
       
  4706                 HandleRoamingCheckCompleteL(KErrNone, EFalse);                    
       
  4707             else
       
  4708                 {                        
       
  4709                 iEtelRoamingCheck = ETrue;
       
  4710                 iProtocolManager.CheckForRoaming();
       
  4711                 }
       
  4712             }            
       
  4713         }            
       
  4714     else
       
  4715         InitializeL(iRequestID); 
       
  4716 
       
  4717     }        
       
  4718 
       
  4719 // -----------------------------------------------------------------------------
       
  4720 // COMASuplSession::CheckForTimerExpiry
       
  4721 // 
       
  4722 // -----------------------------------------------------------------------------
       
  4723 void COMASuplSession::CheckForTimerExpiry()
       
  4724     {
       
  4725     if (iPersistFail)
       
  4726         {            
       
  4727         TTime nowTime;
       
  4728         nowTime.HomeTime();
       
  4729         TTimeIntervalMicroSeconds diff = nowTime.MicroSecondsFrom(iFailTime);	
       
  4730 
       
  4731         if (diff > (iPersistFailTimer * KSecond) )
       
  4732             iChanged = ETrue;            
       
  4733         }
       
  4734     }        
       
  4735 // -----------------------------------------------------------------------------
       
  4736 // COMASuplSession::CheckForPreviousResultL
       
  4737 // 
       
  4738 // -----------------------------------------------------------------------------
       
  4739 void COMASuplSession::CheckForPreviousResultL()
       
  4740     {
       
  4741     CheckForTimerExpiry();            
       
  4742     if (iChanged)
       
  4743         {
       
  4744         iProtocolManager.CancelNotify();
       
  4745         iEtelNotify = EFalse;
       
  4746         iPersistFail = EFalse;
       
  4747         iCapsFail = EFalse;
       
  4748         iChanged = EFalse;
       
  4749         CheckForSuplUsageL();
       
  4750         return;
       
  4751         }
       
  4752 
       
  4753     // Check for previous request result
       
  4754     if (iPrevUsageResult == KErrNone && !iPersistFail && !iCapsFail)
       
  4755         {            
       
  4756 	    InitializeL(iRequestID); 
       
  4757         }
       
  4758     else if (iCapsFail && iAllowedCapabilities != iFailedCaps)
       
  4759         {            
       
  4760 	    InitializeL(iRequestID); 
       
  4761         }
       
  4762     else
       
  4763         {            
       
  4764 	
       
  4765         if (iPrevUsageResult != KErrNone)
       
  4766 	        iSessionObserver.TerminateSession(this, iPrevUsageResult);	
       
  4767         else if (iPersistFail)
       
  4768 	        iSessionObserver.TerminateSession(this, iPrevReqResult);	
       
  4769         else if (iCapsFail)
       
  4770 	        iSessionObserver.TerminateSession(this, KErrGeneral);	
       
  4771         }
       
  4772     }        
       
  4773 
       
  4774 void COMASuplSession::HandleCurrentNetworkChangeL(TInt aErrorCode, TBool aHomeNw)
       
  4775     {
       
  4776     iTrace->Trace(_L("COMASuplSession::HandleCurrentNetworkChangeL"), KTraceFileName, __LINE__); 
       
  4777     iEtelNotify = EFalse;
       
  4778     if (aErrorCode == KErrNone)
       
  4779         {            
       
  4780         iChanged = ETrue;
       
  4781         if (!aHomeNw)
       
  4782             {            
       
  4783             iRoaming = ETrue;            
       
  4784             }
       
  4785         else
       
  4786             iRoaming = EFalse;                
       
  4787         }
       
  4788     }            
       
  4789 
       
  4790 void COMASuplSession::HandleRoamingCheckCompleteL(TInt aErrorCode, TBool aHomeNw)
       
  4791     {
       
  4792     iTrace->Trace(_L("COMASuplSession::HandleRoamingCheckCompleteL"), KTraceFileName, __LINE__); 
       
  4793     iEtelRoamingCheck = EFalse;            
       
  4794     if (aErrorCode == KErrNone)            
       
  4795         {            
       
  4796         iUsageHomeNW = aHomeNw;   
       
  4797         iConnRequestor->UpdateSLPListForHomeUsage(iUsageHomeNW);             
       
  4798         CSuplSettings::TSuplSettingsUsage usage = iSuplSettings->SUPLUsage();
       
  4799 
       
  4800         if (usage == CSuplSettings::ESuplUsageAlwaysAsk)
       
  4801             {
       
  4802             TInt err;                
       
  4803             if (!aHomeNw)
       
  4804                 {                            
       
  4805                 iTrace->Trace(_L("Invoking LaunchSuplUsageSettingsUI, user is roaming"), KTraceFileName, __LINE__);
       
  4806                 err = iProtocolManager.LaunchSuplUsageSettingsUI(this, ETrue);        
       
  4807                 }
       
  4808             else
       
  4809                 {                            
       
  4810                 iTrace->Trace(_L("Invoking LaunchSuplUsageSettingsUI, user is not roaming"), KTraceFileName, __LINE__);
       
  4811                 err = iProtocolManager.LaunchSuplUsageSettingsUI(this, EFalse);        
       
  4812                 }
       
  4813 
       
  4814             if(KErrNone != err && KErrInUse == err)
       
  4815                 {
       
  4816                 iTrace->Trace(_L("Dialog in use, setting flag"), KTraceFileName, __LINE__);
       
  4817                 SetSuplUsageFlag();                            
       
  4818                 }
       
  4819             if( KErrNone == err  && iRequestType == ESUPL_NETWORK )
       
  4820                 {
       
  4821                 iTrace->Trace(_L("Network Session , starting timer"), KTraceFileName, __LINE__);
       
  4822                 COMASuplInit* suplInit = static_cast <COMASuplInit*> (iDecodedAsnMessage);
       
  4823                 TOMASuplQop qop;
       
  4824                 TInt retVal = suplInit->Qop(qop);
       
  4825                 TInt delay;
       
  4826                 qop.Delay(delay);
       
  4827                 //if delay is > 7, it is not valid
       
  4828                 if (delay > 7)
       
  4829                     delay = 0;                                
       
  4830                 if(retVal == KErrNone && delay > 0)
       
  4831                     {
       
  4832                     TReal delayReal;
       
  4833                     Math::Pow(delayReal, 2, (TReal)delay);
       
  4834                     delay = (TInt) delayReal;
       
  4835                     TBuf<128> msg(_L("Delay present in message, value is = "));
       
  4836                     msg.AppendNum(delay);
       
  4837                     iTrace->Trace(msg, KTraceFileName, __LINE__); 
       
  4838                     isTimeoutDialogTimerStarted = ETrue;
       
  4839                     iDialogTimer->StartTimer(delay);
       
  4840                     }  	
       
  4841                 else
       
  4842                     {
       
  4843                     if (iSuplInitTimeOut > 0)
       
  4844                         {                                                        
       
  4845                         TBuf<256> msg(_L("Delay value in CR is"));
       
  4846                         msg.AppendNum(iSuplInitTimeOut);
       
  4847                         iTrace->Trace(msg, KTraceFileName, __LINE__); 
       
  4848                         iDialogTimer->StartTimer(iSuplInitTimeOut * KSecond);
       
  4849                         isTimeoutDialogTimerStarted = ETrue;
       
  4850                         }
       
  4851                     else
       
  4852                         iTrace->Trace(_L("Timeout is <= 0"), KTraceFileName, __LINE__);
       
  4853                     }
       
  4854                 iDlgStartTime.HomeTime();
       
  4855                 }
       
  4856             else if (KErrNone != err)
       
  4857                 {
       
  4858                 iTrace->Trace(_L("Invoking HandleSuplErrorL"), KTraceFileName, __LINE__);
       
  4859                 HandleSuplErrorL(err);
       
  4860                 }
       
  4861 
       
  4862             }
       
  4863         else if (usage == CSuplSettings::ESuplUsageHomeAutomatic) 
       
  4864             {                
       
  4865             if (!aHomeNw)
       
  4866                 {                
       
  4867                 TInt err;                
       
  4868                 //if (!iSuplSettings->IsUIActive() )
       
  4869                 {
       
  4870                 iTrace->Trace(_L("Invoking LaunchSuplUsageSettingsUI, user is roaming"), KTraceFileName, __LINE__);
       
  4871                 err = iProtocolManager.LaunchSuplUsageSettingsUI(this, ETrue);        
       
  4872 
       
  4873                 if(iSuplMsgType == ESUPL_INIT)
       
  4874                     {
       
  4875                     iTrace->Trace(_L("Dialog timer started"), KTraceFileName, __LINE__);
       
  4876 
       
  4877                     COMASuplInit* suplInit = static_cast <COMASuplInit*> (iDecodedAsnMessage);
       
  4878                     TOMASuplQop qop;
       
  4879                     TInt retVal = suplInit->Qop(qop);
       
  4880                     TInt delay;
       
  4881                     qop.Delay(delay);
       
  4882                     //if delay is > 7, it is not valid
       
  4883                     if (delay > 7)
       
  4884                         delay = 0;                                
       
  4885                     if(retVal == KErrNone && delay > 0)
       
  4886                         {
       
  4887                         TReal delayReal;
       
  4888                         Math::Pow(delayReal, 2, (TReal)delay);
       
  4889                         delay = (TInt) delayReal;
       
  4890                         TBuf<128> msg(_L("Delay present in message, value is = "));
       
  4891                         msg.AppendNum(delay);
       
  4892                         iTrace->Trace(msg, KTraceFileName, __LINE__); 
       
  4893                         isTimeoutDialogTimerStarted = ETrue;
       
  4894                         iDialogTimer->StartTimer(delay);
       
  4895                         }  	
       
  4896                     else
       
  4897                         {
       
  4898                         if (iSuplInitTimeOut > 0)
       
  4899                             {                                                        
       
  4900                             isTimeoutDialogTimerStarted = ETrue;
       
  4901                             iDialogTimer->StartTimer(iSuplInitTimeOut * KSecond);
       
  4902                             }
       
  4903                         else
       
  4904                             iTrace->Trace(_L("Timeout is <= 0"), KTraceFileName, __LINE__);
       
  4905                         }
       
  4906                     }
       
  4907                 }
       
  4908 
       
  4909 
       
  4910                 if(!iSuplSettings->IsUIActive() && KErrNone != err)
       
  4911                     {
       
  4912                     SetSuplUsageFlag();                            
       
  4913                     }
       
  4914                 else
       
  4915                     {
       
  4916                     iTrace->Trace(_L("Invoking HandleSuplErrorL"), KTraceFileName, __LINE__);
       
  4917                     HandleSuplErrorL(err);
       
  4918                     }
       
  4919                 }
       
  4920             else            
       
  4921                 {                
       
  4922                 if (iNwInitError)
       
  4923                     {
       
  4924                     iNwInitError = EFalse;                    
       
  4925                     HandleSuplInitErrorL(iNwInitCompletionCode);                             
       
  4926                     }                
       
  4927                 else
       
  4928                     InitializeL(iRequestID); 
       
  4929                 }                
       
  4930             }                
       
  4931         }
       
  4932     else
       
  4933         {
       
  4934         iSessionObserver.TerminateSession(this, KErrGeneral);	
       
  4935         }                
       
  4936     }            
       
  4937 TInt COMASuplSession::SuplIpcSessionID() 
       
  4938     {
       
  4939     return iIpcSessionId;
       
  4940     }    
       
  4941 
       
  4942 void COMASuplSession::UpdateSuplUsage()
       
  4943     {        
       
  4944     iPrevUsageResult = KErrNone;            
       
  4945     }    
       
  4946 
       
  4947 void COMASuplSession::SettingsChanged()
       
  4948     {
       
  4949     iChanged = ETrue;
       
  4950     }    
       
  4951 
       
  4952 void COMASuplSession::HandleIapSettingsChangeL(TInt aErrorCode)
       
  4953     {
       
  4954     iTrace->Trace(_L("COMASuplSession::HandleIapSettingsChangeL"), KTraceFileName, __LINE__);
       
  4955     if (aErrorCode >= 0)
       
  4956         iChanged = ETrue;
       
  4957     }        
       
  4958 
       
  4959 void COMASuplSession::CheckForPersistentFailure(TInt aErrorCode)
       
  4960     {
       
  4961     if (iRequestType == ESUPL_TERMINAL)            
       
  4962         {            
       
  4963         if (
       
  4964                 (aErrorCode <= KErrDndNameNotFound && aErrorCode >= KErrDndServerUnusable) || // DNS errors
       
  4965                 (aErrorCode <= KErrGprsAndNonGprsServicesNotAllowed && aErrorCode >= KErrGprsFeatureNotSupported) || // GPRS errors
       
  4966                 (aErrorCode <= KErrSSLNoSharedCipher && aErrorCode >= KErrSSLDllLeave) || // TLS errors
       
  4967                 (aErrorCode == KErrCouldNotConnect)                            // Server does not exist
       
  4968             )
       
  4969             {
       
  4970             iPersistFail = ETrue;
       
  4971             iPrevReqResult = KErrGeneral;
       
  4972 
       
  4973             iFailTime.HomeTime();
       
  4974 
       
  4975             iTrace->Trace(_L("COMASuplSession::CheckForPersistentFailure, listening to network change"), KTraceFileName, __LINE__);
       
  4976             iEtelNotify = ETrue;
       
  4977             iProtocolManager.NotifyCurrentNetworkChange();
       
  4978 
       
  4979             iTrace->Trace(_L("COMASuplSession::CheckForPersistentFailure, listening to IAP change"), KTraceFileName, __LINE__);
       
  4980             if (!iIapNotifier->IsActive())
       
  4981                 iIapNotifier->NotifyIapSettingsChange();
       
  4982             }            
       
  4983         }            
       
  4984     }        
       
  4985 void COMASuplSession::SetSuplUsageFlag()
       
  4986     {
       
  4987     iUsageDialog = ETrue;            
       
  4988     }        
       
  4989 
       
  4990 void COMASuplSession::ReSetSuplUsageFlag()
       
  4991     {
       
  4992     iUsageDialog = EFalse;            
       
  4993     }        
       
  4994 
       
  4995 TBool COMASuplSession::GetSuplUsageFlag()
       
  4996     {
       
  4997     return iUsageDialog;
       
  4998     }        
       
  4999 
       
  5000 void COMASuplSession::StartUsageDialogLaunchL()
       
  5001     {
       
  5002     iTrace->Trace(_L("COMASuplSession::StartUsageDialogLaunchL"), KTraceFileName, __LINE__);
       
  5003     ReSetSuplUsageFlag();            
       
  5004     iTrace->Trace(_L("COMASuplSession::StartUsageDialogLaunchL, flag reset done"), KTraceFileName, __LINE__);
       
  5005 
       
  5006     CSuplSettings::TSuplSettingsUsage usage = iSuplSettings->SUPLUsage();
       
  5007     if (usage == CSuplSettings::ESuplUsageAlwaysAsk)
       
  5008         {
       
  5009         TInt err;                
       
  5010         if (!iUsageHomeNW)
       
  5011             {                            
       
  5012             iTrace->Trace(_L("Invoking LaunchSuplUsageSettingsUI, user is roaming"), KTraceFileName, __LINE__);
       
  5013             err = iProtocolManager.LaunchSuplUsageSettingsUI(this, ETrue);        
       
  5014 
       
  5015             if(iRequestType == ESUPL_NETWORK && err == KErrNone)
       
  5016                 {
       
  5017                 iTrace->Trace(_L("starting Dialog timer "), KTraceFileName, __LINE__);
       
  5018 
       
  5019                 COMASuplInit* suplInit = static_cast <COMASuplInit*> (iDecodedAsnMessage);
       
  5020                 TOMASuplQop qop;
       
  5021                 TInt retVal = suplInit->Qop(qop);
       
  5022                 TInt delay;
       
  5023                 qop.Delay(delay);
       
  5024                 //if delay is > 7, it is not valid
       
  5025                 if (delay > 7)
       
  5026                     delay = 0;                                
       
  5027                 if(retVal == KErrNone && delay > 0)
       
  5028                     {
       
  5029                     TReal delayReal;
       
  5030                     Math::Pow(delayReal, 2, (TReal)delay);
       
  5031                     delay = (TInt) delayReal;
       
  5032                     TBuf<128> msg(_L("Delay present in message, value is = "));
       
  5033                     msg.AppendNum(delay);
       
  5034                     iTrace->Trace(msg, KTraceFileName, __LINE__); 
       
  5035                     isTimeoutDialogTimerStarted = ETrue;
       
  5036                     iDialogTimer->StartTimer(delay);
       
  5037                     }  	
       
  5038                 else
       
  5039                     {
       
  5040                     if (iSuplInitTimeOut > 0)
       
  5041                         {                                                        
       
  5042                         iTrace->Trace(_L("Delay not present in message"), KTraceFileName, __LINE__);
       
  5043                         TBuf<256> msg(_L("Delay value in CR is "));
       
  5044                         msg.AppendNum(iSuplInitTimeOut);
       
  5045                         iDialogTimer->StartTimer(iSuplInitTimeOut * KSecond);
       
  5046                         isTimeoutDialogTimerStarted = ETrue;
       
  5047                         }
       
  5048                     else
       
  5049                         iTrace->Trace(_L("Timeout is <= 0"), KTraceFileName, __LINE__);
       
  5050                     }
       
  5051                 }
       
  5052             }
       
  5053         else
       
  5054             {                            
       
  5055             iTrace->Trace(_L("Invoking LaunchSuplUsageSettingsUI, user is not roaming"), KTraceFileName, __LINE__);
       
  5056             err = iProtocolManager.LaunchSuplUsageSettingsUI(this, EFalse);        
       
  5057 
       
  5058             if( iRequestType == ESUPL_NETWORK && err == KErrNone)
       
  5059                 {    
       
  5060                 iTrace->Trace(_L("starting Dialog timer "), KTraceFileName, __LINE__);
       
  5061 
       
  5062                 COMASuplInit* suplInit = static_cast <COMASuplInit*> (iDecodedAsnMessage);
       
  5063                 TOMASuplQop qop;
       
  5064                 TInt retVal = suplInit->Qop(qop);
       
  5065                 TInt delay;
       
  5066                 qop.Delay(delay);
       
  5067                 //if delay is > 7, it is not valid
       
  5068                 if (delay > 7)
       
  5069                     delay = 0;                                
       
  5070                 if(retVal == KErrNone && delay > 0)
       
  5071                     {
       
  5072                     TReal delayReal;
       
  5073                     Math::Pow(delayReal, 2, (TReal)delay);
       
  5074                     delay = (TInt) delayReal;
       
  5075                     TBuf<128> msg(_L("Delay present in message, value is = "));
       
  5076                     msg.AppendNum(delay);
       
  5077                     iTrace->Trace(msg, KTraceFileName, __LINE__); 
       
  5078                     isTimeoutDialogTimerStarted = ETrue;
       
  5079                     iDialogTimer->StartTimer(delay);
       
  5080                     }  	
       
  5081                 else
       
  5082                     {
       
  5083                     if (iSuplInitTimeOut > 0)
       
  5084                         {                                                        
       
  5085                         iTrace->Trace(_L("Delay not present in message"), KTraceFileName, __LINE__);
       
  5086                         TBuf<256> msg(_L("Delay value in CR is"));
       
  5087                         msg.AppendNum(iSuplInitTimeOut);
       
  5088                         iDialogTimer->StartTimer(iSuplInitTimeOut * KSecond);
       
  5089                         isTimeoutDialogTimerStarted = ETrue;
       
  5090                         }
       
  5091                     else
       
  5092                         iTrace->Trace(_L("Timeout is <= 0"), KTraceFileName, __LINE__);
       
  5093                     }
       
  5094                 }
       
  5095             }
       
  5096 
       
  5097         if(KErrNone != err)
       
  5098             {                        
       
  5099             iTrace->Trace(_L("Invoking HandleSuplErrorL"), KTraceFileName, __LINE__);
       
  5100             HandleSuplErrorL(err);
       
  5101             }
       
  5102         }
       
  5103     else if (usage == CSuplSettings::ESuplUsageHomeAutomatic) 
       
  5104         {                
       
  5105         if (!iUsageHomeNW)
       
  5106             {                
       
  5107             TInt err;                
       
  5108             iTrace->Trace(_L("Invoking LaunchSuplUsageSettingsUI, user is roaming"), KTraceFileName, __LINE__);
       
  5109             err = iProtocolManager.LaunchSuplUsageSettingsUI(this, ETrue);        
       
  5110 
       
  5111             if(KErrNone != err)
       
  5112                 {
       
  5113                 iTrace->Trace(_L("Invoking HandleSuplErrorL"), KTraceFileName, __LINE__);
       
  5114                 HandleSuplErrorL(err);
       
  5115                 }
       
  5116 
       
  5117             if(iRequestType == ESUPL_NETWORK && err == KErrNone)
       
  5118                 {    
       
  5119                 iTrace->Trace(_L("starting Dialog timer "), KTraceFileName, __LINE__);
       
  5120 
       
  5121                 COMASuplInit* suplInit = static_cast <COMASuplInit*> (iDecodedAsnMessage);
       
  5122                 TOMASuplQop qop;
       
  5123                 TInt retVal = suplInit->Qop(qop);
       
  5124                 TInt delay;
       
  5125                 qop.Delay(delay);
       
  5126                 //if delay is > 7, it is not valid
       
  5127                 if (delay > 7)
       
  5128                     delay = 0;                                
       
  5129                 if(retVal == KErrNone && delay > 0)
       
  5130                     {
       
  5131                     TReal delayReal;
       
  5132                     Math::Pow(delayReal, 2, (TReal)delay);
       
  5133                     delay = (TInt) delayReal;
       
  5134                     TBuf<128> msg(_L("Delay present in message, value is = "));
       
  5135                     msg.AppendNum(delay);
       
  5136                     iTrace->Trace(msg, KTraceFileName, __LINE__); 
       
  5137                     isTimeoutDialogTimerStarted = ETrue;
       
  5138                     iDialogTimer->StartTimer(delay);
       
  5139                     }  	
       
  5140                 else
       
  5141                     {
       
  5142                     if (iSuplInitTimeOut > 0)
       
  5143                         {                                                        
       
  5144                         iTrace->Trace(_L("Delay not present in message"), KTraceFileName, __LINE__);
       
  5145                         TBuf<256> msg(_L("Delay value in CR is"));
       
  5146                         msg.AppendNum(iSuplInitTimeOut);
       
  5147                         iDialogTimer->StartTimer(iSuplInitTimeOut * KSecond);
       
  5148                         isTimeoutDialogTimerStarted = ETrue;
       
  5149                         }
       
  5150                     else
       
  5151                         iTrace->Trace(_L("Timeout is <= 0"), KTraceFileName, __LINE__);
       
  5152                     }
       
  5153                 }
       
  5154             }
       
  5155         else            
       
  5156             {                
       
  5157             if (iNwInitError)
       
  5158                 {
       
  5159                 iNwInitError = EFalse;                    
       
  5160                 HandleSuplInitErrorL(iNwInitCompletionCode);                             
       
  5161                 }                
       
  5162             else
       
  5163                 InitializeL(iRequestID); 
       
  5164             }                
       
  5165         }                
       
  5166     }
       
  5167 
       
  5168 TBool COMASuplSession::IsEtelNotifySet()
       
  5169     {
       
  5170     iTrace->Trace(_L("COMASuplSession::IsEtelNotifySet"), KTraceFileName, __LINE__); 
       
  5171     return iEtelNotify;            
       
  5172     }
       
  5173 
       
  5174 TBool COMASuplSession::IsEtelRoamingSet()
       
  5175     {
       
  5176     iTrace->Trace(_L("COMASuplSession::IsEtelRoamingSet"), KTraceFileName, __LINE__); 
       
  5177     return iEtelRoamingCheck;
       
  5178     }        
       
  5179 
       
  5180 // -----------------------------------------------------------------------------
       
  5181 // COMASuplSession::DialogTimerExpiredL
       
  5182 // Checks whether UI is displayed or not previously
       
  5183 // 
       
  5184 // -----------------------------------------------------------------------------
       
  5185 void COMASuplSession::DialogTimerExpiredL()
       
  5186     {
       
  5187     if (iTrgTimer)         
       
  5188         {
       
  5189         iTrgTimer = EFalse;
       
  5190         if (iStartTimerFlag)
       
  5191             {
       
  5192             iStartTimerFlag = EFalse;                    
       
  5193             StartPeriodicTriggerTimer();
       
  5194             }
       
  5195         else        
       
  5196             {                
       
  5197             iTrace->Trace(_L("Timer Expired for trigger session"), KTraceFileName, __LINE__); 
       
  5198             StartTriggerPosSessionL();                
       
  5199             }            
       
  5200         }            
       
  5201     else
       
  5202         {            
       
  5203         iTrace->Trace(_L("Timer Expired for SUPL Dialog"), KTraceFileName, __LINE__); 
       
  5204 
       
  5205 
       
  5206         if (!iIapDialogShown)
       
  5207             iProtocolManager.LaunchSuplDialogTimeoutUI(this);
       
  5208         else
       
  5209             iIapDlgTimerExpired = ETrue;            
       
  5210 
       
  5211         }
       
  5212     return;	
       
  5213     }
       
  5214 
       
  5215 // -----------------------------------------------------------------------------
       
  5216 // COMASuplSession::SettingsTimeOutUICompletedL
       
  5217 // 
       
  5218 // -----------------------------------------------------------------------------
       
  5219 void COMASuplSession::SettingsTimeOutUICompletedL(TInt aError)
       
  5220     {
       
  5221 
       
  5222     TBuf<64> msg;	
       
  5223     msg.Copy(_L("SUPL Timeout UI completed with ... "));
       
  5224     msg.AppendNum(aError);
       
  5225     iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  5226     iSessionObserver.TerminateSession(this, KErrGeneral);	
       
  5227     return;
       
  5228 
       
  5229     }
       
  5230 
       
  5231 // -----------------------------------------------------------------------------
       
  5232 // COMASuplSession::StoreCurrentCellIDL
       
  5233 // Stores current cell id in CR
       
  5234 // 
       
  5235 // -----------------------------------------------------------------------------
       
  5236 void COMASuplSession::StoreCurrentCellIDL(HPositionGenericInfo& /*aSuplPosInfo*/)
       
  5237     {
       
  5238     iTrace->Trace(_L("Calling StoreCurrentCellIDL"),KTraceFileName, __LINE__);
       
  5239     TPckg<TCellIdInfo> cellPkg(iCurrentCellId);
       
  5240 
       
  5241 #ifdef PRINT_MESSAGE
       
  5242     TBuf<64> msg;
       
  5243     msg.Copy(_L("cid=:"));
       
  5244     msg.AppendNum(iCurrentCellId.iCid);
       
  5245     iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  5246 
       
  5247     msg.Copy(_L("Lac=:"));
       
  5248     msg.AppendNum(iCurrentCellId.iLac);
       
  5249     iTrace->Trace(msg,KTraceFileName, __LINE__);
       
  5250 
       
  5251     msg.Copy(_L("MCC=:"));
       
  5252     msg.AppendNum(iCurrentCellId.iMCC);
       
  5253     iTrace->Trace(msg,KTraceFileName, __LINE__);
       
  5254 
       
  5255     msg.Copy(_L("MNC=:"));
       
  5256     msg.AppendNum(iCurrentCellId.iMNC);
       
  5257     iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  5258 #endif
       
  5259 
       
  5260     CRepository* ConfigurationCenRepSession = CRepository::NewL(KCRUidOMASuplConfiguration);
       
  5261     CleanupStack::PushL(ConfigurationCenRepSession);
       
  5262     User::LeaveIfError(ConfigurationCenRepSession->Set(KOMASuplCurrentCellid, cellPkg));
       
  5263 
       
  5264     CleanupStack::PopAndDestroy(ConfigurationCenRepSession);
       
  5265     }
       
  5266 
       
  5267 // -----------------------------------------------------------------------------
       
  5268 // COMASuplSession::ServerAddressCheckForSuplInitL()
       
  5269 // Stores current cell id in CR
       
  5270 // 
       
  5271 // -----------------------------------------------------------------------------
       
  5272 TInt COMASuplSession::ServerAddressCheckForSuplInitL()
       
  5273     {
       
  5274     TBuf<256> serverName;
       
  5275     TBuf<64> msg;
       
  5276 
       
  5277     COMASuplSLPAddress* slpAddress = NULL;
       
  5278     COMASuplInit* SuplInit = static_cast <COMASuplInit *>(iDecodedAsnMessage);
       
  5279     TInt err = SuplInit->SLPAddress(slpAddress);
       
  5280 
       
  5281     if(err == KErrOMASuplParamNotSet)
       
  5282         {
       
  5283         msg.Copy(_L("SLP address is NOT PRESENT in SUPL_INIT."));
       
  5284         iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  5285 
       
  5286         //Set default slp to Conn Requestor...		
       
  5287         iConnRequestor->UseDefaultServerL();
       
  5288         return KErrNone;
       
  5289         }
       
  5290 
       
  5291     COMASuplSLPAddress::TSuplSLPAddressType addressType = slpAddress->SLPAddressType();
       
  5292     if(addressType == COMASuplSLPAddress::EFqdn)
       
  5293         {
       
  5294         HBufC8* fqdn;
       
  5295         TInt err = slpAddress->Fqdn(fqdn);
       
  5296         serverName.Copy(fqdn->Des());
       
  5297         msg.Copy(_L("SLP address as FQDN is PRESENT in SUPL_INIT:"));
       
  5298         msg.Append(serverName);
       
  5299         iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  5300         }
       
  5301     else
       
  5302         {
       
  5303         TBuf8<256> IPslpaddress;
       
  5304         slpAddress->IPvAddress(IPslpaddress);
       
  5305         serverName.Copy(IPslpaddress);
       
  5306         msg.Copy(_L("SLP address as IP is PRESENT in SUPL_INIT:"));
       
  5307         msg.Append(serverName);
       
  5308         iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  5309 
       
  5310         }
       
  5311 
       
  5312     TBool isExist = iSuplStorageSettings->IsSlpExists(serverName);
       
  5313     if(isExist)
       
  5314         {
       
  5315         //Set to Conn Requestor...
       
  5316         iConnRequestor->UseServerL(serverName);
       
  5317         return KErrNone;
       
  5318         }
       
  5319     else
       
  5320         {
       
  5321         msg.Copy(_L("Dropping Packet.SLP absent in server List:"));
       
  5322         msg.Append(serverName);
       
  5323         iTrace->Trace(msg,KTraceFileName, __LINE__); 
       
  5324         return KErrNotFound;
       
  5325         }	
       
  5326 
       
  5327     }
       
  5328 
       
  5329 void COMASuplSession::RunTriggerSessionL(
       
  5330 								TRequestStatus& aStatus, 
       
  5331                                 TSuplTerminalPeriodicTrigger& aTriggerParams,
       
  5332 			                    const TDesC& aHslpAddress, 
       
  5333 			                    TBool aFallBack,
       
  5334                                 TInt aAllowedCapabilities, 
       
  5335 							 	TInt aSessionIdSeed, 
       
  5336 							 	TInt aRequestID)
       
  5337     {
       
  5338     iRunRequestStatus = & aStatus;
       
  5339     *iRunRequestStatus = KRequestPending;
       
  5340 
       
  5341     iRequestID = aRequestID;
       
  5342 
       
  5343     iTrace->Trace(_L("Start COMASuplSession::RunTriggerSessionL"), KTraceFileName, __LINE__); 
       
  5344     	
       
  5345     // Log Session Id
       
  5346     TBuf<64> id;
       
  5347     id.Append(_L("Session  Id is "));
       
  5348     id.AppendNum(aSessionIdSeed);
       
  5349     iTrace->Trace(id,KTraceFileName, __LINE__); 
       
  5350     	
       
  5351     // Log Capability from client
       
  5352     id.Copy(_L("Received Capability is "));
       
  5353     id.AppendNum(aAllowedCapabilities);
       
  5354     iTrace->Trace(id,KTraceFileName, __LINE__); 
       
  5355     	
       
  5356     iSETSessionUniqueId = aSessionIdSeed;
       
  5357 
       
  5358     TInt networkMode = 1;
       
  5359     networkMode = GetNetworkModeL();
       
  5360 		
       
  5361     if ( networkMode == ECoreAppUIsNetworkConnectionNotAllowed )
       
  5362         {
       
  5363         id.Copy(_L("The device is in OFFLINE mode."));
       
  5364         iTrace->Trace(id,KTraceFileName, __LINE__); 
       
  5365         iSessionObserver.TerminateSession(this, KErrGeneral);
       
  5366         return;
       
  5367         }
       
  5368     else
       
  5369         {
       
  5370         id.Copy(_L("The device is in ON LINE mode."));
       
  5371         iTrace->Trace(id,KTraceFileName, __LINE__); 
       
  5372         }
       
  5373 
       
  5374     if(aAllowedCapabilities == 0)
       
  5375         {
       
  5376         iAllowedCapabilities = KGpsSETAssisted | KGpsSETBased | KAutonomousGps| KAFLT | KECID | KEOTD | KOTDOA | KCID; 
       
  5377         }
       
  5378     else
       
  5379         {
       
  5380         iAllowedCapabilities = aAllowedCapabilities;
       
  5381         }
       
  5382 
       
  5383     //Ownership transfer to iSuplSessionId
       
  5384     iSuplSessionId->SetSLPSessionID(NULL); 	
       
  5385 
       
  5386     //Set flag to indicate that it is a triggering session
       
  5387     iTriggerSession = ETrue;
       
  5388 
       
  5389     //Store trigger parameters
       
  5390     iTriggerParams = aTriggerParams;
       
  5391 
       
  5392 	iConnRequestor->SetDefaultParametersL(aHslpAddress,aFallBack);
       
  5393 
       
  5394     CheckForSuplUsageL();
       
  5395 
       
  5396     // Clear  Position....
       
  5397     delete iPosition;
       
  5398     iPosition = NULL;
       
  5399 	    
       
  5400     iTrace->Trace(_L("End of COMASuplSession::RunTriggerSessionL"), KTraceFileName, __LINE__); 
       
  5401     }
       
  5402 
       
  5403 void COMASuplSession::GetPeriodicTriggerParams()
       
  5404     {
       
  5405     iTrace->Trace(_L("COMASuplSession::GetPeriodicTriggerParams"), KTraceFileName, __LINE__); 
       
  5406     iTriggerParams.Get(iNumFixes, iInterval, iStartTime);
       
  5407     iTotalNoOfFixes = iNumFixes;
       
  5408     iStartTimeCopy = iStartTime;
       
  5409     }        
       
  5410 
       
  5411 void COMASuplSession::StartPeriodicTriggerTimer()
       
  5412     {
       
  5413     if (iNumFixes != 0)
       
  5414         {            
       
  5415         iTrace->Trace(_L("COMASuplSession::StartPeriodicTriggerTimer"), KTraceFileName, __LINE__); 
       
  5416         //Set flag to indicate timer for trigger
       
  5417         iTrgTimer = ETrue;            
       
  5418         if (iStartTime != 0)
       
  5419             {                
       
  5420             iDialogTimer->StartTimer(iStartTime * KSecond);
       
  5421             iStartTime = 0;
       
  5422             iStartTimerFlag = ETrue;
       
  5423             }
       
  5424         else
       
  5425             {
       
  5426             if(iTotalNoOfFixes == iNumFixes)
       
  5427                 {
       
  5428                 iDialogTimer->StartTimer(0);
       
  5429                 }
       
  5430             else
       
  5431                 {
       
  5432                 iDialogTimer->StartTimer(iInterval * KSecond);
       
  5433                 }   
       
  5434             }
       
  5435         }
       
  5436     }
       
  5437 
       
  5438 void COMASuplSession::StartTriggerPosSessionL()
       
  5439     {
       
  5440     iTrace->Trace(_L("COMASuplSession::StartTriggerPosSessionL"), KTraceFileName, __LINE__); 
       
  5441 
       
  5442     if (iClientNotify || iTotalNoOfFixes == iNumFixes)
       
  5443         {            
       
  5444         //Check if fix already exists with the POS Plug-in
       
  5445         //in which case whole of POS session is not required.
       
  5446 
       
  5447         iClientNotify = EFalse;                            
       
  5448         if (iInterval > KMaxIntervalTime || iDisconnected || iStartTime > KMaxStartTime)
       
  5449             {                
       
  5450 		
       
  5451 			iTrace->Trace(_L("Setting state to INITIALIZED"), KTraceFileName, __LINE__);       
       
  5452             iStartTimeCopy = 0;                    
       
  5453 	        iSuplSessionState = ESUPL_INITIALIZED;
       
  5454             }
       
  5455         else            
       
  5456             {                
       
  5457 			iTrace->Trace(_L("Setting state to CONNECTING"), KTraceFileName, __LINE__);       
       
  5458 	        iSuplSessionState = ESUPL_CONNECTING;
       
  5459             }
       
  5460 
       
  5461 	    OperationCompleteL(KErrNone);	
       
  5462         }
       
  5463     else
       
  5464         {            
       
  5465         //Reset number of fixes to 0 so that if notify 
       
  5466         //request comes after cancel has started, it will
       
  5467         //get completed with error                
       
  5468         iNumFixes = 0;                
       
  5469         CancelTriggerSession();            
       
  5470         }
       
  5471     }
       
  5472 
       
  5473 void COMASuplSession::NotifyTriggerFiredL(TRequestStatus& aStatus, TSuplTriggerFireInfo& aFireInfo)
       
  5474     {
       
  5475     iTrace->Trace(_L("COMASuplSession::NotifyTriggerFiredL"), KTraceFileName, __LINE__); 
       
  5476 	iRunRequestStatus = & aStatus;
       
  5477 	*iRunRequestStatus = KRequestPending;
       
  5478     iTrgFireInfo = &aFireInfo;
       
  5479     iClientNotify = ETrue;
       
  5480     if (iNumFixes == 0)
       
  5481         {
       
  5482             CompleteSession(KErrGeneral);
       
  5483         }
       
  5484 
       
  5485     }        
       
  5486 
       
  5487 void COMASuplSession::CancelTriggerSession()
       
  5488     {
       
  5489     // Check if trigger session is in progress.  If not trigger session, silently discard.
       
  5490     if (!iTriggerSession)
       
  5491         return;
       
  5492 
       
  5493     // If the trigger session is over and SUPL END is already sent,
       
  5494     // then also silently discard 
       
  5495     if (iSuplMsgType == ESUPL_END)  
       
  5496         return;
       
  5497 
       
  5498     // If timer is running, stop timer and send SUPL TRIGGER STOP.
       
  5499     // Else check if POS session in progress and send SUPL TRIGGER STOP
       
  5500     if (iDialogTimer->IsTimerStarted())
       
  5501         {            
       
  5502         iDialogTimer->StopTimer();
       
  5503         }
       
  5504 
       
  5505     iTrgCancelRequest = ETrue;                
       
  5506     // Check if the triggering POS session in progress
       
  5507     if (iSuplMsgType == ESUPL_POSINIT || iSuplMsgType == ESUPL_POS || iInterval <= 10)  
       
  5508         {            
       
  5509 	    iSuplSessionState = ESUPL_CONNECTING;
       
  5510         }
       
  5511     else
       
  5512         {                
       
  5513         // If POS session is not in progress, need to check for interval and progress
       
  5514 	    iSuplSessionState = ESUPL_INITIALIZED;
       
  5515         }
       
  5516 
       
  5517 	TRAP_IGNORE(OperationCompleteL(KErrNone));
       
  5518 		
       
  5519 
       
  5520     }        
       
  5521 // -----------------------------------------------------------------------------
       
  5522 // COMASuplSession::InsertActiveSessionL
       
  5523 // 
       
  5524 // 
       
  5525 // -----------------------------------------------------------------------------
       
  5526 void COMASuplSession::InsertActiveSessionL()
       
  5527     {
       
  5528     				iTrace->Trace(_L("Inserting New Trigger Session into DB..."), KTraceFileName, __LINE__); 
       
  5529 						CTriggerParams::TRequestType requestType;
       
  5530 						if(iRequestType == ESUPL_TERMINAL)
       
  5531 						{
       
  5532 							requestType = CTriggerParams::ETerminalInitiated;
       
  5533 						}
       
  5534 						else
       
  5535 						{
       
  5536 							requestType = CTriggerParams::ENetworkInitiated;
       
  5537 						}	
       
  5538 
       
  5539             CTriggerParams* activeSessionParam = CTriggerParams::NewLC();
       
  5540             activeSessionParam->Set(iSETSessionUniqueId,iRequestorName,ETrue,ETrue,CTriggerParams::EPeriodic,requestType,iNumFixes,iInterval);
       
  5541             iTrace->Trace(_L("Session Id : "), KTraceFileName, __LINE__);
       
  5542             TBuf<64> sessionId;
       
  5543             sessionId.AppendNum(iSETSessionUniqueId);
       
  5544             iTrace->Trace(sessionId, KTraceFileName, __LINE__);
       
  5545             
       
  5546             TInt err=iSuplStorageSettings->InsertSessionRecord(activeSessionParam);
       
  5547             CleanupStack::PopAndDestroy(activeSessionParam);
       
  5548     }
       
  5549 
       
  5550 // -----------------------------------------------------------------------------
       
  5551 // COMASuplSession::RemoveActiveSession
       
  5552 //  
       
  5553 // 
       
  5554 // -----------------------------------------------------------------------------
       
  5555 void COMASuplSession::RemoveActiveSession()
       
  5556     {
       
  5557     			iTrace->Trace(_L("Removing Trigger Session from DB..."), KTraceFileName, __LINE__); 
       
  5558     			//may need to reset the iActiveSessionId to 0 so that self deletion event will not come to same session...
       
  5559     			TInt err = iSuplStorageSettings->DeleteSessionRecord(iSETSessionUniqueId);
       
  5560     }
       
  5561     
       
  5562 void COMASuplSession::UpdateActiveTriggerSession()
       
  5563 {
       
  5564 		iTrace->Trace(_L("Updating Trigger Session into DB..."), KTraceFileName, __LINE__); 
       
  5565 		iTrace->Trace(_L("Session Id : "), KTraceFileName, __LINE__);
       
  5566     TBuf<64> sessionId;
       
  5567     sessionId.AppendNum(iSETSessionUniqueId);
       
  5568     iTrace->Trace(sessionId, KTraceFileName, __LINE__);
       
  5569 		
       
  5570     TInt err = iSuplStorageSettings->SetOutstandingTriggers(iSETSessionUniqueId,iNumFixes);
       
  5571 }    
       
  5572     
       
  5573 // -----------------------------------------------------------------------------
       
  5574 // COMASuplSession::AreYouHandlingThisSession
       
  5575 //   
       
  5576 // 
       
  5577 // -----------------------------------------------------------------------------
       
  5578 TBool COMASuplSession::AreYouHandlingThisSession(TInt64& aActiveSessionId)
       
  5579     {
       
  5580     			//We will consider only  Network Initiated case,as there will be cancellation of only network initiated trigger only, nor SET initiated.
       
  5581     			//return ((aActiveSessionId == iSETSessionUniqueId) && (iRequestType == ESUPL_NETWORK));
       
  5582     			return (aActiveSessionId == iSETSessionUniqueId);
       
  5583     }
       
  5584 
       
  5585 
       
  5586 void COMASuplSession::LaunchNotifyDialogL()
       
  5587 {
       
  5588 	
       
  5589     iTrace->Trace(_L("COMASuplSession2::LaunchNotifyDialogL..."), KTraceFileName, __LINE__); 
       
  5590 	
       
  5591 	if (!iPrivacyOverride && iTotalNoOfFixes == (iNumFixes+1))
       
  5592 	{
       
  5593 		iTrace->Trace(_L("COMASuplSession2::LaunchNotifyDialogL...inside if"), KTraceFileName, __LINE__);
       
  5594 		// Synchronous call 
       
  5595 		if (iSuplReqInfo)
       
  5596 				iTrace->Trace(_L("iSuplReqInfo is not null"), KTraceFileName, __LINE__);
       
  5597 		
       
  5598 		if (iNetworkPrivacy)
       
  5599 				iTrace->Trace(_L("iNetworkPrivacy is not null"), KTraceFileName, __LINE__);
       
  5600 				
       
  5601 				//Inform UI that ,trigger session has started...
       
  5602 		InsertActiveSessionL();
       
  5603 		TInt privacyId;
       
  5604 		iNetworkPrivacy->NotifyLocationRequestL(*iSuplReqInfo, privacyId); 
       
  5605 		iTrace->Trace(_L(" Calling InsertActiveSessionL"), KTraceFileName, __LINE__);
       
  5606          
       
  5607 	}
       
  5608 	else
       
  5609 	if (!iPrivacyOverride)
       
  5610 	{
       
  5611 		iTrace->Trace(_L("Launch Notify dialog second if condition"), KTraceFileName, __LINE__);
       
  5612 		CTriggerParams* aParamValues = CTriggerParams::NewL();
       
  5613 		iSuplStorageSettings->GetTriggerParams(iSETSessionUniqueId,aParamValues);
       
  5614 		TInt64 sessionId;
       
  5615     TBool notificationPresent;
       
  5616     TBool triggerNotificationStatus;
       
  5617     CTriggerParams::TTriggerType triggerType;
       
  5618     CTriggerParams::TRequestType requestType;
       
  5619     TUint64 outstandingTrigger;
       
  5620     TUint64 interval;
       
  5621 
       
  5622 	HBufC* sessionName = HBufC::NewL( KMaxSessionNameLength );
       
  5623 	
       
  5624 		aParamValues->Get(sessionId,sessionName->Des(),notificationPresent,triggerNotificationStatus,
       
  5625                            triggerType,requestType,outstandingTrigger,interval);
       
  5626                            //triggerNotificationStatus = ETrue;
       
  5627 	
       
  5628 		UpdateActiveTriggerSession(); //Update UI for trigger info...
       
  5629 		
       
  5630     if (triggerNotificationStatus)
       
  5631     {
       
  5632     	iTrace->Trace(_L("calling notifylocreqL in second if"), KTraceFileName, __LINE__);
       
  5633     	if (iSuplReqInfo)
       
  5634 				iTrace->Trace(_L("iSuplReqInfo is not null"), KTraceFileName, __LINE__);
       
  5635 		
       
  5636 		if (iNetworkPrivacy)
       
  5637 				iTrace->Trace(_L("iNetworkPrivacy is not null"), KTraceFileName, __LINE__);
       
  5638 				
       
  5639 				
       
  5640 				
       
  5641     	iNetworkPrivacy->NotifyLocationRequestL(*iSuplReqInfo, iRequestorId);
       
  5642     	
       
  5643     }
       
  5644     
       
  5645     delete sessionName;
       
  5646     delete aParamValues;
       
  5647     
       
  5648                                                   
       
  5649 	}
       
  5650 	
       
  5651 }
       
  5652 
       
  5653 TUint COMASuplSession::GetPortNumUsed()
       
  5654 {
       
  5655 	return iPortNum;
       
  5656 }
       
  5657 
       
  5658 //End of File