Qt Cryptographic Architecture
qpipe.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2003-2007 Justin Karneges <justin@affinix.com>
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  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301 USA
18  *
19  */
20 
31 #ifndef QPIPE_H
32 #define QPIPE_H
33 
34 #ifndef DOXYGEN_SHOULD_SKIP_THIS
35 
36 #ifndef QPIPE_NO_SECURE
37 #define QPIPE_SECURE
38 #endif
39 
40 #ifdef QPIPE_SECURE
41 #include "QtCrypto"
42 #else
43 #define QCA_EXPORT
44 #endif
45 
46 // defs adapted qprocess_p.h
47 #ifdef Q_OS_WIN
48 #include <windows.h>
49 typedef HANDLE Q_PIPE_ID;
50 #define INVALID_Q_PIPE_ID INVALID_HANDLE_VALUE
51 #else
52 typedef int Q_PIPE_ID;
53 #define INVALID_Q_PIPE_ID -1
54 #endif
55 
56 #endif
57 
58 // Note: for Windows console, I/O must be in UTF-8. Reads are guaranteed to
59 // to completely decode (no partial characters). Likewise, writes must
60 // not contain partial characters.
61 
62 namespace QCA {
63 
74 class QCA_EXPORT QPipeDevice : public QObject
75 {
76  Q_OBJECT
77 public:
81  enum Type
82  {
83  Read,
84  Write
85  };
86 
92  QPipeDevice(QObject *parent = nullptr);
93  ~QPipeDevice() override;
94 
98  Type type() const;
99 
103  bool isValid() const;
104 
114  Q_PIPE_ID id() const;
115 
123  int idAsInt() const;
124 
131  void take(Q_PIPE_ID id, Type t);
132 
136  void enable();
137 
141  void close();
142 
146  void release();
147 
155  bool setInheritable(bool enabled);
156 
160  int bytesAvailable() const;
161 
170  int read(char *data, int maxsize);
171 
182  int write(const char *data, int size);
183 
192  int writeResult(int *written) const;
193 
194 Q_SIGNALS:
198  void notify();
199 
200 private:
201  Q_DISABLE_COPY(QPipeDevice)
202 
203  class Private;
204  friend class Private;
205  Private *d;
206 };
207 
217 class QCA_EXPORT QPipeEnd : public QObject
218 {
219  Q_OBJECT
220 public:
224  enum Error
225  {
227  ErrorBroken
228  };
229 
235  QPipeEnd(QObject *parent = nullptr);
236 
237  ~QPipeEnd() override;
238 
242  void reset();
243 
248 
255  bool isValid() const;
256 
260  Q_PIPE_ID id() const;
261 
265  int idAsInt() const;
266 
273  void take(Q_PIPE_ID id, QPipeDevice::Type t);
274 
275 #ifdef QPIPE_SECURE
284  void setSecurityEnabled(bool secure);
285 #endif
286 
293  void enable();
294 
300  void close();
301 
308  void release();
309 
318  bool setInheritable(bool enabled);
319 
323  void finalize();
324 
329 
338  int bytesAvailable() const;
339 
348  int bytesToWrite() const;
349 
360  QByteArray read(int bytes = -1);
361 
371  void write(const QByteArray &a);
372 
373 #ifdef QPIPE_SECURE
384  SecureArray readSecure(int bytes = -1);
385 
395  void writeSecure(const SecureArray &a);
396 #endif
397 
404  QByteArray takeBytesToWrite();
405 
406 #ifdef QPIPE_SECURE
414 #endif
415 
416 Q_SIGNALS:
423  void readyRead();
424 
431  void bytesWritten(int bytes);
432 
444  void closed();
445 
453 
454 private:
455  Q_DISABLE_COPY(QPipeEnd)
456 
457  class Private;
458  friend class Private;
459  Private *d;
460 };
461 
478 class QCA_EXPORT QPipe
479 {
480 public:
488  QPipe(QObject *parent = nullptr);
489 
490  ~QPipe();
491 
498  void reset();
499 
500 #ifdef QPIPE_SECURE
506  bool create(bool secure = false);
507 #else
511  bool create();
512 #endif
513 
518  {
519  return i;
520  }
521 
526  {
527  return o;
528  }
529 
530 private:
531  Q_DISABLE_COPY(QPipe)
532 
533  QPipeEnd i, o;
534 };
535 
536 }
537 
538 #endif
Unbuffered direct pipe.
Definition: qpipe.h:75
void release()
Release the pipe end, but do not close it.
QPipeDevice(QObject *parent=nullptr)
Standard constructor.
int idAsInt() const
The low level identification for this pipe, returned as an integer.
void take(Q_PIPE_ID id, Type t)
Take over an existing pipe id, closing the old pipe if any.
void notify()
Emitted when the pipe end can be read from or written to (depending on its Type).
bool setInheritable(bool enabled)
Set the pipe end to be inheritable.
int bytesAvailable() const
Obtain the number of bytes available to be read.
int write(const char *data, int size)
Write to the pipe end.
int read(char *data, int maxsize)
Read from the pipe end.
void close()
Close the pipe end.
Q_PIPE_ID id() const
The low level identification for this pipe.
int writeResult(int *written) const
The result of a write operation.
bool isValid() const
Test whether this object corresponds to a valid pipe.
Type type() const
The Type of the pipe device (that is, read or write)
void enable()
Enable the pipe for reading or writing (depending on Type)
Type
The type of device.
Definition: qpipe.h:82
@ Read
The pipe end can be read from.
Definition: qpipe.h:83
A buffered higher-level pipe end.
Definition: qpipe.h:218
QPipeEnd(QObject *parent=nullptr)
Standard constructor.
void error(QCA::QPipeEnd::Error e)
Emitted when the pipe encounters an error trying to read or write, or if the other end of the pipe ha...
QByteArray takeBytesToWrite()
Returns any unsent bytes queued for writing.
void readyRead()
Emitted when there are bytes available to be read from the read end of the pipe.
void bytesWritten(int bytes)
Emitted when bytes have been written to the write end of the pipe.
void finalizeAndRelease()
Clear the contents of the pipe, and release the pipe.
SecureArray takeBytesToWriteSecure()
Returns any unsent bytes queued for writing.
bool isValid() const
Determine whether the pipe end is valid.
int bytesAvailable() const
Determine how many bytes are available to be read.
void closed()
Emitted when this end of the pipe is closed as a result of calling close()
void write(const QByteArray &a)
Write bytes to the pipe.
SecureArray readSecure(int bytes=-1)
Read bytes from the pipe.
void finalize()
Clear the contents of the pipe, and invalidate the pipe.
void writeSecure(const SecureArray &a)
Write bytes to the pipe.
void setSecurityEnabled(bool secure)
Sets whether the pipe uses secure memory for read/write.
void release()
Let go of the active pipe handle, but don't close it.
Q_PIPE_ID id() const
Pipe identification.
void reset()
Reset the pipe end to an inactive state.
Error
The type of error.
Definition: qpipe.h:225
@ ErrorEOF
End of file error.
Definition: qpipe.h:226
int bytesToWrite() const
Returns the number of bytes pending to write.
void close()
Close the end of the pipe.
bool setInheritable(bool enabled)
Sets whether the pipe should be inheritable to child processes.
int idAsInt() const
Pipe identification.
QByteArray read(int bytes=-1)
Read bytes from the pipe.
void take(Q_PIPE_ID id, QPipeDevice::Type t)
Take over an existing pipe handle.
void enable()
Enable the endpoint for the pipe.
QPipeDevice::Type type() const
The type of pipe end (either read or write)
A FIFO buffer (named pipe) abstraction.
Definition: qpipe.h:479
void reset()
Reset the pipe.
QPipe(QObject *parent=nullptr)
Standard constructor.
QPipeEnd & readEnd()
The read end of the pipe.
Definition: qpipe.h:517
QPipeEnd & writeEnd()
The write end of the pipe.
Definition: qpipe.h:525
bool create(bool secure=false)
Create the pipe.
Secure array of bytes.
Definition: qca_tools.h:317
QCA - the Qt Cryptographic Architecture.
Definition: qca_basic.h:41