diff options
author | Shane Kearns <shane.kearns@accenture.com> | 2011-02-25 18:01:58 (GMT) |
---|---|---|
committer | Shane Kearns <shane.kearns@accenture.com> | 2011-02-28 12:26:09 (GMT) |
commit | 8d74ddeba364785bf3d0d0659e5bb91ab950540d (patch) | |
tree | c7a98ba22c2d192966dbe3f5d92a8d0d46159b90 /src/network/socket | |
parent | 6c57e9a681bf82b9bcb4b0659d151a76ecd1455e (diff) | |
download | Qt-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.cpp | 19 |
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.. |