1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2015 The Qt Company Ltd. 4 ** Contact: http://www.qt.io/licensing/ 5 ** 6 ** This file is part of the QtGui module of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:LGPL$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see http://www.qt.io/terms-conditions. For further 15 ** information use the contact form at http://www.qt.io/contact-us. 16 ** 17 ** GNU Lesser General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU Lesser 19 ** General Public License version 2.1 or version 3 as published by the Free 20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and 21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the 22 ** following information to ensure the GNU Lesser General Public License 23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and 24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. 25 ** 26 ** As a special exception, The Qt Company gives you certain additional 27 ** rights. These rights are described in The Qt Company LGPL Exception 28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. 29 ** 30 ** GNU General Public License Usage 31 ** Alternatively, this file may be used under the terms of the GNU 32 ** General Public License version 3.0 as published by the Free Software 33 ** Foundation and appearing in the file LICENSE.GPL included in the 34 ** packaging of this file. Please review the following information to 35 ** ensure the GNU General Public License version 3.0 requirements will be 36 ** met: http://www.gnu.org/copyleft/gpl.html. 37 ** 38 ** $QT_END_LICENSE$ 39 ** 40 ****************************************************************************/ 41 42 #ifndef QUNIXSOCKET_P_H 43 #define QUNIXSOCKET_P_H 44 45 // 46 // W A R N I N G 47 // ------------- 48 // 49 // This file is not part of the Qt API. It exists purely as an 50 // implementation detail. This header file may change from version to 51 // version without notice, or even be removed. 52 // 53 // We mean it. 54 // 55 56 #include <QtNetwork/qabstractsocket.h> 57 #include <QtCore/qiodevice.h> 58 #include <QtCore/qlist.h> 59 #include <QtCore/qshareddata.h> 60 61 extern "C" { 62 #include <sys/types.h> 63 }; 64 65 QT_BEGIN_NAMESPACE 66 67 class QUnixSocketRights; 68 class QUnixSocketRightsPrivate; 69 class QUnixSocketPrivate; 70 class QUnixSocketMessagePrivate; 71 struct iovec; 72 73 class Q_GUI_EXPORT QUnixSocketRights { 74 public: 75 QUnixSocketRights(int); 76 ~QUnixSocketRights(); 77 78 QUnixSocketRights(const QUnixSocketRights &); 79 QUnixSocketRights & operator=(const QUnixSocketRights &); 80 81 bool isValid() const; 82 83 int dupFd() const; 84 int peekFd() const; 85 86 private: 87 friend class QUnixSocket; 88 QUnixSocketRights(int,int); 89 QSharedDataPointer<QUnixSocketRightsPrivate> d; 90 }; 91 92 class Q_GUI_EXPORT QUnixSocketMessage { 93 public: 94 QUnixSocketMessage(); 95 QUnixSocketMessage(const QByteArray &); 96 QUnixSocketMessage(const QByteArray &, const QList<QUnixSocketRights> &); 97 QUnixSocketMessage(const QUnixSocketMessage &); 98 QUnixSocketMessage(const iovec*, int); 99 QUnixSocketMessage & operator=(const QUnixSocketMessage &); 100 ~QUnixSocketMessage(); 101 102 void setBytes(const QByteArray &); 103 void setRights(const QList<QUnixSocketRights> &); 104 105 const QList<QUnixSocketRights> & rights() const; 106 bool rightsWereTruncated() const; 107 108 const QByteArray & bytes() const; 109 110 pid_t processId() const; 111 uid_t userId() const; 112 gid_t groupId() const; 113 114 void setProcessId(pid_t); 115 void setUserId(uid_t); 116 void setGroupId(gid_t); 117 118 bool isValid() const; 119 private: 120 friend class QUnixSocket; 121 friend class QUnixSocketPrivate; 122 QSharedDataPointer<QUnixSocketMessagePrivate> d; 123 }; 124 125 class Q_GUI_EXPORT QUnixSocket : public QIODevice 126 { 127 Q_OBJECT 128 public: 129 QUnixSocket(QObject * = 0); 130 QUnixSocket(qint64, qint64, QObject * = 0); 131 virtual ~QUnixSocket(); 132 133 enum SocketState { 134 UnconnectedState = QAbstractSocket::UnconnectedState, 135 HostLookupState = QAbstractSocket::HostLookupState, 136 ConnectingState = QAbstractSocket::ConnectingState, 137 ConnectedState = QAbstractSocket::ConnectedState, 138 BoundState = QAbstractSocket::BoundState, 139 ClosingState = QAbstractSocket::ClosingState, 140 ListeningState = QAbstractSocket::ListeningState, 141 }; 142 143 enum SocketError { NoError, InvalidPath, ResourceError, 144 NonexistentPath, ConnectionRefused, UnknownError, 145 ReadFailure, WriteFailure }; 146 147 bool connect(const QByteArray & path); 148 bool setSocketDescriptor(int socketDescriptor); 149 int socketDescriptor() const; 150 void abort(); 151 void close(); 152 153 bool flush(); 154 155 SocketError error() const; 156 157 SocketState state() const; 158 QByteArray address() const; 159 160 qint64 bytesAvailable() const; 161 qint64 bytesToWrite() const; 162 163 qint64 readBufferSize() const; 164 void setReadBufferSize(qint64 size); 165 qint64 rightsBufferSize() const; 166 void setRightsBufferSize(qint64 size); 167 168 bool canReadLine() const; 169 write(const char * data,qint64 maxSize)170 qint64 write(const char * data, qint64 maxSize) 171 { return QIODevice::write(data, maxSize); } write(const QByteArray & byteArray)172 qint64 write(const QByteArray & byteArray) 173 { return QIODevice::write(byteArray); } read(char * data,qint64 maxSize)174 qint64 read(char * data, qint64 maxSize) 175 { return QIODevice::read(data, maxSize); } read(qint64 maxSize)176 QByteArray read(qint64 maxSize) 177 { return QIODevice::read(maxSize); } 178 179 qint64 write(const QUnixSocketMessage &); 180 QUnixSocketMessage read(); 181 182 virtual bool isSequential() const; 183 virtual bool waitForReadyRead(int msec = 300); 184 virtual bool waitForBytesWritten(int msec = 300); 185 186 Q_SIGNALS: 187 void stateChanged(SocketState socketState); 188 189 protected: 190 virtual qint64 readData(char * data, qint64 maxSize); 191 virtual qint64 writeData (const char * data, qint64 maxSize); 192 193 private: 194 QUnixSocket(const QUnixSocket &); 195 QUnixSocket & operator=(const QUnixSocket &); 196 197 QUnixSocketPrivate * d; 198 }; 199 200 QT_END_NAMESPACE 201 202 #endif // QUNIXSOCKET_P_H 203