HCE project C++ developers source code library  1.1.1
HCE project developer library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
ProcExec.cpp
Go to the documentation of this file.
1 #include <sstream>
2 #include <iterator>
3 #include <Poco/Pipe.h>
4 #include <Poco/PipeStream.h>
5 
6 #include "ProcExec.hpp"
7 
8 //-----------------------------------------------------------------------------
9 ProcExec::ProcExec(const std::string& cmd_)
10 :inherited(cmd_), args(), env()
11 {
12  std::stringstream istr(cmd), ostr;
13  std::istream_iterator<std::string> eos;
14  std::istream_iterator<std::string> iit(istr);
15 
16  ostr << *iit;
17  cmd = ostr.str();
18  while(++iit!=eos)
19  {
20  args.push_back(*iit);
21  }
22 }
23 //-----------------------------------------------------------------------------
24 ProcExec::ProcExec(const std::string& cmd_, const Poco::Process::Args& args_)
25 :inherited(cmd_), args(args_), env()
26 {
27 }
28 //-----------------------------------------------------------------------------
29 ProcExec::ProcExec(const std::string& cmd_, const Poco::Process::Args& args_, const Poco::Process::Env& env_)
30 :inherited(cmd_), args(args_), env(env_)
31 {
32 }
33 //-----------------------------------------------------------------------------
34 bool ProcExec::exec(std::ostream& os, std::ostream& es)
35 {
36  _IsError = false;
37  std::stringstream outMsg, errMsg;
38  Poco::Pipe outPipe, errPipe;
39  Poco::ProcessHandle ph(Poco::Process::launch(cmd, args, 0, &outPipe, &errPipe, env));
40  Poco::PipeInputStream istr(outPipe);
41  Poco::PipeInputStream estr(errPipe);
42 
43  outMsg << istr.rdbuf();
44  errMsg << estr.rdbuf();
45 
46  if (ph.wait() == 0)
47  {
48  os << outMsg.str();
49  es << errMsg.str();
50  }
51  else
52  {
53  es << outMsg.str() << " " << errMsg.str();
54  _IsError = true;
55  }
56 
57  return !_IsError;
58 }
59 //-----------------------------------------------------------------------------
60 std::ostream& operator << (std::ostream& os, const ProcExec& procExec)
61 {
62  const_cast<ProcExec&>(procExec).exec(os, os);
63  return os;
64 }
65 //-----------------------------------------------------------------------------
66 std::string& operator << (std::string& str, const ProcExec& procExec)
67 {
68  std::stringstream outMsg;
69  outMsg << procExec;
70  if (!procExec.isError())
71  str = outMsg.str();
72  return str;
73 }
74 //-----------------------------------------------------------------------------
75 //-----------------------------------------------------------------------------
76 
77