void XWinProcessLauncher::CreateArgumentsFromFullCommandLine(const VString &inFullCommandLine)
{
	fArrayArg.clear();
	
	/*	ACI0065349 - 2010-03-15, T.A.
		SetBinaryPath() may quote the expression, but here, when CreateArgumentsFromFullCommandLine()
		is called, we assume it's the caller responsibility to properly quote what must be quoted
	*/
	delete [] fBinaryPath;
	fBinaryPath = _CreateCString(inFullCommandLine);
}
void XWinProcessLauncher::SetBinaryPath(const VString &inBinaryPath)
{
	delete [] fBinaryPath;
	fBinaryPath = NULL;

	// ACI0065260 - 2010-03-11, T.A.
	// Add quotes if the path contains a space and is not already quoted
	if( !inBinaryPath.IsEmpty() && inBinaryPath.FindUniChar(CHAR_SPACE) > 0 && inBinaryPath[0] != CHAR_QUOTATION_MARK )
	{
		VString		quotedPath;

		quotedPath = CHAR_QUOTATION_MARK;
		quotedPath += inBinaryPath;
		quotedPath += CHAR_QUOTATION_MARK;
		fBinaryPath = _CreateCString(quotedPath);
	}
	else
	{
		fBinaryPath = _CreateCString(inBinaryPath);
	}
}
void XPosixProcessLauncher::SetBinaryPath(const VString &inBinaryPath)
{
	delete [] fBinaryPath;
	
	fBinaryPath = _CreateCString(inBinaryPath);
	
	// CR 23/04/2007
	// Adds the binary path as the first argument in the array of arguments
	if(fArrayArg.size() == 0)
		fArrayArg.push_back(inBinaryPath);
	else
		fArrayArg[0] = inBinaryPath;
}
void XWinProcessLauncher::SetDefaultDirectory(const VString &inDirectory)
{
	delete [] fCurrentDirectory;
	fCurrentDirectory = NULL;
	
	if(!inDirectory.IsEmpty())
	{
		VFolder		theFolder(inDirectory);
		VString		currentDirectoryPath = theFolder.GetPath().GetPath();

		fCurrentDirectory = _CreateCString(currentDirectoryPath, true);
	}
}
void XPosixProcessLauncher::CreateArgumentsFromFullCommandLine(const VString &inFullCommandLine)
{
	fArrayArg.clear();
	
	if(!inFullCommandLine.IsEmpty())
	{
		char		*commandLineCStr = _CreateCString(inFullCommandLine);
		sLONG		argCount = _AnalyzeCommandLine(commandLineCStr, &fArrayArg);
		
		if(argCount > 0)
			SetBinaryPath(fArrayArg[0]);
		
		delete [] commandLineCStr;
	}
}
wchar_t * XWinProcessLauncher::_CreateConcatenetedArguments()
{
	sLONG		nbArguments	= (sLONG) fArrayArg.size();
	wchar_t *	theArgs		= NULL;
	
	if(nbArguments < 1)
	{
		theArgs = new wchar_t[1];
		theArgs[0] = 0;
	}
	else
	{
		VString		concatenetedArgs;
		concatenetedArgs.SetEmpty();
		
		for(sLONG i = 0; i < nbArguments; ++i)
		{
			// ACI0065260 - 2010-03-11, T.A.
			// Add quotes if the path contains a space and is not already quoted
			if( !fArrayArg[i].IsEmpty() && fArrayArg[i].FindUniChar(CHAR_SPACE) > 0 && fArrayArg[i][0] != CHAR_QUOTATION_MARK )
			{
				VString		quotedArg;

				quotedArg = CHAR_QUOTATION_MARK;
				quotedArg += fArrayArg[i];
				quotedArg += CHAR_QUOTATION_MARK;

				concatenetedArgs.AppendString(quotedArg);
			}
			else
			{
				concatenetedArgs.AppendString(fArrayArg[i]);
			}
			if(i < (nbArguments - 1))
				concatenetedArgs.AppendChar(' ');
		}

		theArgs = _CreateCString(concatenetedArgs, true);
	}
	
	return theArgs;
}
void XPosixProcessLauncher::_BuildArrayEnvironmentVariables(const EnvVarNamesAndValuesMap &inVarToUse, char **&outArrayEnv)
{
/*	An environment variable array for Unix is a pointer to a null-terminated array of character pointers to null-terminated strings
	Each element is formated "var_name=var_value", ie "PHP_FCGI_CHILDREN=1"
*/
	// Dispose the previous array of arguments if not NULL
	_Free2DCharArray(outArrayEnv);
	
	if(inVarToUse.empty())
		return;
	
	// Don't handle empty names
	sLONG		nbNonEmptyNames = 0;
	
	EnvVarNamesAndValuesMap::const_iterator	envVarIterator = inVarToUse.begin();
	while(envVarIterator != inVarToUse.end())
	{
		if(!envVarIterator->first.IsEmpty())
			++nbNonEmptyNames;
		
		++envVarIterator;
	}
	
	if(nbNonEmptyNames == 0)
		return;
	
	size_t outArrayEnvLength = (nbNonEmptyNames + 1) * sizeof(char *);// +1 for last NULL element
	outArrayEnv = (char **)gMemory->NewPtrClear(outArrayEnvLength, 0);
	if(outArrayEnv == NULL)
	{
		assert(false);
		return;
	}
		
	XBOX::VString	oneEnvVarAndValue;
	
	nbNonEmptyNames = 0;
	
	envVarIterator = inVarToUse.begin();
	while(envVarIterator != inVarToUse.end())
	{
		oneEnvVarAndValue = envVarIterator->first;
		if(!oneEnvVarAndValue.IsEmpty())
		{
			oneEnvVarAndValue += "=";
			oneEnvVarAndValue += envVarIterator->second;
			
			char *oneFinalEntry = _CreateCString(oneEnvVarAndValue);
			if(testAssert(oneFinalEntry != NULL))
			{
				++nbNonEmptyNames;
				outArrayEnv[nbNonEmptyNames - 1] = oneFinalEntry;
			}
			else
			{
				break;
			}
		}
		
		++envVarIterator;
	}
	outArrayEnv[nbNonEmptyNames] = NULL;
}
// Environment block == null-terminated block of null-terminated strings of the form: name=value\0
char * XWinProcessLauncher::_CreateEnvironmentVariablesBlock(const EnvVarNamesAndValuesMap &inVarToUse)
{
	char	*initialEnvStrings = NULL;
	VMemoryBuffer<>		allStrings;
	char * theEnvVarBlock = NULL;

	// Initial environment variables
	initialEnvStrings = ::GetEnvironmentStrings();
	if(initialEnvStrings != NULL)
	{
		char *currentStr = initialEnvStrings;
		size_t	fullStrSize;
		while(*currentStr)
		{
			fullStrSize = strlen(currentStr) + 1;
			allStrings.PutData(allStrings.GetDataSize(), currentStr, fullStrSize);
			currentStr += fullStrSize;
		}
	}

	// Prepare our envir. variables
	if(!inVarToUse.empty())
	{
		XBOX::VString	oneEnvVarAndValue;
	// Calculate final buffer size (concatenate name=value and add the 0 terminattion)
		EnvVarNamesAndValuesMap::const_iterator	envVarIterator = inVarToUse.begin();
		while(envVarIterator != inVarToUse.end())
		{
			oneEnvVarAndValue = envVarIterator->first;
			if(!oneEnvVarAndValue.IsEmpty())
			{
				oneEnvVarAndValue += "=";
				oneEnvVarAndValue += envVarIterator->second;

				char *varValueCStr = _CreateCString(oneEnvVarAndValue);
				if(testAssert(varValueCStr != NULL))
				{
					allStrings.PutData(allStrings.GetDataSize(), varValueCStr, strlen(varValueCStr) + 1);
					delete [] varValueCStr;
				}
			}			
			++envVarIterator;
		}
	} //if(!inVarToUse.empty())

	if(allStrings.GetDataSize() > 0)
	{
		char	theZero = 0;
		allStrings.PutData(allStrings.GetDataSize(), &theZero, 1);

		theEnvVarBlock = new char[allStrings.GetDataSize()];
		if(testAssert(theEnvVarBlock))
			allStrings.GetData(0, theEnvVarBlock, allStrings.GetDataSize());
	}
	
	if(initialEnvStrings != NULL)
		::FreeEnvironmentStrings(initialEnvStrings);
	
	return theEnvVarBlock;

}