supl/locationomasuplprotocolhandler/protocolhandlerver2/src/epos_comasuplfallbackhandler.cpp
branchRCL_3
changeset 44 2b4ea9893b66
parent 24 9c303455e256
child 45 6b6920c56e2f
equal deleted inserted replaced
42:02ba3f1733c6 44:2b4ea9893b66
   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         
   152 						err = iSuplSettings.AddNewServer( newParam, aSLPId ); //Ignore error
   152 						err = iSuplSettings.AddNewServer( newParam, aSLPId ); //Ignore error
   153 						LogBuffer.Copy(_L("AddNewServer() completed with err: "));
   153 						LogBuffer.Copy(_L("AddNewServer() completed with err: "));
   154 						LogBuffer.AppendNum(err);
   154 						LogBuffer.AppendNum(err);
   155 						iTrace->Trace(LogBuffer,KTraceFileName, __LINE__); 		
   155 						iTrace->Trace(LogBuffer,KTraceFileName, __LINE__); 		
   156 						
   156 						
   157 						CleanupStack::PopAndDestroy(&newParam);
   157 						CleanupStack::PopAndDestroy(newParam);
   158 						}
   158 						}
   159 					else
   159 					else
   160 						{
   160 						{
   161 						//Server exists, get the SLP ID and the IAP Access point for this server
   161 						//Server exists, get the SLP ID and the IAP Access point for this server
   162 						HBufC* hslpAddress =  HBufC::NewL(KHSLPAddressLength);       
   162 						HBufC* hslpAddress =  HBufC::NewL(KHSLPAddressLength);       
   173 						
   173 						
   174 						delete hslpAddress;
   174 						delete hslpAddress;
   175 						delete iapName;
   175 						delete iapName;
   176 						}
   176 						}
   177 					
   177 					
   178 					CleanupStack::PopAndDestroy(&param);
   178 					CleanupStack::PopAndDestroy(param);
   179                                 
   179                                 
   180             		iTrace->Trace(_L("Fallback allowed & TLSAuth failed"),KTraceFileName, __LINE__);
   180             		iTrace->Trace(_L("Fallback allowed & TLSAuth failed"),KTraceFileName, __LINE__);
   181             		iTrace->Trace(_L("Server being used:"),KTraceFileName, __LINE__);
   181             		iTrace->Trace(_L("Server being used:"),KTraceFileName, __LINE__);
   182             		LogBuffer.Copy(aHslpToBeUsedAddress);
   182             		LogBuffer.Copy(aHslpToBeUsedAddress);
   183             		iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   183             		iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   202      	else
   202      	else
   203 	     	{
   203 	     	{
   204 	     	return KErrNotFound;
   204 	     	return KErrNotFound;
   205 	     	}  
   205 	     	}  
   206 	 	}
   206 	 	}
   207 		
   207 
   208 		//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
   209 		// 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
   210 		// be tried once
   210 	// be tried once
   211 		if(iSLPList->Count() <= 0 && (!iAttemptedBackupServer))
   211 	if(iSLPList->Count() <= 0 && (!iAttemptedBackupServer))
   212 			{
   212 		{
   213 			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__);
   214 
   214 
   215 			iAttemptedBackupServer = ETrue;
   215 		iAttemptedBackupServer = ETrue;
   216 
   216 
   217 			//Generate the HSLP Address
   217 		//Generate the HSLP Address
   218 			GenerateHslpAddressFromIMSIL();
   218 		GenerateHslpAddressFromIMSIL();
   219 
   219 
   220 			//Copy the generated address into the supplied function arguments
   220 		//Copy the generated address into the supplied function arguments
   221 			aHslpToBeUsedAddress.Copy(iGenratedHslpAddress);
   221 		aHslpToBeUsedAddress.Copy(iGenratedHslpAddress);
   222 			aIAPName.Zero();   
   222 		aIAPName.Zero();   
   223 			aIAPName.Copy(iDefaultIAPName);
   223 		aIAPName.Copy(iDefaultIAPName);
   224 			aTls = ETrue;
   224 		aTls = ETrue;
   225 			aPskTls = EFalse;
   225 		aPskTls = EFalse;
   226 			aIsIapDialogShown = ETrue;
   226 		aIsIapDialogShown = ETrue;
   227 
   227 
   228 			iTrace->Trace(_L("Server being used:"),KTraceFileName, __LINE__);
   228 		iTrace->Trace(_L("Server being used:"),KTraceFileName, __LINE__);
   229 			LogBuffer.Copy(aHslpToBeUsedAddress);
   229 		LogBuffer.Copy(aHslpToBeUsedAddress);
   230 			iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   230 		iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   231 
   231 
   232 			iTrace->Trace(_L("iap being used:"),KTraceFileName, __LINE__);
   232 		iTrace->Trace(_L("iap being used:"),KTraceFileName, __LINE__);
   233 			LogBuffer.Copy(aIAPName);
   233 		LogBuffer.Copy(aIAPName);
   234 			iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   234 		iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   235 			
   235 		
   236 			//Add the server to the list for future connections
   236 		//Add the server to the list for future connections
   237 			CServerParams* param=CServerParams::NewL();
   237 		CServerParams* param=CServerParams::NewL();
   238 			CleanupStack::PushL(param);
   238 		CleanupStack::PushL(param);
   239 			User::LeaveIfError(param->Set( iGenratedHslpAddress,iDefaultIAPName,ETrue,ETrue,ETrue,EFalse ));
   239 		User::LeaveIfError(param->Set( iGenratedHslpAddress,iDefaultIAPName,ETrue,ETrue,ETrue,EFalse ));
   240 
   240 
   241 			TInt err = iSuplSettings.AddNewServer( param, aSLPId ); //Ignore error
   241 		TInt err = iSuplSettings.AddNewServer( param, aSLPId ); //Ignore error
   242 			LogBuffer.Copy(_L("AddNewServer() completed with err: "));
   242 		LogBuffer.Copy(_L("AddNewServer() completed with err: "));
   243 			LogBuffer.AppendNum(err);
   243 		LogBuffer.AppendNum(err);
   244 			iTrace->Trace(LogBuffer,KTraceFileName, __LINE__); 		
   244 		iTrace->Trace(LogBuffer,KTraceFileName, __LINE__); 		
   245 		
   245 		
   246 			CleanupStack::PopAndDestroy(&param);
   246 		CleanupStack::PopAndDestroy(&param);
   247 
   247 
   248 			return KErrNone;
   248 		return KErrNone;
   249 			}
   249 		}
   250 	 	
   250     
   251         if( iSLPList->Count() <= 0 || iCurrentServerCounter >= iSLPList->Count() ) 
   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)	
   252             {
   286             {
   253             LogBuffer.Copy(_L("No more servers available..."));
   287             LogBuffer.Copy(_L("Timeout happened..."));
   254             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);              
   288             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__); 		
   255             return KErrNotFound;
   289             
       
   290             return KErrTimedOut;
   256             }
   291             }
   257                  
   292         }	
   258         iTrace->Trace(_L("Trying next server..."),KTraceFileName, __LINE__);                
   293                 
   259                  
   294     if(aLastErrorCode == KErrNone)  //This will be called only once...for first time only
   260         //Fallback Timer...
   295         {
   261         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.
   262             {
   322             {
   263             iTrace->Trace(_L("Start Time: "),KTraceFileName, __LINE__);                 
   323             aSLPId = (*iSLPList)[iCurrentServerCounter].iSLPId;	
   264             iFallBackStartTime.HomeTime();
   324             aHslpToBeUsedAddress.Copy((*iSLPList)[iCurrentServerCounter].iHSLPAddress);
   265             LogBuffer.Zero();
   325             aIAPName.Copy((*iSLPList)[iCurrentServerCounter].iIapName);    			
   266             iFallBackStartTime.FormatL(LogBuffer,KFormatTxt); 
   326             aTls = (*iSLPList)[iCurrentServerCounter].iTls;
   267             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);              
   327             aPskTls = (*iSLPList)[iCurrentServerCounter].iPskTls;
   268             }
   328             aIsIapDialogShown = (*iSLPList)[iCurrentServerCounter].iIsIAPDialgShown;
   269         else
   329             iCurrentServerCounter++;
   270             {
   330             iTrace->Trace(_L("Fallback allowed & TLSAuth passed"),KTraceFileName, __LINE__);
   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)  
       
   286                 {
       
   287                 LogBuffer.Copy(_L("Timeout happened..."));
       
   288                 iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);      
       
   289                 
       
   290                 return KErrTimedOut;
       
   291                 }
       
   292             }   
       
   293                     
       
   294         if(aLastErrorCode == KErrNone)  //This will be called only once...for first time only
       
   295             {
       
   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__);
   331             iTrace->Trace(_L("Server being used:"),KTraceFileName, __LINE__);
   305             LogBuffer.Copy(aHslpToBeUsedAddress);
   332             LogBuffer.Copy(aHslpToBeUsedAddress);
   306             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   333             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   307                         
   334                                                                    
   308             iTrace->Trace(_L("iap being used:"),KTraceFileName, __LINE__);
   335             iTrace->Trace(_L("iap being used:"),KTraceFileName, __LINE__);
   309             LogBuffer.Copy(aIAPName);
   336             LogBuffer.Copy(aIAPName);
   310             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   337             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   311                         
   338                                                                     
   312             iTrace->Trace(_L("iap dlg configuration:"),KTraceFileName, __LINE__);
   339             iTrace->Trace(_L("iap dlg configuration:"),KTraceFileName, __LINE__);
   313             LogBuffer.Delete(0,256);
   340             LogBuffer.Delete(0,256);
   314             LogBuffer.AppendNum(aIsIapDialogShown);
   341             LogBuffer.AppendNum(aIsIapDialogShown);
   315             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   342             iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
   316                         
       
   317             return KErrNone;
   343             return KErrNone;
   318             }
   344             }
   319         else
   345         else
   320             {
   346             {
   321             if(iIsFallBackAllowed && CheckErrorCodeL(aLastErrorCode))// Do not fallback in case if IMSI generated address failed for previous try.
   347             return KErrNotFound;
   322                 {
       
   323                 aSLPId = (*iSLPList)[iCurrentServerCounter].iSLPId; 
       
   324                 aHslpToBeUsedAddress.Copy((*iSLPList)[iCurrentServerCounter].iHSLPAddress);
       
   325                 aIAPName.Copy((*iSLPList)[iCurrentServerCounter].iIapName);             
       
   326                 aTls = (*iSLPList)[iCurrentServerCounter].iTls;
       
   327                 aPskTls = (*iSLPList)[iCurrentServerCounter].iPskTls;
       
   328                 aIsIapDialogShown = (*iSLPList)[iCurrentServerCounter].iIsIAPDialgShown;
       
   329                 iCurrentServerCounter++;
       
   330                 iTrace->Trace(_L("Fallback allowed & TLSAuth passed"),KTraceFileName, __LINE__);
       
   331                 iTrace->Trace(_L("Server being used:"),KTraceFileName, __LINE__);
       
   332                 LogBuffer.Copy(aHslpToBeUsedAddress);
       
   333                 iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
       
   334                                                                        
       
   335                 iTrace->Trace(_L("iap being used:"),KTraceFileName, __LINE__);
       
   336                 LogBuffer.Copy(aIAPName);
       
   337                 iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
       
   338                                                                         
       
   339                 iTrace->Trace(_L("iap dlg configuration:"),KTraceFileName, __LINE__);
       
   340                 LogBuffer.Delete(0,256);
       
   341                 LogBuffer.AppendNum(aIsIapDialogShown);
       
   342                 iTrace->Trace(LogBuffer,KTraceFileName, __LINE__);
       
   343                 return KErrNone;
       
   344                 }
       
   345             else
       
   346                 {
       
   347                 return KErrNotFound;
       
   348                 }
       
   349             }
   348             }
       
   349         }
       
   350                     
   350     }
   351     }
   351     
   352     
   352 // -----------------------------------------------------------------------------
   353 // -----------------------------------------------------------------------------
   353 // COMASuplFallBackHandler::CheckErrorCodeL
   354 // COMASuplFallBackHandler::CheckErrorCodeL
   354 // -----------------------------------------------------------------------------
   355 // -----------------------------------------------------------------------------