24#if !defined(B7FD926CACF346B0BA927D19810BDA19)
25#define B7FD926CACF346B0BA927D19810BDA19
27#include <miktex/Core/config.h>
39#include <miktex/Util/PathName>
41#include "Exceptions.h"
43MIKTEX_CORE_BEGIN_NAMESPACE;
54 virtual bool MIKTEXTHISCALL
OnProcessOutput(
const void* output, std::size_t n) = 0;
63 virtual bool MIKTEXTHISCALL OnProcessError(
const void* error, std::size_t n) = 0;
68template<std::
size_t MaxStdoutSize_ = 1024, std::
size_t ExpectedStdoutSize_ = 1024>
class ProcessOutput :
73 stdoutBytes(ExpectedStdoutSize_)
78 bool MIKTEXTHISCALL
OnProcessOutput(
const void* bytes, std::size_t nBytes)
override
81#pragma push_macro("min")
84 std::size_t n = std::min(nBytes, MaxStdoutSize_ - stdoutOffset);
85#if defined(MIKTEX_WINDOWS)
86#pragma pop_macro("min")
90 stdoutBytes.reserve(stdoutOffset + n);
91 std::copy(
reinterpret_cast<const uint8_t*
>(bytes),
reinterpret_cast<const uint8_t*
>(bytes) + n, stdoutBytes.data() + stdoutOffset);
112 result.reserve(stdoutOffset);
113 result.assign(
reinterpret_cast<const char*
>(stdoutBytes.data()),
reinterpret_cast<const char*
>(stdoutBytes.data() + stdoutOffset));
118 std::vector<uint8_t> stdoutBytes;
121 std::size_t stdoutOffset = 0;
125struct ProcessStartInfo
134#if defined(MIKTEX_WINDOWS)
142#if defined(MIKTEX_WINDOWS)
167 FileName(fileName.ToString())
204 virtual MIKTEXTHISCALL
~Process()
noexcept = 0;
247 virtual bool MIKTEXTHISCALL
get_Exception(MiKTeX::Core::MiKTeXException& ex)
const = 0;
251 virtual void MIKTEXTHISCALL
Close() = 0;
261 virtual std::unique_ptr<Process> MIKTEXTHISCALL
get_Parent() = 0;
282 static MIKTEXCORECEEAPI(std::unique_ptr<Process>)
GetProcess(
int systemId);
292 static MIKTEXCORECEEAPI(std::unique_ptr<Process>)
StartSystemCommand(
const std::string& commandLine, FILE** ppFileStandardInput, FILE** ppFileStandardOutput);
339 Run(fileName, std::vector<std::string>{ fileName.ToString() });
374 static MIKTEXCORECEEAPI(
bool)
Run(
const MiKTeX::Util::PathName& fileName,
const std::vector<std::string>& arguments, std::function<
bool(
const void*, std::size_t)> callback,
int* exitCode, MiKTeXException* miktexException,
const char* workingDirectory);
388 return Run(fileName, arguments, callback, exitCode,
nullptr, workingDirectory);
407 static MIKTEXCORECEEAPI(
void)
Start(
const MiKTeX::Util::PathName& fileName,
const std::vector<std::string>& arguments, FILE* pFileStandardInput, FILE** ppFileStandardInput, FILE** ppFileStandardOutput, FILE** ppFileStandardError,
const char* workingDirectory);
414 Start(fileName, std::vector<std::string>{ fileName.GetFileNameWithoutExtension().ToString() },
nullptr,
nullptr,
nullptr,
nullptr,
nullptr);
424 Start(fileName, arguments,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr);
428 static MIKTEXCORECEEAPI(
void) Overlay(
const MiKTeX::Util::PathName& fileName,
const std::vector<std::string>& arguments);
431MIKTEX_CORE_END_NAMESPACE;
Run process callback interface.
Definition Process.h:47
virtual bool OnProcessOutput(const void *output, std::size_t n)=0
An instance of this class manages a child process.
Definition Process.h:202
virtual ProcessInfo GetProcessInfo()=0
static void Run(const MiKTeX::Util::PathName &fileName, const std::vector< std::string > &arguments, IRunProcessCallback *callback)
static void Start(const MiKTeX::Util::PathName &fileName, const std::vector< std::string > &arguments, FILE *pFileStandardInput, FILE **ppFileStandardInput, FILE **ppFileStandardOutput, FILE **ppFileStandardError, const char *workingDirectory)
static void StartSystemCommand(const std::string &commandLine)
Definition Process.h:297
static std::unique_ptr< Process > GetProcess(int systemId)
static void Run(const MiKTeX::Util::PathName &fileName)
Definition Process.h:337
static std::unique_ptr< Process > StartSystemCommand(const std::string &commandLine, FILE **ppFileStandardInput, FILE **ppFileStandardOutput)
static bool Run(const MiKTeX::Util::PathName &fileName, const std::vector< std::string > &arguments, IRunProcessCallback *callback, int *exitCode, MiKTeXException *miktexException, const char *workingDirectory)
static void Run(const MiKTeX::Util::PathName &fileName, const std::vector< std::string > &arguments)
virtual bool get_Exception(MiKTeX::Core::MiKTeXException &ex) const =0
virtual int GetSystemId()=0
static bool ExecuteSystemCommand(const std::string &commandLine, int *exitCode)
virtual std::string get_ProcessName()=0
static bool Run(const MiKTeX::Util::PathName &fileName, const std::vector< std::string > &arguments, IRunProcessCallback *callback, int *exitCode, const char *workingDirectory)
Definition Process.h:386
virtual void WaitForExit()=0
Waits for the process to finish.
virtual FILE * get_StandardOutput()=0
static std::vector< std::string > GetInvokerNames()
virtual FILE * get_StandardError()=0
static std::unique_ptr< Process > GetCurrentProcess()
static void Start(const MiKTeX::Util::PathName &fileName)
Definition Process.h:412
virtual std::unique_ptr< Process > get_Parent()=0
virtual ProcessExitStatus get_ExitStatus() const =0
static void Start(const MiKTeX::Util::PathName &fileName, const std::vector< std::string > &arguments)
Definition Process.h:422
static bool ExecuteSystemCommand(const std::string &commandLine)
virtual void Close()=0
Frees all resources associated with this Process object.
static bool Run(const MiKTeX::Util::PathName &fileName, const std::vector< std::string > &arguments, std::function< bool(const void *, std::size_t)> callback, int *exitCode, MiKTeXException *miktexException, const char *workingDirectory)
static bool ExecuteSystemCommand(const std::string &commandLine, int *exitCode, IRunProcessCallback *callback, const char *workingDirectory)
static std::unique_ptr< Process > Start(const ProcessStartInfo &startinfo)
virtual bool WaitForExit(int milliseconds)=0
virtual int get_ExitCode() const =0
virtual FILE * get_StandardInput()=0
std::vector< uint8_t > GetStandardOutput() const
Definition Process.h:100
bool OnProcessOutput(const void *bytes, std::size_t nBytes) override
Definition Process.h:78
std::string StdoutToString() const
Definition Process.h:108
Instances of this class can be used to store path names.
Definition PathName.h:64
ProcessExitStatus
Process exit status.
Definition Process.h:185
ProcessStatus
Process status.
Definition Process.h:174
Process information.
Definition Process.h:194
Process start options.
Definition Process.h:126
FILE * StandardOutput
Pointer to the output FILE for stdout redirection.
Definition Process.h:144
bool RedirectStandardError
Indicates whether error output shall be written to a pipe.
Definition Process.h:148
bool RedirectStandardOutput
Indicates whether output shall be written to a pipe.
Definition Process.h:154
FILE * StandardInput
Pointer to the input FILE stream for stdin redirection.
Definition Process.h:140
bool Daemonize
Indicates whether the process should be detached.
Definition Process.h:160
std::string FileName
File system path to the executable file.
Definition Process.h:132
std::vector< std::string > Arguments
Definition Process.h:129
bool RedirectStandardInput
Indicates whether input shall be read from a pipe.
Definition Process.h:151
std::string WorkingDirectory
Working directory for the process.
Definition Process.h:157
FILE * StandardError
Pointer to the output FILE for stderr redirection.
Definition Process.h:136