#include "wx/process.h"
#include "wx/thread.h"
+#include "wx/cmdline.h"
+
#include "wx/wfstream.h"
#include "wx/private/selectdispatcher.h"
}
// Shutdown or reboot the PC
-bool wxShutdown(wxShutdownFlags wFlags)
+bool wxShutdown(int flags)
{
+ flags &= ~wxSHUTDOWN_FORCE;
+
wxChar level;
- switch ( wFlags )
+ switch ( flags )
{
case wxSHUTDOWN_POWEROFF:
level = _T('0');
level = _T('6');
break;
+ case wxSHUTDOWN_LOGOFF:
+ // TODO: use dcop to log off?
+ return false;
+
default:
wxFAIL_MSG( _T("unknown wxShutdown() flag") );
return false;
}
- return system(wxString::Format(_T("init %c"), level).mb_str()) == 0;
+ return system(wxString::Format("init %c", level).mb_str()) == 0;
}
// ----------------------------------------------------------------------------
}
}
+#if wxUSE_UNICODE
ArgsArray(wchar_t **wargv)
{
int argc = 0;
m_argv[i] = wxSafeConvertWX2MB(wargv[i]).release();
}
}
+#endif // wxUSE_UNICODE
~ArgsArray()
{
int m_argc;
char **m_argv;
- DECLARE_NO_COPY_CLASS(ArgsArray);
+ DECLARE_NO_COPY_CLASS(ArgsArray)
};
} // anonymous namespace
long wxExecute(const wxString& command, int flags, wxProcess *process)
{
- wxArrayString args;
-
- const char *cptr = command.c_str();
-
- // split the command line in arguments
- //
- // TODO: combine this with wxCmdLineParser::ConvertStringToArgs(), it
- // doesn't do exactly the same thing right now but it's pretty close
- // and we shouldn't maintain 2 copies of this code
- do
- {
- wxString argument;
- char quotechar = '\0'; // is arg quoted?
- bool escaped = false;
-
- // eat leading whitespace:
- while ( wxIsspace(*cptr) )
- cptr++;
-
- if ( *cptr == '\'' || *cptr == '"' )
- quotechar = *cptr++;
-
- do
- {
- if ( *cptr == '\\' && !escaped )
- {
- escaped = true;
- cptr++;
- continue;
- }
+ ArgsArray argv(wxCmdLineParser::ConvertStringToArgs(command,
+ wxCMD_LINE_SPLIT_UNIX));
- // all other characters:
- argument += *cptr++;
- escaped = false;
-
- // have we reached the end of the argument?
- if ( (*cptr == quotechar && !escaped)
- || (quotechar == '\0' && wxIsspace(*cptr))
- || *cptr == '\0' )
- {
- args.push_back(argument);
-
- // if not at end of buffer, swallow last character:
- if ( *cptr )
- cptr++;
-
- break; // done with this one, start over
- }
- } while ( *cptr );
- } while ( *cptr );
-
- ArgsArray argv(args);
-
- // do execute the command
return wxExecute(argv, flags, process);
}
+#if wxUSE_UNICODE
+
long wxExecute(wchar_t **wargv, int flags, wxProcess *process)
{
ArgsArray argv(wargv);
return wxExecute(argv, flags, process);
}
+#endif // wxUSE_UNICODE
+
// wxExecute: the real worker function
long wxExecute(char **argv, int flags, wxProcess *process)
{
_T("wxExecute() can be called only from the main thread") );
#endif // wxUSE_THREADS
-#if defined(__DARWIN__)
+#if defined(__WXCOCOA__) || ( defined(__WXOSX_MAC__) && wxOSX_USE_COCOA_OR_CARBON )
// wxMacLaunch() only executes app bundles and only does it asynchronously.
// It returns false if the target is not an app bundle, thus falling
// through to the regular code for non app bundles.
DECLARE_NO_COPY_CLASS(wxEndHandler)
};
-#if wxUSE_STREAMS
+#if HAS_PIPE_INPUT_STREAM
// class for monitoring our ends of child stdout/err, should be constructed
// with the FD and stream from wxExecuteData and will do nothing if they're
DECLARE_NO_COPY_CLASS(wxRedirectedIOHandler)
};
-#endif // wxUSE_STREAMS
+#endif // HAS_PIPE_INPUT_STREAM
// helper function which calls waitpid() and analyzes the result
int DoWaitForChild(int pid, int flags = 0)
}
//else: synchronous execution case
-#if wxUSE_STREAMS
+#if HAS_PIPE_INPUT_STREAM
wxProcess * const process = execData.process;
if ( process && process->IsRedirected() )
{
}
}
//else: no IO redirection, just block waiting for the child to exit
-#endif // wxUSE_STREAMS
+#endif // HAS_PIPE_INPUT_STREAM
return DoWaitForChild(execData.pid);
}