summaryrefslogtreecommitdiffstats
path: root/src/network
Commit message (Collapse)AuthorAgeFilesLines
* QSslError: fix wrong #endif placementMarc Mutz2012-02-251-1/+1
| | | | | | | | This would break a namespaced Qt when QT_NO_DEBUG_STREAM was in effect. Unlikely to hit, but nevertheless fixworthy. Change-Id: Ie2a4cf4334a6a610c84233ab1ca89b928386c91a Reviewed-by: Richard J. Moore <rich@kde.org>
* QSslSocket::verify certificates when on-demand loading is usedMartin Petersson2012-02-231-0/+4
| | | | | | Task-number: QTBUG-24350 Change-Id: I5a328efe6606f5d438bb4787a5c02a425ce42aca Reviewed-by: Richard J. Moore <rich@kde.org>
* Drop file-engine abstraction from public APIJoão Abecasis2012-02-221-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This abstraction imposed serious performance penalties and is being dropped from the public API. In particular, by allowing file names to be arbitrarily hijacked by different file engines, and requiring engines to be instantiated in order to decide, it imposed unnecessary overhead on all file operations. Another flaw in the design with direct impact on performance is how engines have no way to provide (or retain) additional information obtained when querying the filesystem. In many places this has meant repeated operations on the file system, where useful information is immediately discarded to be queried again subsequently. For Qt 4.8 a major refactoring of the code base took place to allow bypassing the file-engine abstraction in select places, with considerable performance gains observed. In Qt 5 it is expected we'll be able to take this further, reaping even more benefits, but the abstraction has to go. [Dropping this now does not preclude that virtual file systems make an appearance in Qt at a later point in Qt 5's lifecycle. Hopefully with a new and improved abstraction.] Forward declarations for QFileExtension(Result) were dropped, as the classes were never used or defined. Tests using "internalized" classes will only fully run on developer builds. QFSFileEngine was removed altogether from exception safety test, as it isn't its intent to test internal API. Change-Id: Ie910e6c2628be202ea9e05366b091d6d529b246b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
* Fix error in addrlen fieldAndrew Stanley-Jones2012-02-211-1/+1
| | | | | | | | addrlen must be initialize to the amount of space available in the buffer. Change-Id: I52945d780bba9d22aeaa7ac5a35a0e54dbea60dc Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Test for QT_NO_SSL instead of QT_NO_OPENSSLShane Kearns2012-02-2121-65/+65
| | | | | | | | Change the ifdefs in our own code (except openssl backend) to use the new configure flag. Change-Id: I8774734771c66b22164b5fae8fdb27814ac3df7b Reviewed-by: Richard J. Moore <rich@kde.org>
* Make https requests fail fast when configured without ssl supportShane Kearns2012-02-212-1/+8
| | | | | | | | | | | | Restored the Qt4 behaviour where attempting a https request using QNetworkAccessManager fails with ProtocolUnsupportedError instead of timing out or hanging. Covered by existing autotests. Task-number: QTBUG-17189 Change-Id: Iceb1ba6558c7d2b1af8ddf8d4ea9315a5b44d970 Reviewed-by: Richard J. Moore <rich@kde.org>
* Windows - fix connecting to a socket using IPv4 mapped IPv6Shane Kearns2012-02-201-0/+10
| | | | | | | | | | | | Connecting to an IPv4 mapped IPv6 address (e.g. ::FFFF:127.0.0.1) requires the IPV6_V6ONLY socket option to be cleared. This was causing tst_qtcpserver::ipv6ServerMapped autotest to fail. The same change is not required on MacOS X - the test passes there. Task-number: QTBUG-24351 Change-Id: I6c08b19f0daa12765da2d44792ffb17299322695 Reviewed-by: Markus Goetz <markus@woboq.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Trivial doc fixRichard Moore2012-02-181-1/+1
| | | | | Change-Id: I9b63e0b63f225b245eec68ea4211cb0f2ccf9bb5 Reviewed-by: Sergio Ahumada <sergio.ahumada@nokia.com>
* Fix error handling in QHostInfo windows backendShane Kearns2012-02-171-10/+18
| | | | | | | | | | If the DNS server returns a non authoritative host not found response, then windows returns WSATRY_AGAIN error code. This is now reported as HostNotFound and not UnknownError Change-Id: I212985acd4e85ff4b2bdb6c57ec403405a7695fb Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com> Reviewed-by: Richard J. Moore <rich@kde.org>
* Remove unnecessary locking from QNetworkProxy constructorShane Kearns2012-02-171-17/+6
| | | | | | | | | | | | | | | | | | | | | | | QGlobalNetworkProxy (a singleton) had two phase construction, with the second phase being called from QNetworkProxy's constructor. This isn't necessary, and has been reported as causing deadlocks. Although constructing socket engine handlers has side effects (they add themselves to a list on construction and remove themselves on destruction), this appears to be safe. The socket engine handlers are only used while holding the list mutex, and any socket engines created don't have any reference to the factory that created them. With the new version, it is possible that two instances of QHttpSocketEngineHandler and QSocks5SocketEngineHandler exist temporarily if a Q_GLOBAL_STATIC initialisation race occurs. This appears safe, because the loser of the race deletes its handlers, which remove themselves from the global list as above. Task-number: QTBUG-13088 Change-Id: I8cf520da717d8ab7d862ab89c6de13aea6d60ac3 Reviewed-by: Richard J. Moore <rich@kde.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Fix warnings about missing file.Friedemann Kleint2012-02-171-1/+1
| | | | | Change-Id: I8644d2b80bab9c18f666d742da389e84bf3f124c Reviewed-by: Xizhi Zhu <xizhi.zhu@nokia.com>
* Fix handling of urls containing username/password in QNetworkAccessManagerShane Kearns2012-02-171-0/+10
| | | | | | | | | | | | | | | | | | QNetworkAccessManager was ignoring the supplied credentials, although webkit seems to support these urls at a higher level. Following the behaviour of browsers: We use supplied credentials if authentication is required. We add supplied credentials to the authentication cache. We emit authenticationRequired signal if the credentials were wrong. We do not use previously cached credentials for that url Synchronous http requests fail, if the credentials were wrong. Task-number: QTBUG-18107 Change-Id: If46e8eab1511ba8a0f4bbe0d4efaabc4df0b8ab4 Reviewed-by: Richard J. Moore <rich@kde.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Fix incorrect use of QObject::disconnect in synchronous http requestShane Kearns2012-02-171-2/+4
| | | | | | | | | In certain circumstances, this could cause the request to time out (and repeatedly send bad authentication credentials to the server) instead of failing with AuthenticationRequiredError. Change-Id: Iff66b32f1d7268f21fd77b6620aae4b5d49d857f Reviewed-by: Richard J. Moore <rich@kde.org>
* Update documentation to show NTLMv2 is supportedShane Kearns2012-02-171-4/+2
| | | | | | | | | This feature was implemented in 4.8, but documentation was not updated at the time. Task-number: QTBUG-18181 Change-Id: I657d7ab7aaf43b73b7bf8fd1cb76086522cf5c2b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Make sure to print short text for QSslCertifictaeExtension.Casper van Donderen2012-02-171-1/+2
| | | | | | Change-Id: If2471bea27f095352ae8c28604e104b896fd97c7 Reviewed-by: Richard J. Moore <rich@kde.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Qt Network: Added the \inmodule command in the class documentation.Michalina Ziemba2012-02-168-6/+15
| | | | | | | | -Some of the public classes were missing the \inmodule command. -Fixed a sentence. Change-Id: I88ebe12680c744e32253dc01c5ddb4292267caf9 Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
* Include headers before QT_BEGIN_NAMESPACE.Xizhi Zhu2012-02-162-2/+3
| | | | | Change-Id: Icaef1cb280d2968e4a35c93375749d2d9feff856 Reviewed-by: Shane Kearns <ext-shane.2.kearns@nokia.com>
* Add missing private headers to .pri.Xizhi Zhu2012-02-161-1/+6
| | | | | Change-Id: Ia0f37953124198dce000adad9dfae051925d526e Reviewed-by: Shane Kearns <ext-shane.2.kearns@nokia.com>
* Various documentation fixes ported from Qt 4.8Teemu Katajisto2012-02-151-3/+3
| | | | | | | | | | | | | | | | | | Final set of selected documentation fixes for qtbase from Qt 4.8 commit bacae725e584f51ee2fd83af7bef3e4515de9587 Task-number: QTBUG-13362 Task-number: QTBUG-18356 Task-number: QTBUG-18417 Task-number: QTBUG-18664 Task-number: QTBUG-21562 Task-number: QTBUG-22094 Task-number: QTBUG-18741 Task-number: QTBUG-15921 Task-number: QTBUG-15738 Change-Id: I3bd33bb7ce7aa991913ba82f3ea0e4b124f3ee41 Reviewed-by: Casper van Donderen <casper.vandonderen@nokia.com>
* Allow the QLocalServer to listen to a native descriptorAndrew Stanley-Jones2012-02-156-0/+91
| | | | | | | | | | | | | QLocalServer could only listen to sockets it created. Thi is not always possible as sockets may be passed by socketpair() or have to be created locally by other means. This adds a similar feature to QLocalSocket where a native descriptor maybe used. Change-Id: I43b0af179b3b868dd164d4e1fd312ff4546cf9ff Reviewed-by: Michalina Ziemba <michalina.ziemba@nokia.com> Reviewed-by: Tapani Mikola <tapani.mikola@nokia.com> Reviewed-by: Harald Fernengel <harald.fernengel@nokia.com>
* Abort FTP download, not the whole applicationShane Kearns2012-02-151-5/+1
| | | | | | | | | | An old coding error meant that the C runtime abort() function was being called instead of QFtp::abort() when cancelling an FTP download using QNetworkReply::close() Task-number: QTBUG-22820 Change-Id: Ib97fda9769b2b55a08c042c66c4444cb6216d2b1 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Remove needless line "#define d d_ptr"Kent Hansen2012-02-151-2/+0
| | | | | | | | | | | | | | | | | | | There was a time when qsslsocket.h declared its private slots as Q_PRIVATE_SLOT(d, void _q_connectedSlot()) But now they are correctly declared as Q_PRIVATE_SLOT(d_func(), void _q_connectedSlot()) so the "#define d d_ptr" hack isn't needed. Specifically, the define would break moc-generated code that refers to the member d of a structure (which a future moc revision does, namely QByteArrayData::d). Change-Id: Ic94fa4d523fb17e8088973cfc0d090d5cce97267 Reviewed-by: Jonas Gastal <jgastal@profusion.mobi> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Include winsock2.h for ntohl.Andreas Holzammer2012-02-101-0/+1
| | | | | | | | | | This fixes the compilation for Windows CE. Include Windock2.h before Windows.h. Change-Id: Iae1ab98239bb75b59c78460e0c0e48dfa1326032 Reviewed-by: Jonas Gastal <jgastal@profusion.mobi> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com> Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
* Add socketOptions flags to QLocalServerAndrew Stanley-Jones2012-02-104-3/+145
| | | | | | | | | | QLocalServer had no way to set socket options that more complicated servers require. The first set of options allow setting of access control on the sockets. Change-Id: If4268c66462fc2e6cf1e70b1d5f56c76d2c69228 Reviewed-by: Harald Fernengel <harald.fernengel@nokia.com>
* MinGW: Fix warnings.Friedemann Kleint2012-02-042-1/+3
| | | | | | | | - Special #define to access HB seems no longer necessary (it was causing about mismatching DLL import attributes). Change-Id: I57cc7d57b12a67c1d549b053db81e1f198f87786 Reviewed-by: Joerg Bornemann <joerg.bornemann@nokia.com>
* Fix unintended source compatiblity break in QSslSocketShane Kearns2012-02-021-0/+1
| | | | | | | | | | | QSslSocket overrides one version of QAbstractSocket::connectToHost. Since these functions were made virtual, this now hides the other overloads. Added a using statement to make the other overloads visible. Change-Id: Ia48fdc9bd67936c75c25bb24dabd26a723bb7a05 Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Call start() even when bearer is not compiled.Xizhi Zhu2012-02-021-7/+5
| | | | | | | Otherwise, the HTTP request won't be sent if bearer is not compiled. Change-Id: I9a8171fde6fe5b2db0405b4af6e1d52ac4528502 Reviewed-by: Shane Kearns <ext-shane.2.kearns@nokia.com>
* Remove one un-used variant.Xizhi Zhu2012-02-021-1/+0
| | | | | Change-Id: I325451f2f346cc75f23703118b451b9c7398baea Reviewed-by: Shane Kearns <ext-shane.2.kearns@nokia.com>
* Don't include config.tests/unix/openssl/openssl.priBradley T. Hughes2012-02-021-4/+0
| | | | | | | This file was removed in commit ba9302b8a9b6b50f37987261c1ade9af2ade2d3c Change-Id: Ib3a70877f6f6848c8cf072faf13da93abbe186f2 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Use QBasicMutex instead of Q_GLOBAL_STATIC QMutexOlivier Goffart2012-02-013-14/+7
| | | | | | | | | | | | | | QBasicMutex is a POD and can be used as a static global object. in qpicture.cpp factoryLoader is used only once, and under the mutex, so there is no need for Q_GLOBAL_STATIC for it, it can be a function static in qhostinfo_unix.cpp the code seemed wrong while compiled with namespace and QT_NO_GETADDRINFO. I also could get rid of one include because it was included earlier. Change-Id: I3c700203c3e067266c20733f4bda8031446dbb86 Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
* Prevent data loss when an ssl socket is closed by remoteShane Kearns2012-02-012-12/+22
| | | | | | | | | | | | SSL context was destroyed on disconnect. This makes it impossible to decrypt buffered encrypted data. So if there is encrypted data in the receive buffers, then don't destroy the ssl context until the socket is destroyed. Task-Number: QTBUG-23607 Change-Id: I16a7b4fa006647ec73049c90cdbc72686696850f Reviewed-by: Jonas Gastal <jgastal@profusion.mobi> Reviewed-by: Richard J. Moore <rich@kde.org>
* Fix QDnslookup build on FreeBSDJeremy Lainé2012-02-011-3/+1
| | | | | | | | | Unify the includes for resolver function on unix-like platforms to avoid build failures on BSD platforms. Change-Id: I9accd7077d5a319a2c93642e011492d0fc779394 Reviewed-by: Holger Freyther <holger+qt@freyther.de> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Windows: Fix inclusion of <windows.h>Friedemann Kleint2012-02-013-3/+3
| | | | | | | | | | | | | - Always use <qt_windows.h> as the last file to be included. - Remove it from some headers, use Qt::HANDLE instead of HANDLE. - Clean up #ifdef, use Q_OS_WIN for Windows/Windows CE. - Add NOMINMAX to qt_windows.h to avoid problems with the min/max macros. - Remove <windows.h> from qplatformdefs.h (VS2005) Change-Id: Ic44e2cb3eafce38e1ad645c3bf85745439398e50 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Joerg Bornemann <joerg.bornemann@nokia.com>
* Revert "Put the generated <module>version.h into build tree"Bradley T. Hughes2012-02-011-1/+1
| | | | | | | | | After discussion with Liang, I'm reverting it as he requested. This change put every header into the SYNCQT.HEADER_FILES twice for in-source builds, and the qtMODULEversion.h header did not include a path component. This reverts commit 2fbc45b58bba860abf67fb28aa1319c9f4ededaf Change-Id: Ie84cef19193ce5e49072f1f67a41140d9d2673b8 Reviewed-by: Liang Qi <liang.qi@nokia.com>
* Emit QSslSocket::error in case of openssl gives an error.Jonas M. Gastal2012-02-013-25/+38
| | | | | | | | | | | Create new QAbstractSocket::SocketError value that denotes a error in the SSL library: SslInternalError Create QAbstractSocket::SocketError value that denotes a error in data provided by user cauding an SSL library error: SslInvalidUserDataError Change-Id: I466a9389d9d7052efd8eddd1a2d6067ba26dfddb Reviewed-by: Richard J. Moore <rich@kde.org> Reviewed-by: Shane Kearns <ext-shane.2.kearns@nokia.com>
* Removing bad ###Qt5 note.Jonas M. Gastal2012-01-311-1/+0
| | | | | | | | | Implementating this would cause massive SC breakage and give little gain. Change-Id: I56a6d302fdd0e8b53d1f9154f3eaf9e1ee429f9d Reviewed-by: Giuseppe D'Angelo <dangelog@gmail.com> Reviewed-by: Richard J. Moore <rich@kde.org>
* QDateTime: Deprecate setYMD()John Layt2012-01-311-1/+1
| | | | | | Change-Id: I077332df554fb750666d51486c97724411276679 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
* Fix debug format string in windows socket engineShane Kearns2012-01-301-2/+2
| | | | | | | %l has no meaning, should be %li according to the arguments. Change-Id: Ife9ec524109e021ad723865445e80b6bad51a5c6 Reviewed-by: Richard J. Moore <rich@kde.org>
* Fix crashing debug messageShane Kearns2012-01-301-1/+1
| | | | | | | | The debug message could derefence a null pointer, this crashed when running ssl autotests Change-Id: I176aaa9f3cf3c6cc1512cdc34db06d4c79f92e73 Reviewed-by: Richard J. Moore <rich@kde.org>
* Make the pause modes a QFlags.Richard Moore2012-01-304-8/+10
| | | | | | | | | | | The intention is to add additional pause modes over time, this will be easier if we can just test if a particular reason for pausing is turned on. If we don't do this we'll end up having to check for each enum value every time we check what is enabled. Change-Id: I6b08f0e819b5593e3f6463c3dd175eff8625e155 Reviewed-by: Frederik Gladhorn <frederik.gladhorn@nokia.com> Reviewed-by: Shane Kearns <ext-shane.2.kearns@nokia.com>
* Add support for DNS lookups using native APIsJeremy Lainé2012-01-306-3/+1943
| | | | | | | | | | | | | | | | The QDnsLookup class provides asynchronous APIs for performing DNS lookups. For now, the following lookups are supported: - A and AAAA - CNAME as defined per RFC 1035 - MX as defined per RFC 1035 - NS as defined per RFC 1035 - PTR as defined per RFC 1035 - SRV as defined per RFC 2782 - TXT as defined per RFC 1035 Task-number: QTBUG-10481 Change-Id: I46c1741ec23615863eeca3a1231d5e3f8942495e Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Remove "All rights reserved" line from license headers.Jason McDonald2012-01-30160-160/+160
| | | | | | | | | | As in the past, to avoid rewriting various autotests that contain line-number information, an extra blank line has been inserted at the end of the license text to ensure that this commit does not change the total number of lines in the license header. Change-Id: I311e001373776812699d6efc045b5f742890c689 Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
* Put the generated <module>version.h into build treeLiang Qi2012-01-281-1/+1
| | | | | | | | | It was put in source tree before. Task-number: QTBUG-20439 Change-Id: Ib52d9c2e83ae375aad259ddc74138bbc728b3ed0 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Making socketOption/setSocketOption virtual on QSslSocket.Jonas M. Gastal2012-01-281-3/+2
| | | | | | | | Per ### Qt5 comment and the fact that it was already virtual on QAbstractSocket. Change-Id: If2d2b2f9cdec1ef4c5bf625e3ce0d6f2d9a7bdfd Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Gives QNetworkCookieJar a virtual API.Jonas M. Gastal2012-01-274-63/+128
| | | | | | | | | | | | | | | | | QNetworkCookieJar now has the following virtual methods: virtual bool validateCookie(QNetworkCookie &cookie); virtual bool insertCookie(const QNetworkCookie &cookie, const QUrl &url); virtual bool updateCookie(const QNetworkCookie &cookie); virtual void deleteCookie(const QNetworkCookie &cookie); Their implementation is such that the behavior the class previously had(in memory storage of the cookies) is mantained. Task-number: QTBUG-23145 Change-Id: I1420894d31e8072eca6903c3c7ffd6f06205a257 Reviewed-by: Peter Hartmann <peter.hartmann@nokia.com> Reviewed-by: Alexis Menard <alexis.menard@openbossa.org> Reviewed-by: Lars Knoll <lars.knoll@nokia.com> Reviewed-by: Shane Kearns <ext-shane.2.kearns@nokia.com>
* Style fix for QSslCertificate constructor.Jonas M. Gastal2012-01-271-2/+1
| | | | | Change-Id: I1f128eb9f99ef4d25590bd034762cb8a0e68b075 Reviewed-by: Richard J. Moore <rich@kde.org>
* Removing ### that would cause needless SC brekage.Jonas M. Gastal2012-01-271-1/+1
| | | | | Change-Id: Iaa9cfd709c0ca4192760117ba5ec6d3992804d6a Reviewed-by: Richard J. Moore <rich@kde.org>
* QAbstractSocket / QSslSocket: add API to pause and resumePeter Hartmann2012-01-258-32/+184
| | | | | | | | | | | | | | | pause and resume is currently only supported upon emitting the QSslSocket::sslErrors() signal. The API was added in QAbstractSocket to also support QAbstractSocket::proxyAuthenticationRequired() in the future. This is the first patch to support that feature on the socket level, another patch will follow to support sslErrors() and authenticationRequired() in QNetworkAccessManager / QNetworkReply. Task-number: QTBUG-19032 Change-Id: Ide2918268590ab9a01454ab26cb7fdca3dc840ab Reviewed-by: Shane Kearns <ext-shane.2.kearns@nokia.com>
* bearer: run the bearer engines in their own worker threadShane Kearns2012-01-253-18/+30
| | | | | | | | | | | | | | | | | | | | | | | | The original architecture of the QtNetwork bearer support hosted the engines in the application's main thread, but this causes some problems. If the QNetworkConfigurationManager is constructed in a worker thread, then it is populated asynchronously without any notification when it is done (the app gets incomplete or missing results) Fixing that by restoring the earlier behaviour of using blocking queued connections to wait for the lists to be populated caused a regression, as some applications deadlock because the main thread is waiting on the worker thread at this time. By introducing a dedicated worker thread for the bearer engines, QNetworkConfigurationManager can be safely constructed in any thread while using blocking queued connections internally. Task-number: QTBUG-18795 Change-Id: Iaa1706d44b02b42057c100b0b399364175af2ddb Reviewed-by: mread (cherry picked from commit 5f879c55e531165cc2569b03c3796d0f33d0a0b7) Reviewed-by: Jonas Gastal <jgastal@profusion.mobi> Reviewed-by: Murray Read <ext-murray.2.read@nokia.com> Reviewed-by: Alex <alex.blasche@nokia.com>
* Remove use of QT_MODULE from libraryGunnar Sletta2012-01-2533-33/+0
| | | | | | | | | | These defines were there to aid in the commercial licensing scheme we used long ago, and are no longer needed. Keep a QT_MODULE(x) define so other modules continue compiling. Change-Id: I8fd76cd5270df8f14aee746b6cf32ebf7c23fec7 Reviewed-by: Lars Knoll <lars.knoll@nokia.com>