X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fprocess.cpp;fp=source%2Fcore%2Fprocess.cpp;h=dfbea341310d19a039e4924ee122c1c0fd054f9d;hb=ea60f3548d4769c356b796cb27cd690cdfe4b6d9;hp=0000000000000000000000000000000000000000;hpb=8091a3071918d4cd30f2b9ab903e1d73d12dcb36;p=libs%2Fcore.git diff --git a/source/core/process.cpp b/source/core/process.cpp new file mode 100644 index 0000000..dfbea34 --- /dev/null +++ b/source/core/process.cpp @@ -0,0 +1,100 @@ +#include +#include "process.h" +#include "process_private.h" + +using namespace std; + +namespace Msp { + +Process *Process::_self = 0; + +Process::Process(const Private &p): + priv(new Private(p)) +{ + init(); +} + +Process::Process(): + priv(new Private) +{ + init(); +} + +void Process::init() +{ + redirect = false; + cin = 0; + cout = 0; + cerr = 0; + running = false; + finished = false; + exit_code = 0; +} + +Process &Process::self() +{ + if(!_self) + { + Private _priv; + platform_get_self_info(_priv); + _self = new Process(_priv); + } + return *_self; +} + +void Process::set_working_directory(const FS::Path &d) +{ + work_dir = d; +} + +void Process::redirect_cin(IO::Base &io) +{ + do_redirect(cin, io); +} + +void Process::redirect_cout(IO::Base &io) +{ + do_redirect(cout, io); +} + +void Process::redirect_cerr(IO::Base &io) +{ + do_redirect(cerr, io); +} + +void Process::do_redirect(IO::Base *&ptr, IO::Base &io) +{ + if(this==_self) + { + if(&ptr==&cin) + IO::cin.redirect(io); + else if(&ptr==&cout) + IO::cout.redirect(io); + else if(&ptr==&cerr) + IO::cerr.redirect(io); + } + else + { + redirect = true; + ptr = &io; + } +} + +void Process::execute(const string &command, const Arguments &args) +{ + execute(command, true, args); +} + +void Process::execute(const FS::Path &command, const Arguments &args) +{ + execute(command.str(), false, args); +} + +unsigned Process::get_exit_code() const +{ + if(!finished) + throw logic_error("not finished"); + return exit_code; +} + +} // namespace Msp