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(¶m); |
246 CleanupStack::PopAndDestroy(¶m); |
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 // ----------------------------------------------------------------------------- |