diff -r 3d09643def13 -r 6bfad47013df qthighway/xqserviceutil/src/xqservicemanager.cpp --- a/qthighway/xqserviceutil/src/xqservicemanager.cpp Fri Sep 17 08:34:25 2010 +0300 +++ b/qthighway/xqserviceutil/src/xqservicemanager.cpp Mon Oct 04 01:32:41 2010 +0300 @@ -44,128 +44,8 @@ #include "xqservicemetadata/xqservicemetadata_p.h" #include #include "xqconversions.h" - - -#define TIMER_DELAY 3000000 // 3000000 microseconds == 3s - -class CProcessInfo : public CActive - { - public: - static void AddProcessL(const TUid& appUid, RProcess& appProcess); - static bool EnsureProcessCanStartL(const TUid& appUid); - - protected: - CProcessInfo(const TUid& appUid); - ~CProcessInfo(); - void ConstructL(RProcess& appProcess); - void DoCancel(); - void RunL(); - - protected: - class ProcessInfoMap - { - public: - ~ProcessInfoMap() - { - foreach (CProcessInfo* info, map.values()) - delete info; - } - QHash map; - }; - - static ProcessInfoMap iProcessInfoMap; - const TUid iAppUid; - }; - - - -CProcessInfo::ProcessInfoMap CProcessInfo::iProcessInfoMap; - -CProcessInfo::CProcessInfo(const TUid& appUid): - CActive(CActive::EPriorityStandard), - iAppUid(appUid) -{ - XQSERVICE_DEBUG_PRINT("CProcessInfo::CProcessInfo"); - - CActiveScheduler::Add(this); -} - -CProcessInfo::~CProcessInfo() -{ - XQSERVICE_DEBUG_PRINT("CProcessInfo::~CProcessInfo"); - - // Cancel asynch request, normally it should be done in DoCancel() - // but we dont wont to cancel request when we cancel active object - User::CancelMiscNotifier(iStatus); - - Cancel(); -} +#include "processinfo.h" -void CProcessInfo::AddProcessL(const TUid& appUid, RProcess& appProcess) -{ - XQSERVICE_DEBUG_PRINT("CProcessInfo::AddProcessL"); - - CProcessInfo* self = new(ELeave) CProcessInfo(appUid); - CleanupStack::PushL(self); - self->ConstructL(appProcess); - CleanupStack::Pop(self); -} - -bool CProcessInfo::EnsureProcessCanStartL(const TUid& appUid) -{ - XQSERVICE_DEBUG_PRINT("CProcessInfo::EnsureProcessCanStartL"); - - bool ret = true; - - CProcessInfo* previousProcess = iProcessInfoMap.map[appUid.iUid]; - if (previousProcess) { - // Timer is for ensure that wait will end. - // Maybe there is possibility that destroing process notification could be lost. - RTimer securityTimer; - securityTimer.CreateLocal(); - CleanupClosePushL(securityTimer); - - TRequestStatus timerStatus; - securityTimer.After(timerStatus, TIMER_DELAY); - User::WaitForRequest(previousProcess->iStatus, timerStatus); - - if (previousProcess->iStatus == KRequestPending) - ret = false; - - CleanupStack::PopAndDestroy(); - delete previousProcess; - iProcessInfoMap.map.remove(appUid.iUid); - } - return ret; -} - -void CProcessInfo::RunL() -{ - XQSERVICE_DEBUG_PRINT("CProcessInfo::RunL"); - - iProcessInfoMap.map.remove(iAppUid.iUid); - delete this; -} - -void CProcessInfo::ConstructL(RProcess& appProcess) -{ - XQSERVICE_DEBUG_PRINT("CProcessInfo::ConstructL"); - - SetActive(); - - EnsureProcessCanStartL(iAppUid); - iProcessInfoMap.map.insert(iAppUid.iUid, this); - appProcess.NotifyDestruction(iStatus); -} - -void CProcessInfo::DoCancel() -{ - XQSERVICE_DEBUG_PRINT("CProcessInfo::DoCancel"); - - // Cancel asynch request, normally it should be done in DoCancel() - // but we dont wont to cancel request when we cancel active object. - // Cancel asynch request is in ~CProcessInfo(). -} /*! \class XQServiceManagerPrivate @@ -475,6 +355,8 @@ // just use the Secure ID as server differentiator //cmdLine->SetServerRequiredL( uid.iUid ); RProcess client; + CleanupClosePushL(client); + cmdLine->SetServerRequiredL(client.Id().Id()); if (embed) { CCoeEnv* env= CCoeEnv::Static(); @@ -500,6 +382,8 @@ if(!CProcessInfo::EnsureProcessCanStartL(uid)) User::Leave(KErrAlreadyExists); } + CleanupStack::PopAndDestroy(&client); + TRequestStatus requestStatusForRendezvous; // start application with command line parameters