/** * @file win32pipestream.h * @brief A reimplementation of pipestream for win32 * @author Supakorn "Jamie" Rassameemasmuang (jamievlin [at] outlook.com) */ #pragma once #if defined(_WIN32) #include "common.h" #include #include #include namespace w32 { class Win32IoPipeStream { public: static const size_t BUFFER_LEN = SHRT_MAX; void open( const mem::vector &command, const char *hint=NULL, const char *application="", int out_fileno=STDOUT_FILENO); virtual ~Win32IoPipeStream(); [[nodiscard]] bool isopen() const; Win32IoPipeStream() = default; Win32IoPipeStream( const mem::vector &command, const char *hint=NULL, const char *application="", int out_fileno=STDOUT_FILENO); void eof(); virtual void pipeclose(); void block(bool write, bool read); int wait(); void Write(const string &s); void wait(const char *prompt); string readline(); bool tailequals( const char *buf, size_t len, const char *prompt, size_t plen); ssize_t readbuffer(); Win32IoPipeStream& operator>>(string& s); Win32IoPipeStream& operator<<(const string& s); typedef Win32IoPipeStream& (*imanip)(Win32IoPipeStream&); Win32IoPipeStream& operator<< (imanip func); string getbuffer(); bool running(); template Win32IoPipeStream& operator<<(T x) { ostringstream os; os << x; Write(os.str()); return *this; } private: void closeProcessHandles(); protected: PROCESS_INFORMATION procInfo = {}; bool pipeopen = false; HANDLE processStdinWr; HANDLE processOutRd; bool Running; bool pipein; char buffer[BUFFER_LEN]; string sbuffer; }; } #endif