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(¶m); |
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(¶m); |
|
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 // ----------------------------------------------------------------------------- |