40 q->connect(tcpSocket, SIGNAL(readyRead()), q, SIGNAL(readyRead()));
42 q->connect(tcpSocket, SIGNAL(connected()), q, SIGNAL(connected()));
43 q->connect(tcpSocket, SIGNAL(disconnected()), q, SIGNAL(disconnected()));
48 q->connect(tcpSocket, SIGNAL(readChannelFinished()), q, SIGNAL(readChannelFinished()));
55 QString function =
"QLocalSocket"_L1;
56 QLocalSocket::LocalSocketError error = (QLocalSocket::LocalSocketError)socketError;
57 QString errorString = generateErrorString(error, function);
58 q->setErrorString(errorString);
59 emit q->errorOccurred(error);
65 QLocalSocket::LocalSocketState currentState = state;
67 case QAbstractSocket::UnconnectedState:
68 state = QLocalSocket::UnconnectedState;
70 fullServerName.clear();
72 case QAbstractSocket::ConnectingState:
73 state = QLocalSocket::ConnectingState;
75 case QAbstractSocket::ConnectedState:
76 state = QLocalSocket::ConnectedState;
78 case QAbstractSocket::ClosingState:
79 state = QLocalSocket::ClosingState;
82#if defined QLOCALSOCKET_DEBUG
83 qWarning() <<
"QLocalSocket::Unhandled socket state change:" << newState;
87 if (currentState != state)
88 emit q->stateChanged(state);
95 case QLocalSocket::ConnectionRefusedError:
96 errorString = QLocalSocket::tr(
"%1: Connection refused").arg(function);
98 case QLocalSocket::PeerClosedError:
99 errorString = QLocalSocket::tr(
"%1: Remote closed").arg(function);
101 case QLocalSocket::ServerNotFoundError:
102 errorString = QLocalSocket::tr(
"%1: Invalid name").arg(function);
104 case QLocalSocket::SocketAccessError:
105 errorString = QLocalSocket::tr(
"%1: Socket access error").arg(function);
107 case QLocalSocket::SocketResourceError:
108 errorString = QLocalSocket::tr(
"%1: Socket resource error").arg(function);
110 case QLocalSocket::SocketTimeoutError:
111 errorString = QLocalSocket::tr(
"%1: Socket operation timed out").arg(function);
113 case QLocalSocket::DatagramTooLargeError:
114 errorString = QLocalSocket::tr(
"%1: Datagram too large").arg(function);
116 case QLocalSocket::ConnectionError:
117 errorString = QLocalSocket::tr(
"%1: Connection error").arg(function);
119 case QLocalSocket::UnsupportedSocketOperationError:
120 errorString = QLocalSocket::tr(
"%1: The socket operation is not supported").arg(function);
122 case QLocalSocket::OperationError:
123 errorString = QLocalSocket::tr(
"%1: Operation not permitted when socket is in this state").arg(function);
125 case QLocalSocket::UnknownSocketError:
127 errorString = QLocalSocket::tr(
"%1: Unknown error").arg(function);
136 case QLocalSocket::ConnectionRefusedError:
137 tcpSocket->setSocketError(QAbstractSocket::ConnectionRefusedError);
139 case QLocalSocket::PeerClosedError:
140 tcpSocket->setSocketError(QAbstractSocket::RemoteHostClosedError);
142 case QLocalSocket::ServerNotFoundError:
143 tcpSocket->setSocketError(QAbstractSocket::HostNotFoundError);
145 case QLocalSocket::SocketAccessError:
146 tcpSocket->setSocketError(QAbstractSocket::SocketAccessError);
148 case QLocalSocket::SocketResourceError:
149 tcpSocket->setSocketError(QAbstractSocket::SocketResourceError);
151 case QLocalSocket::SocketTimeoutError:
152 tcpSocket->setSocketError(QAbstractSocket::SocketTimeoutError);
154 case QLocalSocket::DatagramTooLargeError:
155 tcpSocket->setSocketError(QAbstractSocket::DatagramTooLargeError);
157 case QLocalSocket::ConnectionError:
158 tcpSocket->setSocketError(QAbstractSocket::NetworkError);
160 case QLocalSocket::UnsupportedSocketOperationError:
161 tcpSocket->setSocketError(QAbstractSocket::UnsupportedSocketOperationError);
163 case QLocalSocket::UnknownSocketError:
165 tcpSocket->setSocketError(QAbstractSocket::UnknownSocketError);
168 QString errorString = generateErrorString(error, function);
169 q->setErrorString(errorString);
170 emit q->errorOccurred(error);
173 tcpSocket->setSocketState(QAbstractSocket::UnconnectedState);
174 bool stateChanged = (state != QLocalSocket::UnconnectedState);
175 state = QLocalSocket::UnconnectedState;
178 q->emit stateChanged(state);
181void QLocalSocket::connectToServer(OpenMode openMode)
184 if (state() == ConnectedState || state() == ConnectingState) {
185 setErrorString(tr(
"Trying to connect while connection is in progress"));
186 emit errorOccurred(QLocalSocket::OperationError);
190 d->errorString.clear();
191 d->state = ConnectingState;
192 emit stateChanged(d->state);
194 if (d->serverName.isEmpty()) {
195 d->setErrorAndEmit(ServerNotFoundError,
"QLocalSocket::connectToServer"_L1);
199 const auto prefix =
"QLocalServer/"_L1;
200 if (d->serverName.startsWith(prefix))
201 d->fullServerName = d->serverName;
203 d->fullServerName = prefix + d->serverName;
205 QSettings settings(
"QtProject"_L1,
"Qt"_L1);
207 const quint16 port = settings.value(d->fullServerName).toUInt(&ok);
209 d->setErrorAndEmit(ServerNotFoundError,
"QLocalSocket::connectToServer"_L1);
212 QIODevice::open(openMode);
213 d->tcpSocket->connectToHost(QHostAddress::LocalHost, port, openMode);
216bool QLocalSocket::setSocketDescriptor(qintptr socketDescriptor,
217 LocalSocketState socketState, OpenMode openMode)
220 QAbstractSocket::SocketState newSocketState = QAbstractSocket::UnconnectedState;
221 switch (socketState) {
222 case ConnectingState:
223 newSocketState = QAbstractSocket::ConnectingState;
226 newSocketState = QAbstractSocket::ConnectedState;
229 newSocketState = QAbstractSocket::ClosingState;
231 case UnconnectedState:
232 newSocketState = QAbstractSocket::UnconnectedState;
235 QIODevice::open(openMode);
236 d->state = socketState;
239 QLocalServer* localServer = qobject_cast<QLocalServer*>( parent() );
241 for (QObject* child : localServer->children()) {
242 QTcpSocket* childTcpSocket = qobject_cast<QTcpSocket*>(child);
243 if (childTcpSocket && childTcpSocket->socketDescriptor() == socketDescriptor) {
244 d->setSocket(
static_cast<QLocalUnixSocket*>(childTcpSocket) );
252 return d->tcpSocket->setSocketDescriptor(socketDescriptor,
253 newSocketState, openMode);
342QLocalSocket::LocalSocketError QLocalSocket::error()
const
344 Q_D(
const QLocalSocket);
345 switch (d->tcpSocket->error()) {
346 case QAbstractSocket::ConnectionRefusedError:
347 return QLocalSocket::ConnectionRefusedError;
348 case QAbstractSocket::RemoteHostClosedError:
349 return QLocalSocket::PeerClosedError;
350 case QAbstractSocket::HostNotFoundError:
351 return QLocalSocket::ServerNotFoundError;
352 case QAbstractSocket::SocketAccessError:
353 return QLocalSocket::SocketAccessError;
354 case QAbstractSocket::SocketResourceError:
355 return QLocalSocket::SocketResourceError;
356 case QAbstractSocket::SocketTimeoutError:
357 return QLocalSocket::SocketTimeoutError;
358 case QAbstractSocket::DatagramTooLargeError:
359 return QLocalSocket::DatagramTooLargeError;
360 case QAbstractSocket::NetworkError:
361 return QLocalSocket::ConnectionError;
362 case QAbstractSocket::UnsupportedSocketOperationError:
363 return QLocalSocket::UnsupportedSocketOperationError;
364 case QAbstractSocket::UnknownSocketError:
365 return QLocalSocket::UnknownSocketError;
367#if defined QLOCALSOCKET_DEBUG
368 qWarning() <<
"QLocalSocket error not handled:" << d->tcpSocket->error();
372 return UnknownSocketError;