qlocalsocket_unix.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/network/socket/qlocalsocket_unix.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7-
8-
9-
10-
11-
12-
13-
14-
15-
16-
17-
18QLocalSocketPrivate::QLocalSocketPrivate() : QIODevicePrivate(),-
19 delayConnect(0),-
20 connectTimer(0),-
21 connectingSocket(-1),-
22 connectingOpenMode(0),-
23 state(QLocalSocket::UnconnectedState)-
24{-
25}-
26-
27void QLocalSocketPrivate::init()-
28{-
29 QLocalSocket * const q = q_func();-
30-
31 q->connect(&unixSocket, qFlagLocation("2""aboutToClose()" "\0" __FILE__ ":" "72""78"), q, qFlagLocation("2""aboutToClose()" "\0" __FILE__ ":" "72""78"));-
32 q->connect(&unixSocket, qFlagLocation("2""bytesWritten(qint64)" "\0" __FILE__ ":" "73""79"),-
33 q, qFlagLocation("2""bytesWritten(qint64)" "\0" __FILE__ ":" "74""80"));-
34 q->connect(&unixSocket, qFlagLocation("2""readyRead()" "\0" __FILE__ ":" "75""81"), q, qFlagLocation("2""readyRead()" "\0" __FILE__ ":" "75""81"));-
35-
36 q->connect(&unixSocket, qFlagLocation("2""connected()" "\0" __FILE__ ":" "77""83"), q, qFlagLocation("2""connected()" "\0" __FILE__ ":" "77""83"));-
37 q->connect(&unixSocket, qFlagLocation("2""disconnected()" "\0" __FILE__ ":" "78""84"), q, qFlagLocation("2""disconnected()" "\0" __FILE__ ":" "78""84"));-
38 q->connect(&unixSocket, qFlagLocation("2""stateChanged(QAbstractSocket::SocketState)" "\0" __FILE__ ":" "79""85"),-
39 q, qFlagLocation("1""_q_stateChanged(QAbstractSocket::SocketState)" "\0" __FILE__ ":" "80""86"));-
40 q->connect(&unixSocket, qFlagLocation("2""error(QAbstractSocket::SocketError)" "\0" __FILE__ ":" "81""87"),-
41 q, qFlagLocation("1""_q_error(QAbstractSocket::SocketError)" "\0" __FILE__ ":" "82""88"));-
42 q->connect(&unixSocket, qFlagLocation("2""readChannelFinished()" "\0" __FILE__ ":" "83""89"), q, qFlagLocation("2""readChannelFinished()" "\0" __FILE__ ":" "83""89"));-
43 unixSocket.setParent(q);-
44}-
45-
46void QLocalSocketPrivate::_q_error(QAbstractSocket::SocketError socketError)-
47{-
48 QLocalSocket * const q = q_func();-
49 QString function = QLatin1String("QLocalSocket");-
50 QLocalSocket::LocalSocketError error = (QLocalSocket::LocalSocketError)socketError;-
51 QString errorString = generateErrorString(error, function);-
52 q->setErrorString(errorString);-
53 q->error(error);-
54}-
55-
56void QLocalSocketPrivate::_q_stateChanged(QAbstractSocket::SocketState newState)-
57{-
58 QLocalSocket * const q = q_func();-
59 QLocalSocket::LocalSocketState currentState = state;-
60 switch(newState) {-
61 case QAbstractSocket::UnconnectedState:-
62 state = QLocalSocket::UnconnectedState;-
63 serverName.clear();-
64 fullServerName.clear();-
65 break;-
66 case QAbstractSocket::ConnectingState:-
67 state = QLocalSocket::ConnectingState;-
68 break;-
69 case QAbstractSocket::ConnectedState:-
70 state = QLocalSocket::ConnectedState;-
71 break;-
72 case QAbstractSocket::ClosingState:-
73 state = QLocalSocket::ClosingState;-
74 break;-
75 default:-
76-
77-
78-
79 return;-
80 }-
81 if (currentState != state)-
82 q->stateChanged(state);-
83}-
84-
85QString QLocalSocketPrivate::generateErrorString(QLocalSocket::LocalSocketError error, const QString &function) const-
86{-
87 QString errorString;-
88 switch (error) {-
89 case QLocalSocket::ConnectionRefusedError:-
90 errorString = QLocalSocket::tr("%1: Connection refused").arg(function);-
91 break;-
92 case QLocalSocket::PeerClosedError:-
93 errorString = QLocalSocket::tr("%1: Remote closed").arg(function);-
94 break;-
95 case QLocalSocket::ServerNotFoundError:-
96 errorString = QLocalSocket::tr("%1: Invalid name").arg(function);-
97 break;-
98 case QLocalSocket::SocketAccessError:-
99 errorString = QLocalSocket::tr("%1: Socket access error").arg(function);-
100 break;-
101 case QLocalSocket::SocketResourceError:-
102 errorString = QLocalSocket::tr("%1: Socket resource error").arg(function);-
103 break;-
104 case QLocalSocket::SocketTimeoutError:-
105 errorString = QLocalSocket::tr("%1: Socket operation timed out").arg(function);-
106 break;-
107 case QLocalSocket::DatagramTooLargeError:-
108 errorString = QLocalSocket::tr("%1: Datagram too large").arg(function);-
109 break;-
110 case QLocalSocket::ConnectionError:-
111 errorString = QLocalSocket::tr("%1: Connection error").arg(function);-
112 break;-
113 case QLocalSocket::UnsupportedSocketOperationError:-
114 errorString = QLocalSocket::tr("%1: The socket operation is not supported").arg(function);-
115 break;-
116 case QLocalSocket::OperationError:-
117 errorString = QLocalSocket::tr("%1: Operation not permitted when socket is in this state").arg(function);-
118 break;-
119 case QLocalSocket::UnknownSocketError:-
120 default:-
121 errorString = QLocalSocket::tr("%1: Unknown error %2").arg(function).arg((*__errno_location ()));-
122 }-
123 return errorString;-
124}-
125-
126void QLocalSocketPrivate::errorOccurred(QLocalSocket::LocalSocketError error, const QString &function)-
127{-
128 QLocalSocket * const q = q_func();-
129 switch (error) {-
130 case QLocalSocket::ConnectionRefusedError:-
131 unixSocket.setSocketError(QAbstractSocket::ConnectionRefusedError);-
132 break;-
133 case QLocalSocket::PeerClosedError:-
134 unixSocket.setSocketError(QAbstractSocket::RemoteHostClosedError);-
135 break;-
136 case QLocalSocket::ServerNotFoundError:-
137 unixSocket.setSocketError(QAbstractSocket::HostNotFoundError);-
138 break;-
139 case QLocalSocket::SocketAccessError:-
140 unixSocket.setSocketError(QAbstractSocket::SocketAccessError);-
141 break;-
142 case QLocalSocket::SocketResourceError:-
143 unixSocket.setSocketError(QAbstractSocket::SocketResourceError);-
144 break;-
145 case QLocalSocket::SocketTimeoutError:-
146 unixSocket.setSocketError(QAbstractSocket::SocketTimeoutError);-
147 break;-
148 case QLocalSocket::DatagramTooLargeError:-
149 unixSocket.setSocketError(QAbstractSocket::DatagramTooLargeError);-
150 break;-
151 case QLocalSocket::ConnectionError:-
152 unixSocket.setSocketError(QAbstractSocket::NetworkError);-
153 break;-
154 case QLocalSocket::UnsupportedSocketOperationError:-
155 unixSocket.setSocketError(QAbstractSocket::UnsupportedSocketOperationError);-
156 break;-
157 case QLocalSocket::UnknownSocketError:-
158 default:-
159 unixSocket.setSocketError(QAbstractSocket::UnknownSocketError);-
160 }-
161-
162 QString errorString = generateErrorString(error, function);-
163 q->setErrorString(errorString);-
164 q->error(error);-
165-
166-
167 unixSocket.setSocketState(QAbstractSocket::UnconnectedState);-
168 bool stateChanged = (state != QLocalSocket::UnconnectedState);-
169 state = QLocalSocket::UnconnectedState;-
170 q->close();-
171 if (stateChanged)-
172 q-> stateChanged(state);-
173}-
174-
175void QLocalSocket::connectToServer(OpenMode openMode)-
176{-
177 QLocalSocketPrivate * const d = d_func();-
178 if (state() == ConnectedState || state() == ConnectingState) {-
179 QString errorString = d->generateErrorString(QLocalSocket::OperationError, QLatin1String("QLocalSocket::connectToserver"));-
180 setErrorString(errorString);-
181 error(QLocalSocket::OperationError);-
182 return;-
183 }-
184-
185 d->errorString.clear();-
186 d->unixSocket.setSocketState(QAbstractSocket::ConnectingState);-
187 d->state = ConnectingState;-
188 stateChanged(d->state);-
189-
190 if (d->serverName.isEmpty()) {-
191 d->errorOccurred(ServerNotFoundError,-
192 QLatin1String("QLocalSocket::connectToServer"));-
193 return;-
194 }-
195-
196-
197 if (-1 == (d->connectingSocket = qt_safe_socket(1, SOCK_STREAM, 0, 04000))) {-
198 d->errorOccurred(UnsupportedSocketOperationError,-
199 QLatin1String("QLocalSocket::connectToServer"));-
200 return;-
201 }-
202-
203-
204 d->connectingName = d->serverName;-
205 d->connectingOpenMode = openMode;-
206 d->_q_connectToSocket();-
207 return;-
208}-
209void QLocalSocketPrivate::_q_connectToSocket()-
210{-
211 QLocalSocket * const q = q_func();-
212 QString connectingPathName;-
213-
214-
215 if (connectingName.startsWith(QLatin1Char('/'))) {-
216 connectingPathName = connectingName;-
217 } else {-
218 connectingPathName = QDir::tempPath();-
219 connectingPathName += QLatin1Char('/') + connectingName;-
220 }-
221-
222 const QByteArray encodedConnectingPathName = QFile::encodeName(connectingPathName);-
223 struct sockaddr_un name;-
224 name.sun_family = 1;-
225 if (sizeof(name.sun_path) < (uint)encodedConnectingPathName.size() + 1) {-
226 QString function = QLatin1String("QLocalSocket::connectToServer");-
227 errorOccurred(QLocalSocket::ServerNotFoundError, function);-
228 return;-
229 }-
230 ::memcpy(name.sun_path, encodedConnectingPathName.constData(),-
231 encodedConnectingPathName.size() + 1);-
232 if (-1 == qt_safe_connect(connectingSocket, (struct sockaddr *)&name, sizeof(name))) {-
233 QString function = QLatin1String("QLocalSocket::connectToServer");-
234 switch ((*__errno_location ()))-
235 {-
236 case 22:-
237 case 111:-
238 errorOccurred(QLocalSocket::ConnectionRefusedError, function);-
239 break;-
240 case 2:-
241 errorOccurred(QLocalSocket::ServerNotFoundError, function);-
242 break;-
243 case 13:-
244 case 1:-
245 errorOccurred(QLocalSocket::SocketAccessError, function);-
246 break;-
247 case 110:-
248 errorOccurred(QLocalSocket::SocketTimeoutError, function);-
249 break;-
250 case 11:-
251-
252 if (!delayConnect) {-
253 delayConnect = new QSocketNotifier(connectingSocket, QSocketNotifier::Write, q);-
254 q->connect(delayConnect, qFlagLocation("2""activated(int)" "\0" __FILE__ ":" "303""309"), q, qFlagLocation("1""_q_connectToSocket()" "\0" __FILE__ ":" "303""309"));-
255 }-
256 if (!connectTimer) {-
257 connectTimer = new QTimer(q);-
258 q->connect(connectTimer, qFlagLocation("2""timeout()" "\0" __FILE__ ":" "307""313"),-
259 q, qFlagLocation("1""_q_abortConnectionAttempt()" "\0" __FILE__ ":" "308""314"),-
260 Qt::DirectConnection);-
261 connectTimer->start(30000);-
262 }-
263 delayConnect->setEnabled(true);-
264 break;-
265 default:-
266 errorOccurred(QLocalSocket::UnknownSocketError, function);-
267 }-
268 return;-
269 }-
270-
271-
272 cancelDelayedConnect();-
273-
274 serverName = connectingName;-
275 fullServerName = connectingPathName;-
276 if (unixSocket.setSocketDescriptor(connectingSocket,-
277 QAbstractSocket::ConnectedState, connectingOpenMode)) {-
278 q->QIODevice::open(connectingOpenMode | QIODevice::Unbuffered);-
279 q-> connected();-
280 } else {-
281 QString function = QLatin1String("QLocalSocket::connectToServer");-
282 errorOccurred(QLocalSocket::UnknownSocketError, function);-
283 }-
284 connectingSocket = -1;-
285 connectingName.clear();-
286 connectingOpenMode = 0;-
287}-
288-
289bool QLocalSocket::setSocketDescriptor(qintptr socketDescriptor,-
290 LocalSocketState socketState, OpenMode openMode)-
291{-
292 QLocalSocketPrivate * const d = d_func();-
293 QAbstractSocket::SocketState newSocketState = QAbstractSocket::UnconnectedState;-
294 switch (socketState) {-
295 case ConnectingState:-
296 newSocketState = QAbstractSocket::ConnectingState;-
297 break;-
298 case ConnectedState:-
299 newSocketState = QAbstractSocket::ConnectedState;-
300 break;-
301 case ClosingState:-
302 newSocketState = QAbstractSocket::ClosingState;-
303 break;-
304 case UnconnectedState:-
305 newSocketState = QAbstractSocket::UnconnectedState;-
306 break;-
307 }-
308 QIODevice::open(openMode);-
309 d->state = socketState;-
310 return d->unixSocket.setSocketDescriptor(socketDescriptor,-
311 newSocketState, openMode);-
312}-
313-
314void QLocalSocketPrivate::_q_abortConnectionAttempt()-
315{-
316 QLocalSocket * const q = q_func();-
317 q->close();-
318}-
319-
320void QLocalSocketPrivate::cancelDelayedConnect()-
321{-
322 if (delayConnect) {-
323 delayConnect->setEnabled(false);-
324 delete delayConnect;-
325 delayConnect = 0;-
326 connectTimer->stop();-
327 delete connectTimer;-
328 connectTimer = 0;-
329 }-
330}-
331-
332qintptr QLocalSocket::socketDescriptor() const-
333{-
334 const QLocalSocketPrivate * const d = d_func();-
335 return d->unixSocket.socketDescriptor();-
336}-
337-
338qint64 QLocalSocket::readData(char *data, qint64 c)-
339{-
340 QLocalSocketPrivate * const d = d_func();-
341 return d->unixSocket.read(data, c);-
342}-
343-
344qint64 QLocalSocket::writeData(const char *data, qint64 c)-
345{-
346 QLocalSocketPrivate * const d = d_func();-
347 return d->unixSocket.writeData(data, c);-
348}-
349-
350void QLocalSocket::abort()-
351{-
352 QLocalSocketPrivate * const d = d_func();-
353 d->unixSocket.abort();-
354}-
355-
356qint64 QLocalSocket::bytesAvailable() const-
357{-
358 const QLocalSocketPrivate * const d = d_func();-
359 return QIODevice::bytesAvailable() + d->unixSocket.bytesAvailable();-
360}-
361-
362qint64 QLocalSocket::bytesToWrite() const-
363{-
364 const QLocalSocketPrivate * const d = d_func();-
365 return d->unixSocket.bytesToWrite();-
366}-
367-
368bool QLocalSocket::canReadLine() const-
369{-
370 const QLocalSocketPrivate * const d = d_func();-
371 return QIODevice::canReadLine() || d->unixSocket.canReadLine();-
372}-
373-
374void QLocalSocket::close()-
375{-
376 QLocalSocketPrivate * const d = d_func();-
377 d->unixSocket.close();-
378 d->cancelDelayedConnect();-
379 if (d->connectingSocket != -1)-
380 ::close(d->connectingSocket);-
381 d->connectingSocket = -1;-
382 d->connectingName.clear();-
383 d->connectingOpenMode = 0;-
384 d->serverName.clear();-
385 d->fullServerName.clear();-
386 QIODevice::close();-
387}-
388-
389bool QLocalSocket::waitForBytesWritten(int msecs)-
390{-
391 QLocalSocketPrivate * const d = d_func();-
392 return d->unixSocket.waitForBytesWritten(msecs);-
393}-
394-
395bool QLocalSocket::flush()-
396{-
397 QLocalSocketPrivate * const d = d_func();-
398 return d->unixSocket.flush();-
399}-
400-
401void QLocalSocket::disconnectFromServer()-
402{-
403 QLocalSocketPrivate * const d = d_func();-
404 d->unixSocket.disconnectFromHost();-
405}-
406-
407QLocalSocket::LocalSocketError QLocalSocket::error() const-
408{-
409 const QLocalSocketPrivate * const d = d_func();-
410 switch (d->unixSocket.error()) {-
411 case QAbstractSocket::ConnectionRefusedError:-
412 return QLocalSocket::ConnectionRefusedError;-
413 case QAbstractSocket::RemoteHostClosedError:-
414 return QLocalSocket::PeerClosedError;-
415 case QAbstractSocket::HostNotFoundError:-
416 return QLocalSocket::ServerNotFoundError;-
417 case QAbstractSocket::SocketAccessError:-
418 return QLocalSocket::SocketAccessError;-
419 case QAbstractSocket::SocketResourceError:-
420 return QLocalSocket::SocketResourceError;-
421 case QAbstractSocket::SocketTimeoutError:-
422 return QLocalSocket::SocketTimeoutError;-
423 case QAbstractSocket::DatagramTooLargeError:-
424 return QLocalSocket::DatagramTooLargeError;-
425 case QAbstractSocket::NetworkError:-
426 return QLocalSocket::ConnectionError;-
427 case QAbstractSocket::UnsupportedSocketOperationError:-
428 return QLocalSocket::UnsupportedSocketOperationError;-
429 case QAbstractSocket::UnknownSocketError:-
430 return QLocalSocket::UnknownSocketError;-
431 default:-
432-
433-
434-
435 break;-
436 }-
437 return UnknownSocketError;-
438}-
439-
440bool QLocalSocket::isValid() const-
441{-
442 const QLocalSocketPrivate * const d = d_func();-
443 return d->unixSocket.isValid();-
444}-
445-
446qint64 QLocalSocket::readBufferSize() const-
447{-
448 const QLocalSocketPrivate * const d = d_func();-
449 return d->unixSocket.readBufferSize();-
450}-
451-
452void QLocalSocket::setReadBufferSize(qint64 size)-
453{-
454 QLocalSocketPrivate * const d = d_func();-
455 d->unixSocket.setReadBufferSize(size);-
456}-
457-
458bool QLocalSocket::waitForConnected(int msec)-
459{-
460 QLocalSocketPrivate * const d = d_func();-
461-
462 if (state() != ConnectingState
state() != ConnectingStateDescription
TRUEevaluated 78 times by 2 tests
Evaluated by:
  • tst_QNetworkReply
  • tst_qlocalsocket - unknown status
FALSEnever evaluated
)
0-78
463 return
executed 78 times by 2 tests: return (state() == ConnectedState);
Executed by:
  • tst_QNetworkReply
  • tst_qlocalsocket - unknown status
(state() == ConnectedState);
executed 78 times by 2 tests: return (state() == ConnectedState);
Executed by:
  • tst_QNetworkReply
  • tst_qlocalsocket - unknown status
78
464-
465 fd_set fds;-
do { int __d0, __d1; __asm__ __volatile__ ("cld; repQElapsedTimer timer;
466 " "stosq" : "=c" (__d0), "timer.start();-
467-
468 pollfd pfd = D" (__d1) : "a" (0), "0" (sizeof (fd_set) / sizeof (__fd_mask)), "1" (&((&fds)->fds_bits)[0]) : "memory"); } while (0);-
((void) (((&fds)->fds_bits)[((d->connectingSocket) / (8 * (int) sizeofqt_make_pollfd(__fd_mask)))] |= ((__fd_mask) 1 << ((d->connectingSocket) % (8 * (, 0x001);
469-
470 do {-
471 const int ) sizeof (__fd_mask))))));0
timeval timeout;
timeout.tv_sec = msec / 1000;timeout .tv_usec= (
(msec > 0)Description
TRUEnever evaluated
FALSEnever evaluated
msec % 1000) * 1000;
(msec > 0)Description
TRUEnever evaluated
FALSEnever evaluated
if (
(msec > 0)Description
TRUEnever evaluated
FALSEnever evaluated
(msec > 0)Description
TRUEnever evaluated
FALSEnever evaluated
> 0== msec)
(msec > 0)Description
TRUEnever evaluated
FALSEnever evaluated
timeout.tv_usec = 1000;
int result = -1;
QElapsedTimer timer;
timer.start();
while? qMax(state() == ConnectingState
&& (-1 ==msec ||- timer.elapsed()(), static_cast<mseclong long>(0LL)) {: msec;
472 const int result = ::selectqt_poll_msecs(d->connectingSocket + 1, &fds, 0&pfd, 01, &timeouttimeout);-
473-
474 if (-1 ==(result && (*__errno_location ()) != 4== -1
result == -1Description
TRUEnever evaluated
FALSEnever evaluated
)
0
475 {d->errorOccurred(QLocalSocket::UnknownSocketError,
never executed: d->errorOccurred(QLocalSocket::UnknownSocketError, QLatin1String("QLocalSocket::waitForConnected"));
0
476 QLatin1String("QLocalSocket::waitForConnected"));
never executed: d->errorOccurred(QLocalSocket::UnknownSocketError, QLatin1String("QLocalSocket::waitForConnected"));
0
477 break;0
}else if (result > 0
result > 0Description
TRUEnever evaluated
FALSEnever evaluated
)
478 d->_q_connectToSocket();
never executed: d->_q_connectToSocket();
0
479 }
never executed: end of block
while (state() == ConnectingState
state() == ConnectingStateDescription
TRUEnever evaluated
FALSEnever evaluated
&& !timer.hasExpired(msec)
!timer.hasExpired(msec)Description
TRUEnever evaluated
FALSEnever evaluated
);
0
480-
481 return
never executed: return (state() == ConnectedState);
(state() == ConnectedState);
never executed: return (state() == ConnectedState);
0
482}-
483-
484bool QLocalSocket::waitForDisconnected(int msecs)-
485{-
486 QLocalSocketPrivate * const d = d_func();-
487 if (state() == UnconnectedState) {-
488 QMessageLogger(__FILE__, 548543, __PRETTY_FUNCTION__).warning("QLocalSocket::waitForDisconnected() is not allowed in UnconnectedState");-
489 return false;-
490 }-
491 return (d->unixSocket.waitForDisconnected(msecs));-
492}-
493-
494bool QLocalSocket::waitForReadyRead(int msecs)-
495{-
496 QLocalSocketPrivate * const d = d_func();-
497 if (state() == QLocalSocket::UnconnectedState)-
498 return false;-
499 return (d->unixSocket.waitForReadyRead(msecs));-
500}-
501-
502-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9