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