410 // Starts the server if it is not already running |
410 // Starts the server if it is not already running |
411 // ----------------------------------------------------------------------------- |
411 // ----------------------------------------------------------------------------- |
412 // |
412 // |
413 TInt RHssInterface::StartServer() |
413 TInt RHssInterface::StartServer() |
414 { |
414 { |
415 DEBUG( "RHssInterface::StartServer" ); |
415 TInt res( KErrNone ); |
416 TInt result; |
416 // create server - if one of this name does not already exist |
417 |
417 TFindServer findServer( KHotSpotDataServerName ); |
418 TFindServer findHotSpotServer( KHotSpotDataServerName ); |
|
419 TFullName name; |
418 TFullName name; |
420 |
419 |
421 result = findHotSpotServer.Next( name ); |
420 if ( findServer.Next( name ) != KErrNone ) // we don't exist already |
422 if ( result == KErrNone ) |
421 { |
423 { |
422 RProcess server; |
424 // Server already running |
423 // Create the server process |
425 return KErrNone; |
424 res = server.Create( KHotSpotServerExe, KNullDesC ); |
426 } |
425 |
427 |
426 if ( res != KErrNone ) // thread created ok - now start it going |
428 RSemaphore semaphore; |
427 { |
429 result = semaphore.CreateGlobal( KHotSpotServerSemaphore, 0 ); |
428 return res; |
430 DEBUG1( "RHssInterface::StartServer semaphore: %d", result ); |
429 } |
431 if ( result != KErrNone ) |
430 |
432 { |
431 // Rendezvous is used to detect server start |
433 return result; |
432 TRequestStatus status; |
434 } |
433 server.Rendezvous( status ); |
435 |
434 |
436 result = CreateServerProcess(); |
435 if ( status != KRequestPending ) |
437 DEBUG1( "RHssInterface::StartServer CreateServerProcess: %d", result ); |
436 { |
438 if ( result != KErrNone ) |
437 DEBUG1( "StartServer Rendezvous ERROR: %d", status.Int() ); |
439 { |
438 server.Kill( 0 ); // abort startup |
440 // Should the semaphore be closed if process creating fails? |
439 } |
441 return result; |
440 else |
442 } |
441 { |
443 |
442 server.Resume(); // logon OK - start the server |
444 semaphore.Wait(); |
443 } |
445 semaphore.Close(); |
444 |
446 |
445 DEBUG( "StartServer wait for start" ); |
447 return KErrNone; |
446 User::WaitForRequest( status ); // wait for start or death |
448 } |
447 |
449 |
448 // We can't use the 'exit reason' if the server paniced as this |
450 // ----------------------------------------------------------------------------- |
449 // is the panic 'reason' and may be '0' which cannot be distinguished |
451 // RHssInterface::CreateServerProcess() |
450 // from KErrNone |
452 // Creates a server process |
451 res = ( server.ExitType() == EExitPanic ) ? KErrGeneral : status.Int(); |
453 // ----------------------------------------------------------------------------- |
452 |
454 // |
453 // we're no longer interested in the other process |
455 TInt RHssInterface::CreateServerProcess() |
454 server.Close(); |
456 { |
455 } |
457 const TUidType serverUid( KNullUid,KNullUid, KHotspotServerUid3 ); |
456 |
458 |
457 return res; |
459 RProcess server; |
458 |
460 |
|
461 TInt r = server.Create(KHotSpotServerExe,KNullDesC); |
|
462 if ( r != KErrNone ) |
|
463 { |
|
464 DEBUG1( "**** RHssInterface: server start failed %d", r ); |
|
465 return r; |
|
466 } |
|
467 TRequestStatus stat; |
|
468 server.Rendezvous( stat ); |
|
469 if ( stat!=KRequestPending ) |
|
470 { |
|
471 server.Kill(0); // abort startup |
|
472 } |
|
473 else |
|
474 { |
|
475 server.Resume(); // logon OK - start the server |
|
476 } |
|
477 |
|
478 DEBUG("**** RHssInterface: Started"); |
|
479 |
|
480 User::WaitForRequest(stat); |
|
481 r = ( server.ExitType()==EExitPanic ) ? KErrGeneral : stat.Int(); |
|
482 server.Close(); |
|
483 return r; |
|
484 } |
459 } |
485 |
460 |
486 // --------------------------------------------------------- |
461 // --------------------------------------------------------- |
487 // RHssInterface::WaitForNotification |
462 // RHssInterface::WaitForNotification |
488 // When the message is completed at the server side, the |
463 // When the message is completed at the server side, the |