// // Created by loki on 12/14/19. // #ifndef SUNSHINE_PROCESS_H #define SUNSHINE_PROCESS_H #include #include #include "utility.h" namespace proc { using file_t = util::safe_ptr_v2; struct cmd_t { std::string do_cmd; // Executed when proc_t has finished running, meant to reverse 'do_cmd' if applicable std::string undo_cmd; }; /* * pre_cmds -- guaranteed to be executed unless any of the commands fail. * cmd -- Runs indefinitely until: * No session is running and a different set of commands it to be executed * Command exits * cmd_output -- * empty -- The output of the commands are appended to the output of sunshine * "null" -- The output of the commands are discarded * filename -- The output of the commands are appended to filename */ struct ctx_t { std::vector pre_cmds; std::string cmd; std::string cmd_output; }; class proc_t { public: KITTY_DEFAULT_CONSTR(proc_t) proc_t( boost::process::environment &&env, std::unordered_map &&name_to_proc) : _env(std::move(env)), _name_to_proc(std::move(name_to_proc)) {} int execute(const std::string &name); bool running(); ~proc_t(); private: void _undo_pre_cmd(); boost::process::environment _env; std::unordered_map _name_to_proc; boost::process::child _process; file_t _pipe; std::vector::const_iterator _undo_it; std::vector::const_iterator _undo_begin; }; } #endif //SUNSHINE_PROCESS_H