Add support for specifying child process cwd and env to wxExecute().

Add an optional wxExecuteEnv parameter to wxExecute() which allows to specify
the initial working directory and custom environment for the child process.

Closes #12163.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65896 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-10-24 22:40:11 +00:00
parent fab8784c71
commit 164db92c14
11 changed files with 424 additions and 43 deletions

View File

@@ -543,6 +543,43 @@ wxString wxGetCurrentDir()
#endif // 0
// ----------------------------------------------------------------------------
// Environment
// ----------------------------------------------------------------------------
bool wxGetEnvMap(wxEnvVariableHashMap *map)
{
wxCHECK_MSG( map, false, wxS("output pointer can't be NULL") );
#if defined(__VISUALC__)
wxChar **env = _tenviron;
#else // non-MSVC
// Not sure if other compilers have _tenviron so use the (more standard)
// ANSI version only for them.
char ** env = environ;
#endif
if ( env )
{
wxString name,
value;
while ( *env )
{
const wxString var(*env);
name = var.BeforeFirst(wxS('='), &value);
(*map)[name] = value;
env++;
}
return true;
}
return false;
}
// ----------------------------------------------------------------------------
// wxExecute
// ----------------------------------------------------------------------------
@@ -590,13 +627,14 @@ static bool ReadAll(wxInputStream *is, wxArrayString& output)
static long wxDoExecuteWithCapture(const wxString& command,
wxArrayString& output,
wxArrayString* error,
int flags)
int flags,
const wxExecuteEnv *env)
{
// create a wxProcess which will capture the output
wxProcess *process = new wxProcess;
process->Redirect();
long rc = wxExecute(command, wxEXEC_SYNC | flags, process);
long rc = wxExecute(command, wxEXEC_SYNC | flags, process, env);
#if wxUSE_STREAMS
if ( rc != -1 )
@@ -621,17 +659,19 @@ static long wxDoExecuteWithCapture(const wxString& command,
return rc;
}
long wxExecute(const wxString& command, wxArrayString& output, int flags)
long wxExecute(const wxString& command, wxArrayString& output, int flags,
const wxExecuteEnv *env)
{
return wxDoExecuteWithCapture(command, output, NULL, flags);
return wxDoExecuteWithCapture(command, output, NULL, flags, env);
}
long wxExecute(const wxString& command,
wxArrayString& output,
wxArrayString& error,
int flags)
int flags,
const wxExecuteEnv *env)
{
return wxDoExecuteWithCapture(command, output, &error, flags);
return wxDoExecuteWithCapture(command, output, &error, flags, env);
}
// ----------------------------------------------------------------------------