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;
134#if defined(MIKTEX_WINDOWS)
136 FILE* StandardError =
nullptr;
140 FILE* StandardInput =
nullptr;
142#if defined(MIKTEX_WINDOWS)
144 FILE* StandardOutput =
nullptr;
148 bool RedirectStandardError =
false;
151 bool RedirectStandardInput =
false;
154 bool RedirectStandardOutput =
false;
160 bool Daemonize =
false;
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);
299 auto process = StartSystemCommand(commandLine,
nullptr,
nullptr);
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
A callback interface to save process output.
Definition: Process.h:70
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:73
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
std::string FileName
File system path to the executable file.
Definition: Process.h:132
std::vector< std::string > Arguments
Definition: Process.h:129
std::string WorkingDirectory
Working directory for the process.
Definition: Process.h:157