1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtNetwork 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 https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://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 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #include <QtNetwork/private/qtnetworkglobal_p.h>
41 
42 #include "qlocalsocket.h"
43 #include "qlocalsocket_p.h"
44 
45 QT_BEGIN_NAMESPACE
46 
47 /*!
48     \class QLocalSocket
49     \since 4.4
50     \inmodule QtNetwork
51 
52     \brief The QLocalSocket class provides a local socket.
53 
54     On Windows this is a named pipe and on Unix this is a local domain socket.
55 
56     If an error occurs, error() returns the type of error, and
57     errorString() can be called to get a human readable description
58     of what happened.
59 
60     Although QLocalSocket is designed for use with an event loop, it's possible
61     to use it without one. In that case, you must use waitForConnected(),
62     waitForReadyRead(), waitForBytesWritten(), and waitForDisconnected()
63     which blocks until the operation is complete or the timeout expires.
64 
65     \sa QLocalServer
66 */
67 
68 /*!
69     \fn void QLocalSocket::connectToServer(OpenMode openMode)
70     \since 5.1
71 
72     Attempts to make a connection to serverName().
73     setServerName() must be called before you open the connection.
74     Alternatively you can use connectToServer(const QString &name, OpenMode openMode);
75 
76     The socket is opened in the given \a openMode and first enters ConnectingState.
77     If a connection is established, QLocalSocket enters ConnectedState and emits connected().
78 
79     After calling this function, the socket can emit errorOccurred() to signal that an error occurred.
80 
81     \sa state(), serverName(), waitForConnected()
82 */
83 
84 /*!
85     \fn void QLocalSocket::open(OpenMode openMode)
86 
87     Equivalent to connectToServer(OpenMode mode).
88     The socket is opened in the given \a openMode to the server defined by setServerName().
89 
90     Note that unlike in most other QIODevice subclasses, open() may not open the device directly.
91     The function return false if the socket was already connected or if the server to connect
92     to was not defined and true in any other case. The connected() or errorOccurred() signals will be
93     emitted once the device is actualy open (or the connection failed).
94 
95     See connectToServer() for more details.
96 */
97 
98 /*!
99     \fn void QLocalSocket::connected()
100 
101     This signal is emitted after connectToServer() has been called and
102     a connection has been successfully established.
103 
104     \sa connectToServer(), disconnected()
105 */
106 
107 /*!
108     \fn bool QLocalSocket::setSocketDescriptor(qintptr socketDescriptor,
109         LocalSocketState socketState, OpenMode openMode)
110 
111     Initializes QLocalSocket with the native socket descriptor
112     \a socketDescriptor. Returns \c true if socketDescriptor is accepted
113     as a valid socket descriptor; otherwise returns \c false. The socket is
114     opened in the mode specified by \a openMode, and enters the socket state
115     specified by \a socketState.
116 
117     \note It is not possible to initialize two local sockets with the same
118     native socket descriptor.
119 
120     \sa socketDescriptor(), state(), openMode()
121 */
122 
123 /*!
124     \fn qintptr QLocalSocket::socketDescriptor() const
125 
126     Returns the native socket descriptor of the QLocalSocket object if
127     this is available; otherwise returns -1.
128 
129     The socket descriptor is not available when QLocalSocket
130     is in UnconnectedState.
131     The type of the descriptor depends on the platform:
132 
133     \list
134         \li On Windows, the returned value is a
135         \l{https://msdn.microsoft.com/en-us/library/windows/desktop/ms740522(v=vs.85).aspx}
136         {Winsock 2 Socket Handle}.
137 
138         \li With WinRT and on INTEGRITY, the returned value is the
139         QTcpSocket socket descriptor and the type is defined by
140         \l{QTcpSocket::socketDescriptor}{socketDescriptor}.
141 
142         \li On all other UNIX-like operating systems, the type is
143         a file descriptor representing a socket.
144     \endlist
145 
146     \sa setSocketDescriptor()
147 */
148 
149 /*!
150     \fn qint64 QLocalSocket::readData(char *data, qint64 c)
151     \reimp
152 */
153 
154 /*!
155     \fn qint64 QLocalSocket::writeData(const char *data, qint64 c)
156     \reimp
157 */
158 
159 /*!
160     \fn void QLocalSocket::abort()
161 
162     Aborts the current connection and resets the socket.
163     Unlike disconnectFromServer(), this function immediately closes the socket,
164     clearing any pending data in the write buffer.
165 
166     \sa disconnectFromServer(), close()
167 */
168 
169 /*!
170     \fn qint64 QLocalSocket::bytesAvailable() const
171     \reimp
172 */
173 
174 /*!
175     \fn qint64 QLocalSocket::bytesToWrite() const
176     \reimp
177 */
178 
179 /*!
180     \fn bool QLocalSocket::canReadLine() const
181     \reimp
182 */
183 
184 /*!
185     \fn void QLocalSocket::close()
186     \reimp
187 */
188 
189 /*!
190     \fn bool QLocalSocket::waitForBytesWritten(int msecs)
191     \reimp
192 */
193 
194 /*!
195     \fn bool QLocalSocket::flush()
196 
197     This function writes as much as possible from the internal write buffer
198     to the socket, without blocking.  If any data was written, this function
199     returns \c true; otherwise false is returned.
200 
201     Call this function if you need QLocalSocket to start sending buffered data
202     immediately. The number of bytes successfully written depends on the
203     operating system. In most cases, you do not need to call this function,
204     because QLocalSocket will start sending data automatically once control
205     goes back to the event loop. In the absence of an event loop, call
206     waitForBytesWritten() instead.
207 
208     \sa write(), waitForBytesWritten()
209 */
210 
211 /*!
212     \fn void QLocalSocket::disconnectFromServer()
213 
214     Attempts to close the socket. If there is pending data waiting to be
215     written, QLocalSocket will enter ClosingState and wait until all data
216     has been written. Eventually, it will enter UnconnectedState and emit
217     the disconnectedFromServer() signal.
218 
219     \sa connectToServer()
220 */
221 
222 /*!
223     \fn QLocalSocket::LocalSocketError QLocalSocket::error() const
224 
225     Returns the type of error that last occurred.
226 
227     \sa state(), errorString()
228 */
229 
230 /*!
231     \fn bool QLocalSocket::isValid() const
232 
233     Returns \c true if the socket is valid and ready for use; otherwise
234     returns \c false.
235 
236     \note The socket's state must be ConnectedState before reading
237     and writing can occur.
238 
239     \sa state(), connectToServer()
240 */
241 
242 /*!
243     \fn qint64 QLocalSocket::readBufferSize() const
244 
245     Returns the size of the internal read buffer. This limits the amount of
246     data that the client can receive before you call read() or readAll().
247     A read buffer size of 0 (the default) means that the buffer has no size
248     limit, ensuring that no data is lost.
249 
250     \sa setReadBufferSize(), read()
251 */
252 
253 /*!
254     \fn void QLocalSocket::setReadBufferSize(qint64 size)
255 
256     Sets the size of QLocalSocket's internal read buffer to be \a size bytes.
257 
258     If the buffer size is limited to a certain size, QLocalSocket won't
259     buffer more than this size of data. Exceptionally, a buffer size of 0
260     means that the read buffer is unlimited and all incoming data is buffered.
261     This is the default.
262 
263     This option is useful if you only read the data at certain points in
264     time (e.g., in a real-time streaming application) or if you want to
265     protect your socket against receiving too much data, which may eventually
266     cause your application to run out of memory.
267 
268     \sa readBufferSize(), read()
269 */
270 
271 /*!
272     \fn bool QLocalSocket::waitForConnected(int msecs)
273 
274     Waits until the socket is connected, up to \a msecs milliseconds. If the
275     connection has been established, this function returns \c true; otherwise
276     it returns \c false. In the case where it returns \c false, you can call
277     error() to determine the cause of the error.
278 
279     The following example waits up to one second for a connection
280     to be established:
281 
282     \snippet code/src_network_socket_qlocalsocket_unix.cpp 0
283 
284     If \a msecs is -1, this function will not time out.
285 
286     \sa connectToServer(), connected()
287 */
288 
289 /*!
290     \fn bool QLocalSocket::waitForDisconnected(int msecs)
291 
292     Waits until the socket has disconnected, up to \a msecs milliseconds. If the
293     connection was successfully disconnected, this function returns \c true;
294     otherwise it returns \c false (if the operation timed out, if an error
295     occurred, or if this QLocalSocket is already disconnected). In the case
296     where it returns \c false, you can call error() to determine the cause of
297     the error.
298 
299     The following example waits up to one second for a connection
300     to be closed:
301 
302     \snippet code/src_network_socket_qlocalsocket_unix.cpp 1
303 
304     If \a msecs is -1, this function will not time out.
305 
306     \sa disconnectFromServer(), close()
307 */
308 
309 /*!
310     \fn bool QLocalSocket::waitForReadyRead(int msecs)
311 
312     This function blocks until data is available for reading and the
313     \l{QIODevice::}{readyRead()} signal has been emitted. The function
314     will timeout after \a msecs milliseconds; the default timeout is
315     30000 milliseconds.
316 
317     The function returns \c true if data is available for reading;
318     otherwise it returns \c false (if an error occurred or the
319     operation timed out).
320 
321     \sa waitForBytesWritten()
322 */
323 
324 /*!
325     \fn void QLocalSocket::disconnected()
326 
327     This signal is emitted when the socket has been disconnected.
328 
329     \sa connectToServer(), disconnectFromServer(), abort(), connected()
330 */
331 
332 /*!
333     \fn void QLocalSocket::error(QLocalSocket::LocalSocketError socketError)
334     \obsolete
335 
336     Use errorOccurred() instead.
337 */
338 
339 /*!
340     \fn void QLocalSocket::errorOccurred(QLocalSocket::LocalSocketError socketError)
341     \since 5.15
342 
343     This signal is emitted after an error occurred. The \a socketError
344     parameter describes the type of error that occurred.
345 
346     QLocalSocket::LocalSocketError is not a registered metatype, so for queued
347     connections, you will have to register it with Q_DECLARE_METATYPE() and
348     qRegisterMetaType().
349 
350     \sa error(), errorString(), {Creating Custom Qt Types}
351 */
352 
353 /*!
354     \fn void QLocalSocket::stateChanged(QLocalSocket::LocalSocketState socketState)
355 
356     This signal is emitted whenever QLocalSocket's state changes.
357     The \a socketState parameter is the new state.
358 
359     QLocalSocket::SocketState is not a registered metatype, so for queued
360     connections, you will have to register it with Q_DECLARE_METATYPE() and
361     qRegisterMetaType().
362 
363     \sa state(), {Creating Custom Qt Types}
364 */
365 
366 /*!
367     Creates a new local socket. The \a parent argument is passed to
368     QObject's constructor.
369  */
QLocalSocket(QObject * parent)370 QLocalSocket::QLocalSocket(QObject * parent)
371     : QIODevice(*new QLocalSocketPrivate, parent)
372 {
373     Q_D(QLocalSocket);
374     d->init();
375 
376     // Support the deprecated error() signal:
377     connect(this, &QLocalSocket::errorOccurred, this, QOverload<QLocalSocket::LocalSocketError>::of(&QLocalSocket::error));
378 }
379 
380 /*!
381     Destroys the socket, closing the connection if necessary.
382  */
~QLocalSocket()383 QLocalSocket::~QLocalSocket()
384 {
385     QLocalSocket::close();
386 #if !defined(Q_OS_WIN) && !defined(QT_LOCALSOCKET_TCP)
387     Q_D(QLocalSocket);
388     d->unixSocket.setParent(nullptr);
389 #endif
390 }
391 
open(OpenMode openMode)392 bool QLocalSocket::open(OpenMode openMode)
393 {
394     connectToServer(openMode);
395     return isOpen();
396 }
397 
398 /*! \overload
399 
400     Set the server \a name and attempts to make a connection to it.
401 
402     The socket is opened in the given \a openMode and first enters ConnectingState.
403     If a connection is established, QLocalSocket enters ConnectedState and emits connected().
404 
405     After calling this function, the socket can emit errorOccurred() to signal that an error occurred.
406 
407     \sa state(), serverName(), waitForConnected()
408 */
connectToServer(const QString & name,OpenMode openMode)409 void QLocalSocket::connectToServer(const QString &name, OpenMode openMode)
410 {
411     setServerName(name);
412     connectToServer(openMode);
413 }
414 
415 /*!
416     \since 5.1
417 
418     Set the \a name of the peer to connect to.
419     On Windows name is the name of a named pipe; on Unix name is the name of a local domain socket.
420 
421     This function must be called when the socket is not connected.
422 */
setServerName(const QString & name)423 void QLocalSocket::setServerName(const QString & name)
424 {
425     Q_D(QLocalSocket);
426     if (d->state != UnconnectedState) {
427         qWarning("QLocalSocket::setServerName() called while not in unconnected state");
428         return;
429     }
430     d->serverName = name;
431 }
432 
433 /*!
434     Returns the name of the peer as specified by setServerName(), or an
435     empty QString if setServerName() has not been called or connectToServer() failed.
436 
437     \sa connectToServer(), fullServerName()
438 
439  */
serverName() const440 QString QLocalSocket::serverName() const
441 {
442     Q_D(const QLocalSocket);
443     return d->serverName;
444 }
445 
446 /*!
447     Returns the server path that the socket is connected to.
448 
449     \note The return value of this function is platform specific.
450 
451     \sa connectToServer(), serverName()
452  */
fullServerName() const453 QString QLocalSocket::fullServerName() const
454 {
455     Q_D(const QLocalSocket);
456     return d->fullServerName;
457 }
458 
459 /*!
460     Returns the state of the socket.
461 
462     \sa error()
463  */
state() const464 QLocalSocket::LocalSocketState QLocalSocket::state() const
465 {
466     Q_D(const QLocalSocket);
467     return d->state;
468 }
469 
470 /*! \reimp
471 */
isSequential() const472 bool QLocalSocket::isSequential() const
473 {
474     return true;
475 }
476 
477 /*!
478     \enum QLocalSocket::LocalSocketError
479 
480     The LocalServerError enumeration represents the errors that can occur.
481     The most recent error can be retrieved through a call to
482     \l QLocalSocket::error().
483 
484     \value ConnectionRefusedError The connection was refused by
485         the peer (or timed out).
486     \value PeerClosedError  The remote socket closed the connection.
487         Note that the client socket (i.e., this socket) will be closed
488         after the remote close notification has been sent.
489     \value ServerNotFoundError  The local socket name was not found.
490     \value SocketAccessError The socket operation failed because the
491         application lacked the required privileges.
492     \value SocketResourceError The local system ran out of resources
493         (e.g., too many sockets).
494     \value SocketTimeoutError The socket operation timed out.
495     \value DatagramTooLargeError The datagram was larger than the operating
496         system's limit (which can be as low as 8192 bytes).
497     \value ConnectionError An error occurred with the connection.
498     \value UnsupportedSocketOperationError The requested socket operation
499         is not supported by the local operating system.
500     \value OperationError An operation was attempted while the socket was in a state that
501            did not permit it.
502     \value UnknownSocketError An unidentified error occurred.
503  */
504 
505 /*!
506     \enum QLocalSocket::LocalSocketState
507 
508     This enum describes the different states in which a socket can be.
509 
510     \sa QLocalSocket::state()
511 
512     \value UnconnectedState The socket is not connected.
513     \value ConnectingState The socket has started establishing a connection.
514     \value ConnectedState A connection is established.
515     \value ClosingState The socket is about to close
516         (data may still be waiting to be written).
517  */
518 
519 #ifndef QT_NO_DEBUG_STREAM
operator <<(QDebug debug,QLocalSocket::LocalSocketError error)520 QDebug operator<<(QDebug debug, QLocalSocket::LocalSocketError error)
521 {
522     QDebugStateSaver saver(debug);
523     debug.resetFormat().nospace();
524     switch (error) {
525     case QLocalSocket::ConnectionRefusedError:
526         debug << "QLocalSocket::ConnectionRefusedError";
527         break;
528     case QLocalSocket::PeerClosedError:
529         debug << "QLocalSocket::PeerClosedError";
530         break;
531     case QLocalSocket::ServerNotFoundError:
532         debug << "QLocalSocket::ServerNotFoundError";
533         break;
534     case QLocalSocket::SocketAccessError:
535         debug << "QLocalSocket::SocketAccessError";
536         break;
537     case QLocalSocket::SocketResourceError:
538         debug << "QLocalSocket::SocketResourceError";
539         break;
540     case QLocalSocket::SocketTimeoutError:
541         debug << "QLocalSocket::SocketTimeoutError";
542         break;
543     case QLocalSocket::DatagramTooLargeError:
544         debug << "QLocalSocket::DatagramTooLargeError";
545         break;
546     case QLocalSocket::ConnectionError:
547         debug << "QLocalSocket::ConnectionError";
548         break;
549     case QLocalSocket::UnsupportedSocketOperationError:
550         debug << "QLocalSocket::UnsupportedSocketOperationError";
551         break;
552     case QLocalSocket::UnknownSocketError:
553         debug << "QLocalSocket::UnknownSocketError";
554         break;
555     case QLocalSocket::OperationError:
556         debug << "QLocalSocket::OperationError";
557         break;
558     default:
559         debug << "QLocalSocket::SocketError(" << int(error) << ')';
560         break;
561     }
562     return debug;
563 }
564 
operator <<(QDebug debug,QLocalSocket::LocalSocketState state)565 QDebug operator<<(QDebug debug, QLocalSocket::LocalSocketState state)
566 {
567     QDebugStateSaver saver(debug);
568     debug.resetFormat().nospace();
569     switch (state) {
570     case QLocalSocket::UnconnectedState:
571         debug << "QLocalSocket::UnconnectedState";
572         break;
573     case QLocalSocket::ConnectingState:
574         debug << "QLocalSocket::ConnectingState";
575         break;
576     case QLocalSocket::ConnectedState:
577         debug << "QLocalSocket::ConnectedState";
578         break;
579     case QLocalSocket::ClosingState:
580         debug << "QLocalSocket::ClosingState";
581         break;
582     default:
583         debug << "QLocalSocket::SocketState(" << int(state) << ')';
584         break;
585     }
586     return debug;
587 }
588 #endif
589 
590 QT_END_NAMESPACE
591 
592 #include "moc_qlocalsocket.cpp"
593