pipestream.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2007 Tommi Maekitalo
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * As a special exception, you may use this file as part of a free
10  * software library without restriction. Specifically, if other files
11  * instantiate templates or use macros or inline functions from this
12  * file, or you compile this file and link it with other files to
13  * produce an executable, this file does not by itself cause the
14  * resulting executable to be covered by the GNU General Public
15  * License. This exception does not however invalidate any other
16  * reasons why the executable file might be covered by the GNU Library
17  * General Public License.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  * Lesser General Public License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public
25  * License along with this library; if not, write to the Free Software
26  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27  */
28 
29 #ifndef CXXTOOLS_POSIX_PIPESTREAM_H
30 #define CXXTOOLS_POSIX_PIPESTREAM_H
31 
32 #include <iostream>
33 #include <cxxtools/posix/pipe.h>
34 
35 namespace cxxtools
36 {
37 namespace posix
38 {
44  class Pipestreambuf : public std::streambuf
45  {
46  std::streambuf::int_type overflow(std::streambuf::int_type ch);
47  std::streambuf::int_type underflow();
48  int sync();
49 
50  posix::Pipe pipe;
51 
52  unsigned bufsize;
53  char* ibuffer;
54  char* obuffer;
55 
56  public:
57  explicit Pipestreambuf(unsigned bufsize = 8192);
59 
60  void closeReadFd() { sync(); pipe.closeReadFd(); }
61  void closeWriteFd() { sync(); pipe.closeWriteFd(); }
62 
63  int getReadFd() const { return pipe.getReadFd(); }
64  int getWriteFd() const { return pipe.getWriteFd(); }
65 
66  void redirectStdout(bool close = true) { pipe.redirectStdout(close); }
67  void redirectStdin(bool close = true) { pipe.redirectStdin(close); }
68  void redirectStderr(bool close = true) { pipe.redirectStderr(close); }
69 
71  { return pipe.out(); }
72 
74  { return pipe.in(); }
75 
76  };
77 
78  class Pipestream : public std::iostream
79  {
80  Pipestreambuf streambuf;
81 
82  public:
83  explicit Pipestream(unsigned bufsize = 8192)
84  : std::iostream(0),
85  streambuf(bufsize)
86  {
87  init(&streambuf);
88  }
89 
90  void closeReadFd() { streambuf.closeReadFd(); }
91  void closeWriteFd() { streambuf.closeWriteFd(); }
92  void close()
93  {
94  closeReadFd();
95  closeWriteFd();
96  }
97 
98  int getReadFd() const { return streambuf.getReadFd(); }
99  int getWriteFd() const { return streambuf.getWriteFd(); }
100 
101  void redirectStdout(bool close = true) { streambuf.redirectStdout(close); }
102  void redirectStdin(bool close = true) { streambuf.redirectStdin(close); }
103  void redirectStderr(bool close = true) { streambuf.redirectStderr(close); }
104 
106  { return streambuf.out(); }
107 
109  { return streambuf.in(); }
110 
111  };
112 }
113 }
114 
115 #endif // CXXTOOLS_POSIX_PIPESTREAM_H