The Active Object Code
#include "ProcessWatcher.h"
#include
extern RFileLogger *log;
CProcessWatcher::CProcessWatcher() :
CActive(EPriorityStandard) // Standard priority
{
}
CProcessWatcher* CProcessWatcher::NewLC()
{
CProcessWatcher* self = new ( ELeave ) CProcessWatcher();
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
CProcessWatcher* CProcessWatcher::NewL()
{
CProcessWatcher* self = CProcessWatcher::NewLC();
CleanupStack::Pop(); // self;
return self;
}
void CProcessWatcher::ConstructL()
{
User::LeaveIfError(iTimer.CreateLocal() ); // Initialize timer
CActiveScheduler::Add( this); // Add to scheduler
}
CProcessWatcher::~CProcessWatcher()
{
Cancel(); // Cancel any request, if outstanding
iTimer.Close(); // Destroy the RTimer object
iProcess.Close(); //Close the Process
// Delete instance variables if any
}
void CProcessWatcher::DoCancel()
{
iTimer.Cancel();
}
void CProcessWatcher::StartL(TTimeIntervalMicroSeconds32 aDelay)
{
Cancel(); // Cancel any request, just to be sure
iState = EUninitialized;
iTimer.After(iStatus, aDelay); // Set for later
SetActive(); // Tell scheduler a request is active
}
void CProcessWatcher::RunL()
{
if (iState == EUninitialized)
{
// Do something the first time RunL() is called
iState = EInitialized;
CheckAndRun();
}
else
{
if (iState != EError)
{
CheckAndRun();
}
}
iTimer.After(iStatus, 300000000); // Do kill every hour
SetActive(); // Tell scheduler a request is active
}
TInt CProcessWatcher::RunError(TInt aError)
{
return aError;
}
TBool CProcessWatcher::IsApplicationRunning(void)
{
TBool Ret(EFalse);
TFileName res;
TFindProcess find;
while(find.Next(res) == KErrNone)
{
RProcess ph;
ph.Open(res);
if(ph.SecureId() == 0x00000013)
{
Ret = ETrue;
break;
}
ph.Close();
}
return Ret;
}
void CProcessWatcher::CheckAndRun()
{
//Check if Application is Running
TBool running = IsApplicationRunning();
log->WriteFormat(_L("Iteration = %d"), iIteration);
if (running)
{
log->Write(_L("CProcessWatcher::RunL:Application is ON..."));
if (iIteration >= 12)
{
//Application is Running
iProcess.Kill(0);
log->Write(_L("CProcessWatcher::RunL:Application KILLED..."));
//Attempt to Start Application
iProcess.Create(KApplicationExeFile, KNullDesC);
iProcess.Resume();
log->Write(_L("CProcessWatcher::RunL:Re-starting Application..."));
iIteration = 0; //reset the counter
}
}
else
{
//Application is not Running
log->Write(_L("CProcessWatcher::RunL:Application is OFF..."));
//Attempt to Start Application
iProcess.Create(KApplicationExeFile, KNullDesC);
iProcess.Resume();
log->Write(_L("CProcessWatcher::RunL:Ran Application Executable"));
iIteration = 0; //reset the counter
}
iIteration++; //Increment the iteration
}
TInt CProcessWatcher::whatIsBatteryLevel()
{
TInt level = 0;
//To be completed.
return level;
}