dbgagents/trkagent/toolsstarter/toolsstarterserver/src/toolsprocess.cpp
changeset 0 c6b0df440bee
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dbgagents/trkagent/toolsstarter/toolsstarterserver/src/toolsprocess.cpp	Tue Mar 02 10:33:16 2010 +0530
@@ -0,0 +1,223 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+// INCLUDE FILES
+#include <e32std.h>                      
+
+#include "toolsprocess.h" 
+
+#define SafeDelete(x) { if (x) delete x; x = NULL; }
+                   
+// LOCAL FUNCTION PROTOTYPES
+
+// LOCAL CONSTANTS
+
+
+//
+// CProcessTracker constructor
+//
+// Accepts CTrkDispatchLayer interface and the process ID of the
+// process to watch
+//
+CProcessTracker::CProcessTracker(CToolsProcess *aToolsProcess, TUint32 aProcessId)
+    : CActive(EPriorityStandard),
+      iProcessId(aProcessId),
+      iToolsProcess(aToolsProcess)
+{
+    CActiveScheduler::Add(this);
+
+    TInt error = iProcess.Open(iProcessId);
+    if (KErrNone != error)
+        User::Panic(_L("Unable to open process"), __LINE__);
+}
+
+//
+// CProcessTracker destructor
+//
+CProcessTracker::~CProcessTracker()
+{
+    Cancel();
+    Deque();
+    iProcess.Close();
+}
+
+//
+// CProcessTracker::Watch
+//
+// Watch for the process to exit
+//
+void CProcessTracker::Watch()
+{
+    iProcess.Logon(iStatus);
+    SetActive();
+}
+
+//
+// CProcessTracker::RunL
+//
+// Called when the process exits
+//
+void CProcessTracker::RunL()
+{
+    // sometimes this is run when the process has yet to exit
+    if (iProcess.ExitType() == EExitPending)
+    {
+        iProcess.LogonCancel(iStatus);
+        Watch();
+    }
+    else
+    {
+        iToolsProcess->ProcessDied(iProcess.ExitReason());
+    }
+}
+
+//
+// CProcessTracker::DoCancel
+//
+// Stop waiting for this process to exit
+//
+void CProcessTracker::DoCancel()
+{
+    iProcess.LogonCancel(iStatus);
+}
+
+//
+// CToolsProcess implementation
+//
+
+TBool CToolsProcess::iFirstTimeAfterBoot = ETrue;
+//
+// CToolsProcess::NewL
+//
+CToolsProcess* CToolsProcess::NewL(const TDesC& aPath, const TDesC& aArgsUsb, const TDesC& aArgsXti)
+{
+    CToolsProcess* self = new(ELeave) CToolsProcess;
+    self->ConstructL(aPath, aArgsUsb, aArgsXti);
+    return self;
+}
+
+//
+// CTrkEngine::NewLC
+//
+CToolsProcess* CToolsProcess::NewLC(const TDesC& aPath, const TDesC& aArgsUsb, const TDesC& aArgsXti)
+{
+    CToolsProcess* self = new(ELeave) CToolsProcess;
+    CleanupStack::PushL(self);
+    
+    self->ConstructL(aPath, aArgsUsb, aArgsXti);
+    
+    return self;
+}
+
+//
+// CToolsProcess::ConstructL
+// Constructor
+//
+void CToolsProcess::ConstructL(const TDesC& aPath, const TDesC& aArgsUsb, const TDesC& aArgsXti) 
+{
+    iPath.Copy(aPath);
+    iArgsUsb.Copy(aArgsUsb);
+    iArgsXti.Copy(aArgsXti);
+}
+//
+// CToolsProcess::CToolsProcess
+// Constructor
+//
+CToolsProcess::CToolsProcess() 
+            : iRunning(EFalse),
+              iProcessTracker(NULL)
+{
+        
+}
+
+//
+// CToolsProcess::~CToolsProcess
+// Destructor
+//
+CToolsProcess::~CToolsProcess()
+{
+    SafeDelete(iProcessTracker);
+    iProcess.Close();
+}
+
+//
+// CToolsProcess::Start
+//
+TInt CToolsProcess::Start(TCmdLineConnType aConnType) 
+{
+    TBuf<KMaxCmdLineConnArgsLen> cmdConnArgs = _L("");
+    switch (aConnType)
+    {
+        case EUsb:
+            cmdConnArgs = iArgsUsb;
+            break;
+        case EXti:
+            cmdConnArgs = iArgsXti;
+            break;
+        default:
+            return KErrNotFound;
+    }
+  
+    TInt err = KErrNone;
+    // check to see if we have already launched or not.
+    // We only launch the first time and we track the process that we launched
+    // Also check to see if the process is already running or not.
+    // User could have manually launched the application in which case the user needs to 
+    // connect from the tool manually.
+    if (!iRunning)
+    {       
+        err = iProcess.Create(iPath, cmdConnArgs);  
+        if (!err)
+        {
+            iProcessId = iProcess.Id();     
+            iProcess.Resume();        
+          
+        }
+        if (!err)
+        {
+            iRunning = ETrue; //now the process is running..
+        }
+        
+        
+    }
+    
+    return err;
+}
+
+//
+// CToolsProcess::Stop
+//
+void CToolsProcess::Stop() 
+{
+    if (iRunning)
+    {
+        iRunning = EFalse;
+        iProcess.Kill(-1);
+        iProcess.Close();
+        SafeDelete(iProcessTracker);
+    }
+}
+
+//
+// CToolsProcess::Stop
+//
+void CToolsProcess::ProcessDied(TInt aExitReason) 
+{
+    iRunning = EFalse;
+    iProcess.Close();
+    SafeDelete(iProcessTracker);        
+}
+