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; }