1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/unix/pipe.h
3 // Purpose:     wxPipe class
4 // Author:      Vadim Zeitlin
5 // Modified by:
6 // Created:     24.06.2003 (extracted from src/unix/utilsunx.cpp)
7 // RCS-ID:      $Id: pipe.h 40518 2006-08-08 13:06:05Z VS $
8 // Copyright:   (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
9 // Licence:     wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
11 
12 #ifndef _WX_UNIX_PIPE_H_
13 #define _WX_UNIX_PIPE_H_
14 
15 #include <unistd.h>
16 
17 #include "wx/log.h"
18 #include "wx/intl.h"
19 
20 // ----------------------------------------------------------------------------
21 // wxPipe: this class encapsulates pipe() system call
22 // ----------------------------------------------------------------------------
23 
24 class wxPipe
25 {
26 public:
27     // the symbolic names for the pipe ends
28     enum Direction
29     {
30         Read,
31         Write
32     };
33 
34     enum
35     {
36         INVALID_FD = -1
37     };
38 
39     // default ctor doesn't do anything
wxPipe()40     wxPipe() { m_fds[Read] = m_fds[Write] = INVALID_FD; }
41 
42     // create the pipe, return TRUE if ok, FALSE on error
Create()43     bool Create()
44     {
45         if ( pipe(m_fds) == -1 )
46         {
47             wxLogSysError(_("Pipe creation failed"));
48 
49             return FALSE;
50         }
51 
52         return TRUE;
53     }
54 
55     // return TRUE if we were created successfully
IsOk()56     bool IsOk() const { return m_fds[Read] != INVALID_FD; }
57 
58     // return the descriptor for one of the pipe ends
59     int operator[](Direction which) const { return m_fds[which]; }
60 
61     // detach a descriptor, meaning that the pipe dtor won't close it, and
62     // return it
Detach(Direction which)63     int Detach(Direction which)
64     {
65         int fd = m_fds[which];
66         m_fds[which] = INVALID_FD;
67 
68         return fd;
69     }
70 
71     // close the pipe descriptors
Close()72     void Close()
73     {
74         for ( size_t n = 0; n < WXSIZEOF(m_fds); n++ )
75         {
76             if ( m_fds[n] != INVALID_FD )
77             {
78                 close(m_fds[n]);
79                 m_fds[n] = INVALID_FD;
80             }
81         }
82     }
83 
84     // dtor closes the pipe descriptors
~wxPipe()85     ~wxPipe() { Close(); }
86 
87 private:
88     int m_fds[2];
89 };
90 
91 #if wxUSE_STREAMS && wxUSE_FILE
92 
93 #include "wx/wfstream.h"
94 
95 // ----------------------------------------------------------------------------
96 // wxPipeInputStream: stream for reading from a pipe
97 // ----------------------------------------------------------------------------
98 
99 class wxPipeInputStream : public wxFileInputStream
100 {
101 public:
wxPipeInputStream(int fd)102     wxPipeInputStream(int fd) : wxFileInputStream(fd) { }
103 
104     // return TRUE if the pipe is still opened
IsOpened()105     bool IsOpened() const { return !Eof(); }
106 
107     // return TRUE if we have anything to read, don't block
108     virtual bool CanRead() const;
109 };
110 
111 #endif // wxUSE_STREAMS && wxUSE_FILE
112 
113 #endif // _WX_UNIX_PIPE_H_
114 
115