summaryrefslogtreecommitdiffstats
path: root/src/network/socket
diff options
context:
space:
mode:
authorShane Kearns <shane.kearns@accenture.com>2011-02-25 18:01:58 (GMT)
committerShane Kearns <shane.kearns@accenture.com>2011-02-28 12:26:09 (GMT)
commit8d74ddeba364785bf3d0d0659e5bb91ab950540d (patch)
treec7a98ba22c2d192966dbe3f5d92a8d0d46159b90 /src/network/socket
parent6c57e9a681bf82b9bcb4b0659d151a76ecd1455e (diff)
downloadQt-8d74ddeba364785bf3d0d0659e5bb91ab950540d.zip
Qt-8d74ddeba364785bf3d0d0659e5bb91ab950540d.tar.gz
Qt-8d74ddeba364785bf3d0d0659e5bb91ab950540d.tar.bz2
Do not error socket when writeDatagram would block
When starting a connection implicitly, datagrams fail with KErrWouldBlock on S60 5.0 and earlier. On symbian 3, they are dropped without error, but the bytes written is set to 0. Due to an apparent bug in symbian, the first packet is failed/dropped on a UDP socket even if the bearer is up due to existing TCP connection. With blocking sockets or explicit RConnection usage, this doesn't happen. Reviewed-by: Markus Goetz
Diffstat (limited to 'src/network/socket')
-rw-r--r--src/network/socket/qsymbiansocketengine.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/network/socket/qsymbiansocketengine.cpp b/src/network/socket/qsymbiansocketengine.cpp
index 5dec4ee..18ce5e0 100644
--- a/src/network/socket/qsymbiansocketengine.cpp
+++ b/src/network/socket/qsymbiansocketengine.cpp
@@ -845,8 +845,19 @@ qint64 QSymbianSocketEngine::writeDatagram(const char *data, qint64 len,
User::WaitForRequest(status); //Non blocking send
TInt err = status.Int();
+#if defined (QNATIVESOCKETENGINE_DEBUG)
+ qDebug("QSymbianSocketEngine::writeDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli (err=%d)", data,
+ qt_prettyDebug(data, qMin<int>(len, 16), len).data(), len, host.toString().toLatin1().constData(),
+ port, (qint64) sentBytes(), err);
+#endif
+
if (err) {
switch (err) {
+ case KErrWouldBlock:
+ // do not error the socket. (otherwise socket layer is reset)
+ // On symbian^1 and earlier, KErrWouldBlock is returned when interface is not up yet
+ // On symbian^3, KErrNone is returned but sentBytes = 0
+ return 0;
case KErrTooBig:
d->setError(QAbstractSocket::DatagramTooLargeError, d->DatagramTooLargeErrorString);
break;
@@ -855,13 +866,7 @@ qint64 QSymbianSocketEngine::writeDatagram(const char *data, qint64 len,
}
}
-#if defined (QNATIVESOCKETENGINE_DEBUG)
- qDebug("QSymbianSocketEnginePrivate::sendDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli", data,
- qt_prettyDebug(data, qMin<int>(len, 16), len).data(), len, host.toString().toLatin1().constData(),
- port, (qint64) sentBytes());
-#endif
-
- return qint64(sentBytes());
+ return (err < 0) ? -1 : len;
}
// FIXME check where the native socket engine called that..