testexecmgmt/ucc/Source/ProcessLibrary/proclib_windows.cpp
changeset 0 3da2a79470a7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecmgmt/ucc/Source/ProcessLibrary/proclib_windows.cpp	Mon Mar 08 15:04:18 2010 +0800
@@ -0,0 +1,161 @@
+/*
+* Copyright (c) 2005-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:  
+* Switches
+* System Includes
+*
+*/
+
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <windows.h>
+
+/*******************************************************************************
+ *
+ * Local Includes
+ *
+ ******************************************************************************/
+#include "proclib.h"
+
+/*******************************************************************************
+ *
+ * Definitions
+ *
+ ******************************************************************************/
+
+/*******************************************************************************
+ *
+ * CAProcess
+ *
+ ******************************************************************************/
+CAProcess::CAProcess()
+{
+	memset( &iProcessInfo, 0, sizeof(iProcessInfo) );
+	iProcessState = PS_INIT;
+}
+
+CAProcess::~CAProcess()
+{
+//	assert( (iProcessState == PS_INIT) || (iProcessState == PS_REMOVED) );
+}
+
+
+/*******************************************************************************
+ *
+ * StartProcess()
+ *
+ ******************************************************************************/
+int CAProcess::StartProcess( char *aCommandLine )
+{
+	int err;
+	STARTUPINFO info;
+
+	// check that the commandline is valid
+	assert( aCommandLine != NULL );
+
+	// verify the state
+	assert( iProcessState == PS_INIT );
+
+	// set the startup info to zero (required even though empty)
+	memset( &info, 0, sizeof(info) );
+	info.cb = sizeof(info);
+
+	// create the process
+	err = CreateProcess( NULL, aCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &info, &iProcessInfo );
+	if( err == 0 ) {
+		assert( iProcessInfo.hProcess == NULL );
+		return GetLastError();
+	}
+
+	// update the state
+	iProcessState = PS_STARTED;
+
+	// done
+	return 0;
+}
+
+/*******************************************************************************
+ *
+ * StopProcess()
+ *
+ ******************************************************************************/
+int CAProcess::StopProcess( ) 
+{
+	int err, rv = 0;
+
+	// check the state
+	assert( iProcessState == PS_STARTED );
+		
+	// terminate the process
+	err = TerminateProcess( iProcessInfo.hProcess, -1 );
+	if( err == 0 ) {
+		rv = GetLastError();
+	}
+
+	// update the state
+	iProcessState = PS_STOPPED;
+	return rv;
+}
+
+/*******************************************************************************
+ *
+ * WaitForProcess()
+ *
+ ******************************************************************************/
+int CAProcess::WaitForProcess()
+{
+	int err, rv = 0;
+
+	// check the state
+	assert( (iProcessState == PS_STOPPED) || (iProcessState == PS_STARTED) );
+
+	// now wait
+	err = WaitForSingleObject( iProcessInfo.hProcess, INFINITE );
+	if( err != WAIT_OBJECT_0 ) {
+		rv = err;
+	}
+
+	// update the state
+	iProcessState = PS_REMOVED;
+	return rv;
+}
+
+
+/*******************************************************************************
+ *
+ * GetProcessStatus()
+ *
+ ******************************************************************************/
+TProcessStatus CAProcess::GetProcessStatus()
+{
+	int err;
+
+	// if the state is not started then return
+	if( iProcessState != PS_STARTED ) {
+		return iProcessState;
+	}
+
+	// otherwise see if the process is still running or has stopped itself
+	err = WaitForSingleObject( iProcessInfo.hProcess, 0 );
+	if( err != WAIT_TIMEOUT ) {
+		iProcessState = PS_STOPPED;
+	}
+
+	// return the status
+	return iProcessState;
+}