qthighway/xqserviceutil/src/xqservicemanager.cpp
changeset 27 6bfad47013df
parent 26 3d09643def13
--- 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