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
276 
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
374 
384  SecureArray readSecure(int bytes = -1);
385 
395  void writeSecure(const SecureArray &a);
396 #endif
397 
404  QByteArray takeBytesToWrite();
405 
406 #ifdef QPIPE_SECURE
407 
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
501 
506  bool create(bool secure = false);
507 #else
508 
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
QObject
QCA::QPipeEnd::setSecurityEnabled
void setSecurityEnabled(bool secure)
Sets whether the pipe uses secure memory for read/write.
QCA::QPipeDevice
Unbuffered direct pipe.
Definition: qpipe.h:75
QCA::QPipeDevice::close
void close()
Close the pipe end.
QCA::QPipeDevice::setInheritable
bool setInheritable(bool enabled)
Set the pipe end to be inheritable.
QCA::QPipeDevice::Type
Type
The type of device.
Definition: qpipe.h:82
QCA::QPipeEnd::take
void take(Q_PIPE_ID id, QPipeDevice::Type t)
Take over an existing pipe handle.
QCA::QPipeEnd::id
Q_PIPE_ID id() const
Pipe identification.
QCA::QPipe
A FIFO buffer (named pipe) abstraction.
Definition: qpipe.h:479
QCA::QPipeEnd::type
QPipeDevice::Type type() const
The type of pipe end (either read or write)
QCA::QPipeEnd::reset
void reset()
Reset the pipe end to an inactive state.
QCA::QPipeDevice::write
int write(const char *data, int size)
Write to the pipe end.
QCA::QPipe::reset
void reset()
Reset the pipe.
QCA::QPipeEnd::error
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...
QCA::QPipeDevice::writeResult
int writeResult(int *written) const
The result of a write operation.
QCA::QPipeDevice::isValid
bool isValid() const
Test whether this object corresponds to a valid pipe.
QCA
QCA - the Qt Cryptographic Architecture.
Definition: qca_basic.h:41
QCA::QPipeDevice::id
Q_PIPE_ID id() const
The low level identification for this pipe.
QCA::QPipeDevice::enable
void enable()
Enable the pipe for reading or writing (depending on Type)
QCA::QPipeEnd::takeBytesToWriteSecure
SecureArray takeBytesToWriteSecure()
Returns any unsent bytes queued for writing.
QCA::QPipeEnd::release
void release()
Let go of the active pipe handle, but don't close it.
QCA::QPipeEnd::readSecure
SecureArray readSecure(int bytes=-1)
Read bytes from the pipe.
QCA::QPipeDevice::release
void release()
Release the pipe end, but do not close it.
QCA::QPipeEnd::ErrorEOF
@ ErrorEOF
End of file error.
Definition: qpipe.h:226
QCA::QPipe::readEnd
QPipeEnd & readEnd()
The read end of the pipe.
Definition: qpipe.h:517
QCA::QPipeEnd::bytesWritten
void bytesWritten(int bytes)
Emitted when bytes have been written to the write end of the pipe.
QCA::QPipeEnd::finalizeAndRelease
void finalizeAndRelease()
Clear the contents of the pipe, and release the pipe.
QCA::QPipeEnd
A buffered higher-level pipe end.
Definition: qpipe.h:218
QCA::QPipeDevice::take
void take(Q_PIPE_ID id, Type t)
Take over an existing pipe id, closing the old pipe if any.
QCA::QPipeEnd::bytesToWrite
int bytesToWrite() const
Returns the number of bytes pending to write.
QCA::QPipeDevice::idAsInt
int idAsInt() const
The low level identification for this pipe, returned as an integer.
QCA::QPipeDevice::QPipeDevice
QPipeDevice(QObject *parent=nullptr)
Standard constructor.
QCA::QPipeEnd::idAsInt
int idAsInt() const
Pipe identification.
QCA::QPipeEnd::close
void close()
Close the end of the pipe.
QCA::SecureArray
Secure array of bytes.
Definition: qca_tools.h:317
QCA::QPipeEnd::enable
void enable()
Enable the endpoint for the pipe.
QCA::QPipeEnd::read
QByteArray read(int bytes=-1)
Read bytes from the pipe.
QCA::QPipeDevice::type
Type type() const
The Type of the pipe device (that is, read or write)
QCA::QPipeDevice::Read
@ Read
The pipe end can be read from.
Definition: qpipe.h:83
QCA::QPipeEnd::bytesAvailable
int bytesAvailable() const
Determine how many bytes are available to be read.
QCA::QPipeEnd::closed
void closed()
Emitted when this end of the pipe is closed as a result of calling close()
QCA::QPipeDevice::notify
void notify()
Emitted when the pipe end can be read from or written to (depending on its Type).
QCA::QPipe::QPipe
QPipe(QObject *parent=nullptr)
Standard constructor.
QCA::QPipeEnd::write
void write(const QByteArray &a)
Write bytes to the pipe.
QCA::QPipe::writeEnd
QPipeEnd & writeEnd()
The write end of the pipe.
Definition: qpipe.h:525
QCA::QPipeDevice::read
int read(char *data, int maxsize)
Read from the pipe end.
QCA::QPipeEnd::QPipeEnd
QPipeEnd(QObject *parent=nullptr)
Standard constructor.
QCA::QPipeEnd::finalize
void finalize()
Clear the contents of the pipe, and invalidate the pipe.
QCA::QPipeEnd::takeBytesToWrite
QByteArray takeBytesToWrite()
Returns any unsent bytes queued for writing.
QCA::QPipeEnd::Error
Error
The type of error.
Definition: qpipe.h:225
QCA::QPipeEnd::readyRead
void readyRead()
Emitted when there are bytes available to be read from the read end of the pipe.
QCA::QPipeDevice::bytesAvailable
int bytesAvailable() const
Obtain the number of bytes available to be read.
QCA::QPipeEnd::writeSecure
void writeSecure(const SecureArray &a)
Write bytes to the pipe.
QCA::QPipeEnd::isValid
bool isValid() const
Determine whether the pipe end is valid.
QCA::QPipe::create
bool create(bool secure=false)
Create the pipe.
QCA::QPipeEnd::setInheritable
bool setInheritable(bool enabled)
Sets whether the pipe should be inheritable to child processes.