--- 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 <xqservicemetadata/xqaiwinterfacedescriptor.h>
#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<TInt32, CProcessInfo*> 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