--- /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);
+}
+