supl/locationomasuplprotocolhandler/protocolhandlerver2/src/epos_comasuplfallbackhandler.cpp
changeset 25 73f6c2762ffe
parent 22 4c4ed41530db
child 39 3efc7a0e8755
equal deleted inserted replaced
22:4c4ed41530db 25:73f6c2762ffe
   113 TInt COMASuplFallBackHandler::GetNextSLPAddressL(TInt64& aSLPId, TDes& aHslpToBeUsedAddress,TDes& aIAPName,TBool& aTls,
   113 TInt COMASuplFallBackHandler::GetNextSLPAddressL(TInt64& aSLPId, TDes& aHslpToBeUsedAddress,TDes& aIAPName,TBool& aTls,
   114                                                  TBool& aPskTls,TInt aLastErrorCode,TBool& aIsIapDialogShown)
   114                                                  TBool& aPskTls,TInt aLastErrorCode,TBool& aIsIapDialogShown)
   115     {
   115     {
   116 	iTrace->Trace(_L("COMASuplFallBackHandler::GetNextSLPAddressL"),KTraceFileName, __LINE__);
   116 	iTrace->Trace(_L("COMASuplFallBackHandler::GetNextSLPAddressL"),KTraceFileName, __LINE__);
   117 	
   117 	
   118         _LIT(KFormatTxt,"%/0%1%/1%2%/2%3%/3 %-B%:0%J%:1%T%:2%S%:3%+B"); 
   118     _LIT(KFormatTxt,"%/0%1%/1%2%/2%3%/3 %-B%:0%J%:1%T%:2%S%:3%+B"); 
   119         
   119     
   120         TBuf<256> LogBuffer;
   120     TBuf<256> LogBuffer;
   121        
   121     
   122        if( aLastErrorCode != KErrNone)// If its KErrNone then its means server name is asked first time and no need for Tls failure check
   122      if( aLastErrorCode != KErrNone)// If its KErrNone then its means server name is asked first time and no need for Tls failure check
   123     	{
   123     	{
   124     	
   124     	
   125     	if( CheckErrorCodeL(aLastErrorCode) )
   125     	if( CheckErrorCodeL(aLastErrorCode) )
   126         	{
   126         	{
   127         
   127         
   133             		aIAPName.Zero();   
   133             		aIAPName.Zero();   
   134             		aIAPName.Copy(iDefaultIAPName);
   134             		aIAPName.Copy(iDefaultIAPName);
   135             		aTls = ETrue;
   135             		aTls = ETrue;
   136             		aPskTls = EFalse;
   136             		aPskTls = EFalse;
   137             		aIsIapDialogShown = ETrue;
   137             		aIsIapDialogShown = ETrue;
       
   138 					
       
   139 					CServerParams* param = CServerParams::NewL();
       
   140 					CleanupStack::PushL(param);
       
   141 					
       
   142 					//Find out if this alternative generated SUPL server is in the SUPL Settings list
       
   143 					TInt err = iSuplSettings.GetSlpInfoAddress(iGenratedHslpAddress, param);
       
   144 					if(err == KErrNotFound)
       
   145 						{
       
   146 						//Server does not exist
       
   147 						iTrace->Trace(_L("Server does not exist in list so adding it in."),KTraceFileName, __LINE__);
       
   148 						CServerParams* newParam=CServerParams::NewL();
       
   149 						CleanupStack::PushL(newParam);
       
   150 						User::LeaveIfError(newParam->Set( iGenratedHslpAddress,iDefaultIAPName,ETrue,ETrue,ETrue,EFalse ));
       
   151 
       
   152 						err = iSuplSettings.AddNewServer( newParam, aSLPId ); //Ignore error
       
   153 						LogBuffer.Copy(_L("AddNewServer() completed with err: "));
       
   154 						LogBuffer.AppendNum(err);
       
   155 						iTrace->Trace(LogBuffer,KTraceFileName, __LINE__); 		
       
   156 						
       
   157 						CleanupStack::PopAndDestroy(&newParam);
       
   158 						}
       
   159 					else
       
   160 						{
       
   161 						//Server exists, get the SLP ID and the IAP Access point for this server
       
   162 						HBufC* hslpAddress =  HBufC::NewL(KHSLPAddressLength);       
       
   163 						HBufC* iapName =  HBufC::NewL(KMaxIapNameLength);
       
   164 						TBool serverEnabled;
       
   165 						TBool simChangeRemove;
       
   166 						TBool usageInHomeNw;
       
   167 						TBool editable;
       
   168 						
       
   169 						iTrace->Trace(_L("Server already exists, getting the SLP ID and Access Point."),KTraceFileName, __LINE__);
       
   170 						
       
   171 						param->Get(aSLPId,hslpAddress->Des(),iapName->Des(),serverEnabled,simChangeRemove,usageInHomeNw,editable);
       
   172 						aIAPName.Copy(iapName->Des());
       
   173 						
       
   174 						delete hslpAddress;
       
   175 						delete iapName;
       
   176 						}
       
   177 					
       
   178 					CleanupStack::PopAndDestroy(&param);
   138                                 
   179                                 
   139             		iTrace->Trace(_L("Fallback allowed & TLSAuth failed"),KTraceFileName, __LINE__);
   180             		iTrace->Trace(_L("Fallback allowed & TLSAuth failed"),KTraceFileName, __LINE__);
   140             		iTrace->Trace(_L("Server being used:"),KTraceFileName, __LINE__);
   181             		iTrace->Trace(_L("Server being used:"),KTraceFileName, __LINE__);
   141             		LogBuffer.Copy(aHslpToBeUsedAddress);
   182             		LogBuffer.Copy(aHslpToBeUsedAddress);
   142             		iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   183             		iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   160         
   201         
   161      	else
   202      	else
   162 	     	{
   203 	     	{
   163 	     	return KErrNotFound;
   204 	     	return KErrNotFound;
   164 	     	}  
   205 	     	}  
   165 	 	} 
   206 	 	}
   166 	 	
   207 
   167 		//Check to see if the server list is empty.  If it is create the HSLP Address from the IMSI and use that
   208 	//Check to see if the server list is empty.  If it is create the HSLP Address from the IMSI and use that
   168 		// as the server address.  This does not add the server to the list and this functionality should only
   209 	// as the server address.  This does not add the server to the list and this functionality should only
   169 		// be tried once
   210 	// be tried once
   170 		if(iSLPList->Count() <= 0 && (!iAttemptedBackupServer))
   211 	if(iSLPList->Count() <= 0 && (!iAttemptedBackupServer))
   171 			{
   212 		{
   172 			iTrace->Trace(_L("Going to create and use alternative HSLP Address from IMSI"),KTraceFileName, __LINE__);
   213 		iTrace->Trace(_L("Going to create and use alternative HSLP Address from IMSI"),KTraceFileName, __LINE__);
   173 
   214 
   174 			iAttemptedBackupServer = ETrue;
   215 		iAttemptedBackupServer = ETrue;
   175 
   216 
   176 			//Generate the HSLP Address
   217 		//Generate the HSLP Address
   177 			GenerateHslpAddressFromIMSIL();
   218 		GenerateHslpAddressFromIMSIL();
   178 
   219 
   179 			//Copy the generated address into the supplied function arguments
   220 		//Copy the generated address into the supplied function arguments
   180 			aHslpToBeUsedAddress.Copy(iGenratedHslpAddress);
   221 		aHslpToBeUsedAddress.Copy(iGenratedHslpAddress);
   181 			aIAPName.Zero();   
   222 		aIAPName.Zero();   
   182 			aIAPName.Copy(iDefaultIAPName);
   223 		aIAPName.Copy(iDefaultIAPName);
   183 			aTls = ETrue;
   224 		aTls = ETrue;
   184 			aPskTls = EFalse;
   225 		aPskTls = EFalse;
   185 			aIsIapDialogShown = ETrue;
   226 		aIsIapDialogShown = ETrue;
   186 
   227 
   187 			iTrace->Trace(_L("Server being used:"),KTraceFileName, __LINE__);
   228 		iTrace->Trace(_L("Server being used:"),KTraceFileName, __LINE__);
   188 			LogBuffer.Copy(aHslpToBeUsedAddress);
   229 		LogBuffer.Copy(aHslpToBeUsedAddress);
   189 			iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   230 		iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   190 
   231 
   191 			iTrace->Trace(_L("iap being used:"),KTraceFileName, __LINE__);
   232 		iTrace->Trace(_L("iap being used:"),KTraceFileName, __LINE__);
   192 			LogBuffer.Copy(aIAPName);
   233 		LogBuffer.Copy(aIAPName);
   193 			iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   234 		iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   194 
   235 		
   195 			return KErrNone;
   236 		//Add the server to the list for future connections
   196 			}
   237 		CServerParams* param=CServerParams::NewL();
   197 		
   238 		CleanupStack::PushL(param);
   198         if( iSLPList->Count() <= 0 || iCurrentServerCounter >= iSLPList->Count() ) 
   239 		User::LeaveIfError(param->Set( iGenratedHslpAddress,iDefaultIAPName,ETrue,ETrue,ETrue,EFalse ));
       
   240 
       
   241 		TInt err = iSuplSettings.AddNewServer( param, aSLPId ); //Ignore error
       
   242 		LogBuffer.Copy(_L("AddNewServer() completed with err: "));
       
   243 		LogBuffer.AppendNum(err);
       
   244 		iTrace->Trace(LogBuffer,KTraceFileName, __LINE__); 		
       
   245 		
       
   246 		CleanupStack::PopAndDestroy(&param);
       
   247 
       
   248 		return KErrNone;
       
   249 		}
       
   250     
       
   251     if( iSLPList->Count() <= 0 || iCurrentServerCounter >= iSLPList->Count() ) 
       
   252         {
       
   253         LogBuffer.Copy(_L("No more servers available..."));
       
   254         iTrace->Trace(LogBuffer,KTraceFileName, __LINE__); 				
       
   255         return KErrNotFound;
       
   256         }
       
   257              
       
   258     iTrace->Trace(_L("Trying next server..."),KTraceFileName, __LINE__); 				
       
   259              
       
   260     //Fallback Timer...
       
   261     if(aLastErrorCode == KErrNone) //This means, server name is asked for first time only...
       
   262         {
       
   263         iTrace->Trace(_L("Start Time: "),KTraceFileName, __LINE__); 				
       
   264         iFallBackStartTime.HomeTime();
       
   265         LogBuffer.Zero();
       
   266         iFallBackStartTime.FormatL(LogBuffer,KFormatTxt); 
       
   267         iTrace->Trace(LogBuffer,KTraceFileName, __LINE__); 				
       
   268         }
       
   269     else
       
   270         {
       
   271         TTime currentTime;
       
   272         currentTime.HomeTime();
       
   273         TTimeIntervalMicroSeconds diff = currentTime.MicroSecondsFrom(iFallBackStartTime); 
       
   274                         
       
   275                         
       
   276         iTrace->Trace(_L("Current Time: "),KTraceFileName, __LINE__); 				
       
   277         LogBuffer.Zero();
       
   278         currentTime.FormatL(LogBuffer,KFormatTxt); 
       
   279         iTrace->Trace(LogBuffer,KTraceFileName, __LINE__); 				
       
   280                         
       
   281         LogBuffer.Copy(_L("Difference between time: "));
       
   282         LogBuffer.AppendNum(diff.Int64());
       
   283         iTrace->Trace(LogBuffer,KTraceFileName, __LINE__); 				
       
   284                         
       
   285         if( diff.Int64() > iAllowedFallBackTimerValue)	
   199             {
   286             {
   200             LogBuffer.Copy(_L("No more servers available..."));
   287             LogBuffer.Copy(_L("Timeout happened..."));
   201             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);              
   288             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__); 		
   202             return KErrNotFound;
   289             
       
   290             return KErrTimedOut;
   203             }
   291             }
   204                  
   292         }	
   205         iTrace->Trace(_L("Trying next server..."),KTraceFileName, __LINE__);                
   293                 
   206                  
   294     if(aLastErrorCode == KErrNone)  //This will be called only once...for first time only
   207         //Fallback Timer...
   295         {
   208         if(aLastErrorCode == KErrNone) //This means, server name is asked for first time only...
   296         aSLPId = (*iSLPList)[0].iSLPId;
       
   297         aHslpToBeUsedAddress.Copy((*iSLPList)[0].iHSLPAddress);
       
   298         aIAPName.Copy((*iSLPList)[0].iIapName);
       
   299         aTls = (*iSLPList)[0].iTls;
       
   300         aPskTls = (*iSLPList)[0].iPskTls;
       
   301         aIsIapDialogShown = (*iSLPList)[0].iIsIAPDialgShown;
       
   302         iCurrentServerCounter++;				
       
   303                     
       
   304         iTrace->Trace(_L("Server being used:"),KTraceFileName, __LINE__);
       
   305         LogBuffer.Copy(aHslpToBeUsedAddress);
       
   306         iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
       
   307                     
       
   308         iTrace->Trace(_L("iap being used:"),KTraceFileName, __LINE__);
       
   309         LogBuffer.Copy(aIAPName);
       
   310         iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
       
   311                     
       
   312         iTrace->Trace(_L("iap dlg configuration:"),KTraceFileName, __LINE__);
       
   313         LogBuffer.Delete(0,256);
       
   314         LogBuffer.AppendNum(aIsIapDialogShown);
       
   315         iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
       
   316                     
       
   317         return KErrNone;
       
   318         }
       
   319     else
       
   320         {
       
   321         if(iIsFallBackAllowed && CheckErrorCodeL(aLastErrorCode))// Do not fallback in case if IMSI generated address failed for previous try.
   209             {
   322             {
   210             iTrace->Trace(_L("Start Time: "),KTraceFileName, __LINE__);                 
   323             aSLPId = (*iSLPList)[iCurrentServerCounter].iSLPId;	
   211             iFallBackStartTime.HomeTime();
   324             aHslpToBeUsedAddress.Copy((*iSLPList)[iCurrentServerCounter].iHSLPAddress);
   212             LogBuffer.Zero();
   325             aIAPName.Copy((*iSLPList)[iCurrentServerCounter].iIapName);    			
   213             iFallBackStartTime.FormatL(LogBuffer,KFormatTxt); 
   326             aTls = (*iSLPList)[iCurrentServerCounter].iTls;
   214             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);              
   327             aPskTls = (*iSLPList)[iCurrentServerCounter].iPskTls;
   215             }
   328             aIsIapDialogShown = (*iSLPList)[iCurrentServerCounter].iIsIAPDialgShown;
   216         else
   329             iCurrentServerCounter++;
   217             {
   330             iTrace->Trace(_L("Fallback allowed & TLSAuth passed"),KTraceFileName, __LINE__);
   218             TTime currentTime;
       
   219             currentTime.HomeTime();
       
   220             TTimeIntervalMicroSeconds diff = currentTime.MicroSecondsFrom(iFallBackStartTime); 
       
   221                             
       
   222                             
       
   223             iTrace->Trace(_L("Current Time: "),KTraceFileName, __LINE__);               
       
   224             LogBuffer.Zero();
       
   225             currentTime.FormatL(LogBuffer,KFormatTxt); 
       
   226             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);              
       
   227                             
       
   228             LogBuffer.Copy(_L("Difference between time: "));
       
   229             LogBuffer.AppendNum(diff.Int64());
       
   230             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);              
       
   231                             
       
   232             if( diff.Int64() > iAllowedFallBackTimerValue)  
       
   233                 {
       
   234                 LogBuffer.Copy(_L("Timeout happened..."));
       
   235                 iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);      
       
   236                 
       
   237                 return KErrTimedOut;
       
   238                 }
       
   239             }   
       
   240                     
       
   241         if(aLastErrorCode == KErrNone)  //This will be called only once...for first time only
       
   242             {
       
   243             aSLPId = (*iSLPList)[0].iSLPId;
       
   244             aHslpToBeUsedAddress.Copy((*iSLPList)[0].iHSLPAddress);
       
   245             aIAPName.Copy((*iSLPList)[0].iIapName);
       
   246             aTls = (*iSLPList)[0].iTls;
       
   247             aPskTls = (*iSLPList)[0].iPskTls;
       
   248             aIsIapDialogShown = (*iSLPList)[0].iIsIAPDialgShown;
       
   249             iCurrentServerCounter++;                
       
   250                         
       
   251             iTrace->Trace(_L("Server being used:"),KTraceFileName, __LINE__);
   331             iTrace->Trace(_L("Server being used:"),KTraceFileName, __LINE__);
   252             LogBuffer.Copy(aHslpToBeUsedAddress);
   332             LogBuffer.Copy(aHslpToBeUsedAddress);
   253             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   333             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   254                         
   334                                                                    
   255             iTrace->Trace(_L("iap being used:"),KTraceFileName, __LINE__);
   335             iTrace->Trace(_L("iap being used:"),KTraceFileName, __LINE__);
   256             LogBuffer.Copy(aIAPName);
   336             LogBuffer.Copy(aIAPName);
   257             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   337             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   258                         
   338                                                                     
   259             iTrace->Trace(_L("iap dlg configuration:"),KTraceFileName, __LINE__);
   339             iTrace->Trace(_L("iap dlg configuration:"),KTraceFileName, __LINE__);
   260             LogBuffer.Delete(0,256);
   340             LogBuffer.Delete(0,256);
   261             LogBuffer.AppendNum(aIsIapDialogShown);
   341             LogBuffer.AppendNum(aIsIapDialogShown);
   262             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   342             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   263                         
       
   264             return KErrNone;
   343             return KErrNone;
   265             }
   344             }
   266         else
   345         else
   267             {
   346             {
   268             if(iIsFallBackAllowed && CheckErrorCodeL(aLastErrorCode))// Do not fallback in case if IMSI generated address failed for previous try.
   347             return KErrNotFound;
   269                 {
       
   270                 aSLPId = (*iSLPList)[iCurrentServerCounter].iSLPId; 
       
   271                 aHslpToBeUsedAddress.Copy((*iSLPList)[iCurrentServerCounter].iHSLPAddress);
       
   272                 aIAPName.Copy((*iSLPList)[iCurrentServerCounter].iIapName);             
       
   273                 aTls = (*iSLPList)[iCurrentServerCounter].iTls;
       
   274                 aPskTls = (*iSLPList)[iCurrentServerCounter].iPskTls;
       
   275                 aIsIapDialogShown = (*iSLPList)[iCurrentServerCounter].iIsIAPDialgShown;
       
   276                 iCurrentServerCounter++;
       
   277                 iTrace->Trace(_L("Fallback allowed & TLSAuth passed"),KTraceFileName, __LINE__);
       
   278                 iTrace->Trace(_L("Server being used:"),KTraceFileName, __LINE__);
       
   279                 LogBuffer.Copy(aHslpToBeUsedAddress);
       
   280                 iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
       
   281                                                                        
       
   282                 iTrace->Trace(_L("iap being used:"),KTraceFileName, __LINE__);
       
   283                 LogBuffer.Copy(aIAPName);
       
   284                 iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
       
   285                                                                         
       
   286                 iTrace->Trace(_L("iap dlg configuration:"),KTraceFileName, __LINE__);
       
   287                 LogBuffer.Delete(0,256);
       
   288                 LogBuffer.AppendNum(aIsIapDialogShown);
       
   289                 iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
       
   290                 return KErrNone;
       
   291                 }
       
   292             else
       
   293                 {
       
   294                 return KErrNotFound;
       
   295                 }
       
   296             }
   348             }
       
   349         }
       
   350                     
   297     }
   351     }
   298     
   352     
   299 // -----------------------------------------------------------------------------
   353 // -----------------------------------------------------------------------------
   300 // COMASuplFallBackHandler::CheckErrorCodeL
   354 // COMASuplFallBackHandler::CheckErrorCodeL
   301 // -----------------------------------------------------------------------------
   355 // -----------------------------------------------------------------------------