glib/glibbackend/src/spawn.cpp
changeset 0 e4d67989cc36
child 72 403e7f6ed6c5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/glib/glibbackend/src/spawn.cpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,188 @@
+/*
+* 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 <e32std.h>
+#include <e32base.h>
+#include <e32cons.h>
+#include <utf.h>
+#include <errno.h>
+#include <wchar.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pdrstore.h>
+#include "glibbackend.h"
+
+#define MAX_COMMAND_LINE_LENGTH 256
+
+extern "C"
+{
+	
+EXPORT_C int spawnv(int mode,const char * path,const char **argv)
+{
+	TText16 iPath16[KMaxFileName];
+	char replacePath[KMaxFileName];
+	
+	/* replace / with // */
+	strcpy(replacePath,path);
+	char *temp = strchr(replacePath,'/');
+	while (temp)
+	{
+		*temp = '\\';
+		temp = strchr(replacePath,'/');
+	} // end while
+	
+	// convert narrow char to wide char
+	if(mbstowcs((wchar_t *)iPath16, replacePath, strlen(replacePath)+1) == (size_t)(-1))
+	{
+			return -1;
+	}
+	
+	TBuf16<KMaxFileName> iCmdName16;
+	
+	iCmdName16.FillZ(KMaxFileName);
+	
+	iCmdName16.Copy(iPath16);
+	
+	TInt i;
+	
+	TInt iVal = 0;
+	
+	while(argv[iVal])
+	{
+		iVal++;
+	}	//end while
+		
+	
+	TBuf16<MAX_COMMAND_LINE_LENGTH> iArgv16;
+	
+	iArgv16.FillZ(MAX_COMMAND_LINE_LENGTH);
+	
+	iArgv16.SetLength(0);
+	
+	for(i = 0; i < iVal ; i++)
+	{
+		TText16 temp[MAX_COMMAND_LINE_LENGTH];
+		
+		if(mbstowcs((wchar_t *)temp, argv[i], strlen(argv[i])+1) == (size_t)(-1))
+		{
+				return -1;
+		}
+		
+		TPtrC16 iTemp(temp,strlen(argv[i]));
+		
+		iArgv16.Append(iTemp);
+		
+		if(i != iVal-1)
+			iArgv16.Append(L' ');
+		
+	} // end for
+	
+	RProcess iProcess;
+	TRequestStatus iStatus;
+	TInt iRetVal = iProcess.Create(iCmdName16,iArgv16);
+		
+	if(iRetVal != KErrNone)
+	{
+		switch(iRetVal)
+		{
+			case KErrNotFound : 	errno = ENOENT;
+									break;
+			case KErrNoMemory : 	errno = ENOMEM ;
+									break;
+			case KErrNotSupported : errno = ENOEXEC;
+									break;
+			case KErrBadName : 		errno = ENAMETOOLONG;
+									break;
+			default:   	 	 		break;
+		}
+		
+		return -1;
+	}
+	
+	if(mode == P_WAIT)
+	{
+		iProcess.Logon(iStatus);
+		iProcess.Resume();
+ 		User::WaitForRequest(iStatus);
+ 		iProcess.Close();
+ 		return iStatus.Int();
+	}
+	else
+	{
+		iProcess.Resume();	
+		return iProcess.Id();	
+	}
+}
+
+EXPORT_C int spawnvp(int mode,const char * path,const char **argv)
+{
+	return spawnv(mode,path,argv);
+}
+
+
+static int ValidateHandle(HANDLE handle)
+{
+	RProcess iProcess;
+	if( iProcess.Open(handle) < 0)
+		return 0;
+	
+	THandleInfo handleinfo;
+	iProcess.HandleInfo(&handleinfo);
+	
+	if(handleinfo.iNumOpenInProcess ==0 && handleinfo.iNumOpenInThread == 0 && 
+	 handleinfo.iNumProcesses == 0 && handleinfo.iNumThreads == 0)
+		return 0;
+	else
+		return 1;
+}
+
+EXPORT_C BOOL CloseHandle(HANDLE handle)
+{
+	RProcess iProcess;
+	if( iProcess.Open(handle) < 0)
+		return 0;
+	
+	if(ValidateHandle(handle))
+		iProcess.Close();
+	
+	return 1;
+}
+
+EXPORT_C HANDLE GetCurrentProcess()
+{
+	return RProcess().Id();
+}
+
+BOOL DuplicateHandle(HANDLE hSourceProcessHandle,HANDLE hSourceHandle,HANDLE hTargetProcessHandle,LPHANDLE lpTargetHandle,DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwOptions)
+{
+	return 0;
+}
+
+EXPORT_C int spawnve(int mode,const char * path,const char **argv,const char **envp)
+{
+	return spawnv(mode,path,argv);
+}
+
+EXPORT_C int spawnvpe(int mode,const char * path,const char **argv,const char **envp)
+{
+	return spawnv(mode,path,argv);
+}
+
+
+} /* close extern "C"*/