SDL3pp
A slim C++ wrapper for SDL3
Loading...
Searching...
No Matches
SDL3pp_process.h
1#ifndef SDL3PP_PROCESS_H_
2#define SDL3PP_PROCESS_H_
3
4#include <SDL3/SDL_process.h>
5#include "SDL3pp_iostream.h"
6#include "SDL3pp_properties.h"
7#include "SDL3pp_stdinc.h"
8
9namespace SDL {
10
33// Forward decl
34struct Process;
35
37using ProcessRaw = SDL_Process*;
38
39// Forward decl
40struct ProcessRef;
41
44{
46
49 : value(value)
50 {
51 }
52
54 constexpr ProcessParam(std::nullptr_t _ = nullptr)
55 : value(nullptr)
56 {
57 }
58
60 constexpr explicit operator bool() const { return !!value; }
61
63 constexpr auto operator<=>(const ProcessParam& other) const = default;
64
66 constexpr operator ProcessRaw() const { return value; }
67};
68
109using ProcessIO = SDL_ProcessIO;
110
112 SDL_PROCESS_STDIO_INHERITED;
114
116 SDL_PROCESS_STDIO_NULL;
117
122constexpr ProcessIO PROCESS_STDIO_APP = SDL_PROCESS_STDIO_APP;
123
125constexpr ProcessIO PROCESS_STDIO_REDIRECT = SDL_PROCESS_STDIO_REDIRECT;
126
137{
138 ProcessRaw m_resource = nullptr;
139
140public:
142 constexpr Process(std::nullptr_t = nullptr) noexcept
143 : m_resource(0)
144 {
145 }
146
154 constexpr explicit Process(const ProcessRaw resource) noexcept
155 : m_resource(resource)
156 {
157 }
158
160 constexpr Process(const Process& other) = delete;
161
163 constexpr Process(Process&& other) noexcept
164 : Process(other.release())
165 {
166 }
167
168 constexpr Process(const ProcessRef& other) = delete;
169
170 constexpr Process(ProcessRef&& other) = delete;
171
211 Process(const char* const* args, bool pipe_stdio)
212 : m_resource(SDL_CreateProcess(args, pipe_stdio))
213 {
214 }
215
287 : m_resource(SDL_CreateProcessWithProperties(props))
288 {
289 }
290
292 ~Process() { SDL_DestroyProcess(m_resource); }
293
295 constexpr Process& operator=(Process&& other) noexcept
296 {
297 std::swap(m_resource, other.m_resource);
298 return *this;
299 }
300
301protected:
303 constexpr Process& operator=(const Process& other) noexcept = default;
304
305public:
307 constexpr ProcessRaw get() const noexcept { return m_resource; }
308
310 constexpr ProcessRaw release() noexcept
311 {
312 auto r = m_resource;
313 m_resource = nullptr;
314 return r;
315 }
316
318 constexpr auto operator<=>(const Process& other) const noexcept = default;
319
321 constexpr explicit operator bool() const noexcept { return !!m_resource; }
322
324 constexpr operator ProcessParam() const noexcept { return {m_resource}; }
325
340 void Destroy();
341
371
398 StringResult Read(int* exitcode = nullptr);
399
424 template<class T>
425 OwnArray<T> ReadAs(int* exitcode = nullptr)
426 {
427 StringResult data = Read(exitcode);
428 if (data.empty()) return {};
429 size_t sz = data.size() / sizeof(T);
430 return OwnArray{static_cast<T*>(data.release()), sz};
431 }
432
457
480
500 void Kill(bool force);
501
532 bool Wait(bool block, int* exitcode);
533};
534
537{
538 using Process::Process;
539
547 ProcessRef(ProcessParam resource) noexcept
548 : Process(resource.value)
549 {
550 }
551
559 ProcessRef(ProcessRaw resource) noexcept
560 : Process(resource)
561 {
562 }
563
565 ProcessRef(const ProcessRef& other) noexcept
566 : Process(other.get())
567 {
568 }
569
572};
573
613inline Process CreateProcess(const char* const* args, bool pipe_stdio)
614{
615 return Process(args, pipe_stdio);
616}
617
689{
690 return Process(props);
691}
692
693namespace prop::process {
694
695constexpr auto CREATE_ARGS_POINTER = SDL_PROP_PROCESS_CREATE_ARGS_POINTER;
696
697constexpr auto CREATE_ENVIRONMENT_POINTER =
698 SDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER;
699
700#if SDL_VERSION_ATLEAST(3, 4, 0)
701
702constexpr auto CREATE_WORKING_DIRECTORY_STRING =
703 SDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING;
704
705#endif // SDL_VERSION_ATLEAST(3, 4, 0)
706
707constexpr auto CREATE_STDIN_NUMBER = SDL_PROP_PROCESS_CREATE_STDIN_NUMBER;
708
709constexpr auto CREATE_STDIN_POINTER = SDL_PROP_PROCESS_CREATE_STDIN_POINTER;
710
711constexpr auto CREATE_STDOUT_NUMBER = SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER;
712
713constexpr auto CREATE_STDOUT_POINTER = SDL_PROP_PROCESS_CREATE_STDOUT_POINTER;
714
715constexpr auto CREATE_STDERR_NUMBER = SDL_PROP_PROCESS_CREATE_STDERR_NUMBER;
716
717constexpr auto CREATE_STDERR_POINTER = SDL_PROP_PROCESS_CREATE_STDERR_POINTER;
718
719constexpr auto CREATE_STDERR_TO_STDOUT_BOOLEAN =
720 SDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN;
721
722constexpr auto CREATE_BACKGROUND_BOOLEAN =
723 SDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN;
724
725#if SDL_VERSION_ATLEAST(3, 4, 0)
726
727constexpr auto CREATE_CMDLINE_STRING = SDL_PROP_PROCESS_CREATE_CMDLINE_STRING;
728
729#endif // SDL_VERSION_ATLEAST(3, 4, 0)
730
731constexpr auto PID_NUMBER = SDL_PROP_PROCESS_PID_NUMBER;
732
733constexpr auto STDIN_POINTER = SDL_PROP_PROCESS_STDIN_POINTER;
734
735constexpr auto STDOUT_POINTER = SDL_PROP_PROCESS_STDOUT_POINTER;
736
737constexpr auto STDERR_POINTER = SDL_PROP_PROCESS_STDERR_POINTER;
738
739constexpr auto BACKGROUND_BOOLEAN = SDL_PROP_PROCESS_BACKGROUND_BOOLEAN;
740
741} // namespace prop::process
742
773{
774 return {CheckError(SDL_GetProcessProperties(process))};
775}
776
778{
779 return SDL::GetProcessProperties(m_resource);
780}
781
809inline StringResult ReadProcess(ProcessParam process, int* exitcode = nullptr)
810{
811 size_t size = 0;
812 auto data = static_cast<char*>(SDL_ReadProcess(process, &size, exitcode));
813 return StringResult(CheckError(data), size);
814}
815
816inline StringResult Process::Read(int* exitcode)
817{
818 return SDL::ReadProcess(m_resource, exitcode);
819}
820
846{
847 return {SDL_GetProcessInput(process)};
848}
849
851{
852 return SDL::GetProcessInput(m_resource);
853}
854
878{
879 return {SDL_GetProcessOutput(process)};
880}
881
883{
884 return SDL::GetProcessOutput(m_resource);
885}
886
906inline void KillProcess(ProcessParam process, bool force)
907{
908 CheckError(SDL_KillProcess(process, force));
909}
910
911inline void Process::Kill(bool force) { SDL::KillProcess(m_resource, force); }
912
944inline bool WaitProcess(ProcessParam process, bool block, int* exitcode)
945{
946 return SDL_WaitProcess(process, block, exitcode);
947}
948
949inline bool Process::Wait(bool block, int* exitcode)
950{
951 return SDL::WaitProcess(m_resource, block, exitcode);
952}
953
970inline void DestroyProcess(ProcessRaw process) { SDL_DestroyProcess(process); }
971
973
975
976} // namespace SDL
977
978#endif /* SDL3PP_PROCESS_H_ */
Base class for SDL memory allocated array wrap.
Definition: SDL3pp_ownPtr.h:44
constexpr bool empty() const
True if size() == 0.
Definition: SDL3pp_ownPtr.h:74
T * release()
Release control on object.
Definition: SDL3pp_ownPtr.h:91
constexpr size_t size() const
Size.
Definition: SDL3pp_ownPtr.h:83
An opaque handle representing a system process.
Definition: SDL3pp_process.h:137
constexpr auto operator<=>(const Process &other) const noexcept=default
Comparison.
constexpr Process(Process &&other) noexcept
Move constructor.
Definition: SDL3pp_process.h:163
Process(const char *const *args, bool pipe_stdio)
Create a new process.
Definition: SDL3pp_process.h:211
constexpr ProcessRaw release() noexcept
Retrieves underlying ProcessRaw and clear this.
Definition: SDL3pp_process.h:310
constexpr Process & operator=(const Process &other) noexcept=default
Assignment operator.
constexpr Process(const ProcessRaw resource) noexcept
Constructs from ProcessParam.
Definition: SDL3pp_process.h:154
constexpr Process & operator=(Process &&other) noexcept
Assignment operator.
Definition: SDL3pp_process.h:295
constexpr ProcessRaw get() const noexcept
Retrieves underlying ProcessRaw.
Definition: SDL3pp_process.h:307
constexpr Process(std::nullptr_t=nullptr) noexcept
Default ctor.
Definition: SDL3pp_process.h:142
Process(PropertiesParam props)
Create a new process with the specified properties.
Definition: SDL3pp_process.h:286
OwnArray< T > ReadAs(int *exitcode=nullptr)
Read all the output from a process.
Definition: SDL3pp_process.h:425
constexpr Process(const Process &other)=delete
Copy constructor.
~Process()
Destructor.
Definition: SDL3pp_process.h:292
constexpr void CheckError(bool result)
Check and throw if returned value from SDL is an error.
Definition: SDL3pp_error.h:197
IOStreamRef GetOutput()
Get the IOStream associated with process standard output.
Definition: SDL3pp_process.h:882
void KillProcess(ProcessParam process, bool force)
Stop a process.
Definition: SDL3pp_process.h:906
void Destroy()
Destroy a previously created process object.
Definition: SDL3pp_process.h:972
SDL_ProcessIO ProcessIO
Description of where standard I/O should be directed when creating a process.
Definition: SDL3pp_process.h:109
IOStreamRef GetProcessOutput(ProcessParam process)
Get the IOStream associated with process standard output.
Definition: SDL3pp_process.h:877
StringResult ReadProcess(ProcessParam process, int *exitcode=nullptr)
Read all the output from a process.
Definition: SDL3pp_process.h:809
PropertiesRef GetProperties() const
Get the properties associated with a process.
Definition: SDL3pp_process.h:777
IOStreamRef GetProcessInput(ProcessParam process)
Get the IOStream associated with process standard input.
Definition: SDL3pp_process.h:845
Process CreateProcess(const char *const *args, bool pipe_stdio)
Create a new process.
Definition: SDL3pp_process.h:613
Process CreateProcessWithProperties(PropertiesParam props)
Create a new process with the specified properties.
Definition: SDL3pp_process.h:688
constexpr ProcessIO PROCESS_STDIO_APP
The I/O stream is connected to a new IOStream that the application can read or write.
Definition: SDL3pp_process.h:122
constexpr ProcessIO PROCESS_STDIO_NULL
The I/O stream is ignored.
Definition: SDL3pp_process.h:115
bool Wait(bool block, int *exitcode)
Wait for a process to finish.
Definition: SDL3pp_process.h:949
void Kill(bool force)
Stop a process.
Definition: SDL3pp_process.h:911
bool WaitProcess(ProcessParam process, bool block, int *exitcode)
Wait for a process to finish.
Definition: SDL3pp_process.h:944
PropertiesRef GetProcessProperties(ProcessParam process)
Get the properties associated with a process.
Definition: SDL3pp_process.h:772
void DestroyProcess(ProcessRaw process)
Destroy a previously created process object.
Definition: SDL3pp_process.h:970
IOStreamRef GetInput()
Get the IOStream associated with process standard input.
Definition: SDL3pp_process.h:850
SDL_Process * ProcessRaw
Alias to raw representation for Process.
Definition: SDL3pp_process.h:37
constexpr ProcessIO PROCESS_STDIO_REDIRECT
The I/O stream is redirected to an existing IOStream.
Definition: SDL3pp_process.h:125
constexpr ProcessIO PROCESS_STDIO_INHERITED
The I/O stream is inherited from the application.
Definition: SDL3pp_process.h:111
StringResult Read(int *exitcode=nullptr)
Read all the output from a process.
Definition: SDL3pp_process.h:816
Main include header for the SDL3pp library.
Semi-safe reference for IOStream.
Definition: SDL3pp_iostream.h:1655
Safely wrap Process for non owning parameters.
Definition: SDL3pp_process.h:44
constexpr ProcessParam(std::nullptr_t _=nullptr)
Constructs null/invalid.
Definition: SDL3pp_process.h:54
constexpr ProcessParam(ProcessRaw value)
Constructs from ProcessRaw.
Definition: SDL3pp_process.h:48
constexpr auto operator<=>(const ProcessParam &other) const =default
Comparison.
ProcessRaw value
parameter's ProcessRaw
Definition: SDL3pp_process.h:45
Semi-safe reference for Process.
Definition: SDL3pp_process.h:537
ProcessRef(const ProcessRef &other) noexcept
Copy constructor.
Definition: SDL3pp_process.h:565
~ProcessRef()
Destructor.
Definition: SDL3pp_process.h:571
ProcessRef(ProcessRaw resource) noexcept
Constructs from ProcessParam.
Definition: SDL3pp_process.h:559
ProcessRef(ProcessParam resource) noexcept
Constructs from ProcessParam.
Definition: SDL3pp_process.h:547
Safely wrap Properties for non owning parameters.
Definition: SDL3pp_properties.h:53
Semi-safe reference for Properties.
Definition: SDL3pp_properties.h:711
A simple std::string-like interface for SDL allocated strings.
Definition: SDL3pp_strings.h:153