hotspotfw/hsclient/src/hssinterface.cpp
changeset 19 10810c91db26
parent 0 56b72877c1cb
equal deleted inserted replaced
3:ff3b37722600 19:10810c91db26
   106     if ( KErrNone == error )
   106     if ( KErrNone == error )
   107         {
   107         {
   108         error = CreateSession( KHotSpotDataServerName,
   108         error = CreateSession( KHotSpotDataServerName,
   109                                Version(),
   109                                Version(),
   110                                KDefaultMsgSlots );
   110                                KDefaultMsgSlots );
   111          DEBUG1( "RHssInterface::Connect() CreateSession: %d", error );  
   111         DEBUG1( "RHssInterface::Connect() CreateSession: %d", error );  
   112         }
   112         }
   113     return error;
   113     return error;
   114     }
   114     }
   115 
   115 
   116 // -----------------------------------------------------------------------------
   116 // -----------------------------------------------------------------------------
   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