watchdog/src/servermonitor.cpp
changeset 23 d4d56f5e7c55
equal deleted inserted replaced
20:556534771396 23:d4d56f5e7c55
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: Monitoring application for servers restarting & IAD
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "servermonitor.h"
       
    20 
       
    21 _LIT(KStar , "*");
       
    22 _LIT(KExtension, ".exe");
       
    23 _LIT(KSemaphore, "Semaphore");
       
    24 
       
    25 // ======== MEMBER FUNCTIONS ========
       
    26 // ---------------------------------------------------------------------------
       
    27 // Constructor.
       
    28 // ---------------------------------------------------------------------------
       
    29 //
       
    30 CServerMonitor* CServerMonitor::NewL( TDesC& aServerName , TUid aServerUid )
       
    31     {   
       
    32     CServerMonitor* self = new ( ELeave ) CServerMonitor();
       
    33     CleanupStack::PushL( self );
       
    34     self->ConstructL( aServerName , aServerUid );
       
    35     CleanupStack::Pop( self );
       
    36 
       
    37     return self;
       
    38     }
       
    39 
       
    40 // ---------------------------------------------------------------------------
       
    41 // C++ constructor.
       
    42 // ---------------------------------------------------------------------------
       
    43 //
       
    44 CServerMonitor::CServerMonitor() : 
       
    45     CActive( CActive::EPriorityStandard ), iState(EIdle)
       
    46     {
       
    47     // Add to active scheduler.
       
    48     CActiveScheduler::Add( this );
       
    49     }
       
    50 
       
    51 // ---------------------------------------------------------------------------
       
    52 // 2nd phase constructor.
       
    53 // ---------------------------------------------------------------------------
       
    54 //
       
    55 void CServerMonitor::ConstructL( TDesC& aServerName , TUid aServerUid )
       
    56     {
       
    57         
       
    58     TFullName name;
       
    59     //Update the member variables
       
    60     iServerName = HBufC::NewL( aServerName.Length() );
       
    61     TPtr servernameptr = iServerName->Des();
       
    62     servernameptr.Copy( aServerName );
       
    63     
       
    64     iServerUid.iUid = aServerUid.iUid;
       
    65     // find Harvester Server
       
    66     // Append * to the server name for the findprocess
       
    67     HBufC* servername = HBufC::NewL( iServerName->Length() + 1 );
       
    68     TPtr nameptr = servername->Des();
       
    69     nameptr.Copy( aServerName );
       
    70     nameptr.Append( KStar );
       
    71     
       
    72     TFindProcess findProcess( *servername );
       
    73     if ( findProcess.Next(name) == KErrNone )
       
    74         {              
       
    75         User::LeaveIfError( iProcess.Open(name) );
       
    76         iState = ERunning;
       
    77         // logon to get termination signal
       
    78         iProcess.Logon(iStatus);        
       
    79         SetActive();
       
    80         }        
       
    81     else
       
    82         { 
       
    83         // start new Harvester            
       
    84         StartL();
       
    85         }
       
    86     
       
    87     delete servername;
       
    88     
       
    89     }
       
    90 
       
    91 void CServerMonitor::StartL()
       
    92     {  
       
    93 
       
    94     // Double check that harvester server is not already running
       
    95     TFullName name;
       
    96     TInt res( KErrNone );
       
    97     // Append * to the server name for the findprocess
       
    98     HBufC* servername = HBufC::NewL( iServerName->Length() + 1 );
       
    99     TPtr servernameptr = servername->Des();
       
   100     servernameptr.Copy( *iServerName );
       
   101     servernameptr.Append( KStar );
       
   102     // find really Harvester Server, using TFindServer to avoid logon a dead process
       
   103     TFindServer findServer( *servername );
       
   104     
       
   105     if ( findServer.Next(name) == KErrNone )
       
   106         {
       
   107         TFindProcess findProcess( *servername );
       
   108         if ( findProcess.Next(name) == KErrNone )
       
   109             {            
       
   110             iProcess.Close();
       
   111             res = iProcess.Open(name);
       
   112             if ( res != KErrNone )
       
   113                 {
       
   114                 delete servername;
       
   115                 return;
       
   116                 }
       
   117             iState = EWaitingRendezvous;
       
   118             SetActive();
       
   119             delete servername;
       
   120             return;
       
   121             }
       
   122         }  
       
   123     
       
   124     // close the panic process
       
   125     TFindProcess findProcess( *servername );
       
   126     if ( findProcess.Next(name) == KErrNone )
       
   127         {                
       
   128         iProcess.Close();
       
   129         }
       
   130     delete servername;
       
   131     servername = NULL;
       
   132     // Create the server process
       
   133     StartServerProcessL(); 
       
   134     }    
       
   135 
       
   136 // ---------------------------------------------------------------------------
       
   137 // Destructor
       
   138 // ---------------------------------------------------------------------------
       
   139 //
       
   140 CServerMonitor::~CServerMonitor()
       
   141     {
       
   142     delete iServerName;
       
   143     Cancel();
       
   144     }
       
   145 
       
   146 // ---------------------------------------------------------------------------
       
   147 // Active object's request handling.
       
   148 // ---------------------------------------------------------------------------
       
   149 //
       
   150 void CServerMonitor::RunL()
       
   151     {    	
       
   152     	switch (iState)
       
   153     	{
       
   154           case EIdle:
       
   155               {
       
   156               break;
       
   157               }
       
   158               
       
   159           case EWaitingRendezvous:          
       
   160               {
       
   161               iState = ERunning;              
       
   162               // logon to get termination signal
       
   163               TRAPD(err,iProcess.Logon(iStatus));
       
   164               if ( err == KErrNone )
       
   165                  SetActive();
       
   166               break;
       
   167               }             
       
   168               
       
   169           case ERunning:
       
   170               {
       
   171               // server died unexpectedly, start it    
       
   172               StartL();
       
   173               break;
       
   174               }            
       
   175           default:
       
   176               break; 
       
   177           
       
   178     	}
       
   179     
       
   180     }
       
   181 
       
   182 // ---------------------------------------------------------------------------
       
   183 // Active object's request error handling.
       
   184 // ---------------------------------------------------------------------------
       
   185 //
       
   186 TInt CServerMonitor::RunError( TInt /*aError*/ )
       
   187     {
       
   188     return KErrNone;
       
   189     }
       
   190 
       
   191 // ---------------------------------------------------------------------------
       
   192 // Cancel the request.
       
   193 // ---------------------------------------------------------------------------
       
   194 //
       
   195 void CServerMonitor::DoCancel()
       
   196     {
       
   197     iProcess.LogonCancel(iStatus);
       
   198     iProcess.Close();
       
   199     }
       
   200 
       
   201 // ---------------------------------------------------------------------------
       
   202 // StartServerProcess
       
   203 // ---------------------------------------------------------------------------
       
   204 //
       
   205 void CServerMonitor::StartServerProcessL()
       
   206     {
       
   207     RSemaphore semaphore;
       
   208     HBufC* semaphorename = HBufC::NewL( iServerName->Length() + 10 );
       
   209     TPtr semptr = semaphorename->Des();
       
   210     semptr.Copy( *iServerName );
       
   211     semptr.Append( KSemaphore );
       
   212     
       
   213     TInt result = semaphore.CreateGlobal( *semaphorename, 0 );
       
   214     if (result != KErrNone)
       
   215         {
       
   216         delete semaphorename;
       
   217         return ;
       
   218         }
       
   219 
       
   220     TRAP(result, CreateServerProcess());
       
   221     if (result != KErrNone)
       
   222         {
       
   223         return ;
       
   224         }
       
   225 
       
   226     semaphore.Wait();
       
   227     semaphore.Close();
       
   228     delete semaphorename;
       
   229     return ;
       
   230     }
       
   231         
       
   232 // ---------------------------------------------------------------------------
       
   233 // CreateServerProcess
       
   234 // ---------------------------------------------------------------------------
       
   235 //
       
   236 void CServerMonitor::CreateServerProcess()
       
   237     {
       
   238     TInt result;
       
   239 
       
   240     const TUidType serverUid( KNullUid, KNullUid, iServerUid);
       
   241     
       
   242     HBufC* servernameext = HBufC::NewL( iServerName->Length() + 4 );
       
   243     TPtr ptr = servernameext->Des();
       
   244     ptr.Copy( *iServerName );
       
   245     ptr.Append( KExtension );
       
   246     //result = iProcess.Create( *iServerName, KNullDesC, serverUid);
       
   247     result = iProcess.Create( *iServerName, KNullDesC);
       
   248     if (result != KErrNone)
       
   249         {
       
   250         delete servernameext;
       
   251         return ;
       
   252         }
       
   253 
       
   254 
       
   255     // start process and wait until it is constructed                
       
   256     iProcess.Rendezvous(iStatus);
       
   257     
       
   258     if( iStatus != KRequestPending )
       
   259         {
       
   260         iProcess.Kill( 0 );   // abort startup
       
   261         }
       
   262     else
       
   263         {    
       
   264         iProcess.Resume();    // logon OK - start the server   
       
   265         iState = EWaitingRendezvous;
       
   266         SetActive();
       
   267         
       
   268         }
       
   269     delete servernameext;
       
   270     return ;
       
   271     }
       
   272 
       
   273 // ---------------------------------------------------------------------------
       
   274 // CreateServerProcess
       
   275 // ---------------------------------------------------------------------------
       
   276 //
       
   277 void CServerMonitor::ShutdownServer()
       
   278     {
       
   279     HBufC* servername = HBufC16::NewLC( iServerName->Length() + 5 );
       
   280     TPtr servernameptr = servername->Des();
       
   281     servernameptr.Copy( *iServerName );
       
   282     servernameptr.Append( KExtension );
       
   283     servernameptr.Append( KStar );
       
   284     TFindProcess processFinder( *servername );
       
   285     TFullName result;
       
   286     RProcess processHandle;
       
   287     while ( processFinder.Next(result) == KErrNone) 
       
   288     {
       
   289        User::LeaveIfError(processHandle.Open ( processFinder, EOwnerThread));
       
   290        processHandle.Kill(KErrNone);
       
   291        processHandle.Close();
       
   292     }
       
   293     CleanupStack::PopAndDestroy( servername );
       
   294     }