summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib
Commit message (Collapse)AuthorAgeFilesLines
* tst_qfile: remove QSKIP's -> omit whole test cases insteadSergey Hambardzumyan2012-10-151-32/+14
| | | | | | Change-Id: Ibc01790992e839e3afde4b52682cb155c7f3f5f8 Reviewed-by: J-P Nurmi <jpnurmi@digia.com> Reviewed-by: Caroline Chao <caroline.chao@digia.com>
* Re-revert "Delay creation of the process manager"Thiago Macieira2012-10-153-0/+90
| | | | | | | | | | | | | | | This reverts commit daba2c507ad42c66dafa6a29cffa94e9641e0c58, re-applying commit d9c06bf25210b3d0b31ee6126e57bcb82c292da1, because the change was accidentally brought back in commit eae8fb85997d82ecec0743ba3e470681129bff41. There's a potential deadlock when a QProcess is created while a QCoreApplication is instantiated but never executed, or if the main thread waits() for the child thread. Task-number: QTBUG-27260 Change-Id: I9e0fdc0341b3063de90979377bac35f2a827b260 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
* Auto tests: revise cursor dependant testsJ-P Nurmi2012-10-131-9/+17
| | | | | | | | | | | | | | | | | | Cursor dependant auto tests are currently skipped in various ways. Some are checking PlatformQuirks::haveMouseCursor() that tries to detect if the desktop environment is MeeGo, using obsolete Q_WS_X11. Some are skipped if QT_NO_CURSOR or Q_OS_WINCE is defined and some are actually missing the approriate guards. => unify by defining QTEST_NO_CURSOR in qtest-config.h when appropriate ie. for platforms that have no regular mouse cursor support or when QT_NO_CURSOR is defined. Task-number: QTBUG-22551 Change-Id: I9a1e0e3156617945ae46226c79268955454c8a9a Reviewed-by: Laszlo Papp <lpapp@kde.org> Reviewed-by: Marc Mutz <marc.mutz@kdab.com> Reviewed-by: Caroline Chao <caroline.chao@digia.com>
* QTextBoundaryFinder: Fix handling of break opportunitiesKonstantin Ritt2012-10-121-191/+219
| | | | | | | | | | | | | | | | | Add BoundaryReason::BreakOpportunity flag that will be returned by the boundaryReasons() when the boundary finder is at the break opportunity position that might be not an item boundary. This is the same as (StartWord || EndWord) in Grapheme and Sentence modes; in Word and Line modes, BreakOpportunity flag might occur between the words or in between of Line boundaries (e.g. in conjunction with SoftHyphen flag). In other words, the text boundaries are always break opportunities, but not vice versa. StartWord and EndWord flags has been deprecated by new StartOfItem and EndOfItem flags which are not about the word boundaries only. In line breaking, StartOfItem and EndOfItem are set for the mandatory breaks only. Change-Id: I79bf297e2b988f5976f30cff0c8ca616385f6552 Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
* QTextBoundaryFinder: Introduce BoundaryReason::MandatoryBreak flagKonstantin Ritt2012-10-101-0/+37
| | | | | | | | | | that will be returned by boundaryReasons() when the boundary finder is at the line end position (CR, LF, NewLine Function, End of Text, etc.). The MandatoryBreak flag, if set, means the text should be wrapped at a given position. Change-Id: I32d4f570935d2e015bfc5f18915396a15f009fde Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com> Reviewed-by: Lars Knoll <lars.knoll@digia.com>
* Change QDateTime::addSecs() and QDateTime::secsTo() to use qint64.Jon Severinsson2012-10-101-2/+2
| | | | | | | | | | addMSecs() / msecsTo() have always used qint64, and when QDate was changed to use a 64-bit julian day, QDateTime::addDays() and QDateTime::daysTo() was changed to use qint64 in order to support the full extended range, but addSecs() and secsTo() seems to have been forgotten. Change-Id: I3acc35ee2bcc9f353650eb42f97d428f706b2db6 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Update the Unicode Data and Algorithms up to Unicode 6.2Konstantin Ritt2012-10-096-325/+829
| | | | | | | | | | | | | Version 6.2 of the Unicode Standard is a special release dedicated to the early publication of the newly encoded Turkish lira sign. In addition, there are some significant changes to the Unicode algorithms for text segmentation and line breaking to improve breaking for emoji symbols. For more details, see http://www.unicode.org/versions/Unicode6.2.0/ Change-Id: I21cfd4f307e41b41a19d36cce87f7a44c2661bc2 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Lars Knoll <lars.knoll@digia.com>
* Removed the "tst_QVector::outOfMemory" test.Christian Strømme2012-10-081-148/+0
| | | | | | | | | | | The test is useless as we assert if the requested size exceeds a certain limit. We could, as an alternative, throw an exception, but in the end it's the caller's responsibility to ensure that the requested size is a sane value. Task-number: QTBUG-27285 Change-Id: I738950a6a2b51671a54e4d25c7e4c3ac0d7f63b8 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Fix Windows: QStandardPath::findExecutable() to check suffixes.Friedemann Kleint2012-10-081-26/+79
| | | | | | | | | | | | | | | | | | | | | | | | | | Append the Windows executables suffixes from the PATHEXT environment variable. The previous code had a bug since the 'break' statement bailed out of the inner loop only. Factor search code out into a separate functions, avoiding repeated invocations of list.constEnd() and variable assignments in the old code. Add a static function that is called on Unix and on Windows for executable names with a suffix. Call another function applying a candidate list of suffixes in case an executable name without a suffix is passed. Lower case the extensions from PATHEXT, streamline code. Split up the test, add a _data() slot for clarity. Task-number: QTBUG-27457 Change-Id: I2bf34de52aeadddd3b937ad1e22191c3c850fd26 Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
* tst_QLocale: remove QSKIP, wrap Q_OS_MAC/Q_OS_WINSergio Ahumada2012-10-041-5/+8
| | | | | Change-Id: I44755379561b98e43dd19c8c01b40349be203e14 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
* Remove #if 0 usage in QElapsedTimer autotest.Leonard Lee2012-10-041-20/+3
| | | | | | | | | Given QElapsedTimer t1, t2 variable, the t1-t2, t1+1000 (add 1 second) operations not supported. Task-number: QTBUG-22446 Change-Id: Idd87f778c212831aa7f92242452538d113c9cfcf Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Fix for integer overflow in QString::replaceChristian Strømme2012-10-031-2/+0
| | | | | | | Task-number: QTBUG-22967 Change-Id: I604e6a725d46eab4c4369ebb54e8c9ea1350f492 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Fix QTextBoundaryFinder assignment operatorKonstantin Ritt2012-10-031-0/+25
| | | | | | | for the case when the boundary finder is assigned to an invalid one. Change-Id: I5b60984ff3fd99972fcae21895684bd83b012780 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
* Overhaul a little the QUrl error reporting.Thiago Macieira2012-10-021-11/+16
| | | | | | | | | | | | | | | | | | | | | | Keep the original QString that triggered the parsing error, instead of just one QChar. This provides more powerful error messages, like: Invalid IPv6 address; source was "http://[:::]"; scheme = "http", host = "" (QUrl cannot keep invalid hostnames) Invalid port or port number out of range; source was "http://example.com:abc"; scheme = "http", host = "example.com" (QUrl cannot keep a non-numeric port number) Invalid path (character '%' not permitted); source was "foo:/path%?"; scheme = "foo", path = "/path%25%1F" (the tolerant parser runs first, so the faulty component is fixed) This stores the error state in a special structure which is not allocated under normal conditions, keeping the memory consumption down. On 32-bit systems, QUrlPrivate does not increase in size; on 64-bit systems, it grows by 8 bytes. Change-Id: I93d798d43401dfeb9fca7b6eed7ea758da10136b Reviewed-by: David Faure <faure@kde.org>
* Update some error messages in QUrl::errorString()Thiago Macieira2012-10-021-8/+12
| | | | | | | | | Make both invalid hostname messages start with "Invalid hostname". And split the empty port error from the invalid port one. Change-Id: I870d1ed6fb07ec494f553871a37ed167141ffc06 Reviewed-by: David Faure <faure@kde.org> Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* Remove the annoying qWarning when QUrl::setPort is out of rangeThiago Macieira2012-10-021-3/+0
| | | | | | | | | | That's what we have QUrl::errorString() for. This will become evident especially now that QUrl::toString() / toEncoded() return empty if there are errors. Change-Id: I64a84e9c6ee57c0fc38cc0c58f5286ddc1248d1f Reviewed-by: Shane Kearns <shane.kearns@accenture.com> Reviewed-by: David Faure <faure@kde.org>
* Make QUrl::toString() / toEncoded() return empty for invalid URLsThiago Macieira2012-10-021-4/+43
| | | | | Change-Id: I6ebb4ad2901a9bacb09fb81082202f37ebbc2e97 Reviewed-by: David Faure <faure@kde.org>
* Add two compound URL invalidity cases for isValid()Thiago Macieira2012-10-021-14/+32
| | | | | | | | | | | | | | These two errors can only happen if one calls setPath() explicitly. They cannot happen for parsed URLs, which is why they are only caught with isValid(). It's not possible to set the error condition in setPath() either because they depend on the presence / absence of the authority and scheme. Also update all the unit tests that set a path not starting with a slash and were just "freeloaders" on the previous behaviour. Change-Id: Ice58cd4589a850452d7573a5b19667bbab2fb43e Reviewed-by: David Faure <faure@kde.org>
* QProcess.tests: adding test for channel forwardingThomas Hartmann2012-10-024-0/+89
| | | | | | | | | | This tests QProcess::setProcessChannelMode(). The tests verifies if testForwarding really forwards the output of testProcessEcho (spawned by testForwarding). Change-Id: Ifc4164569256aeaeab0edef42116986272362c01 Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
* Rename createLocalFile to createNativeFile & deprecate createLocalFileAndy Shaw2012-10-024-1/+44
| | | | | | | | | | | | | | | | | | As it was confusing to use the term local file when referring to a file that was accessible using native APIs and not just a file that was on a hard disk somewhere already the function name has been changed. By renaming it to createNativeFile we keep it consistant with QFileInfo which has an isNativeFile() function too. Test also added. Task-number: QTBUG-3169 Change-Id: I410e7ed28133d68fd312c6c0faf3f7191460d7ce Reviewed-by: João Abecasis <joao@abecasis.name> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QWinOverlappedIoNotifier test for multiple I/O operations addedJoerg Bornemann2012-10-021-20/+102
| | | | | | | | | | | tst_QWinOverlappedIoNotifier::multipleOperations starts asynchronous read and write operations on the same named pipe handle. The received notifications must contain the right byte count and OVERLAPPED pointer corresponding to the I/O operation. Change-Id: I6f3fa5cf3ca6d62fcb9bc7073d28611fcfa7d98a Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com> Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com>
* QWinOverlappedIoNotifier: multiple I/O operations on the same handleJoerg Bornemann2012-10-021-4/+4
| | | | | | | | | | | | | When doing multiple I/O operations on the same handle, we get notified for every operations. These must be distinguished by comparing the pointer to the OVERLAPPED struct. We now pass the OVERLAPPED pointer via the notified signal and let the receiver decide if it wants to handle this notification. Change-Id: I4efe70f39c6ae5282b949f2f4b21f6e7dd3df785 Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
* Make documentation of QVariant::isNull more explicit.Jędrzej Nowacki2012-09-291-2/+1
| | | | | | Task-number: QTBUG-22933 Change-Id: I1d8d3fc778ba00bcad11caaaf8af7d87186f18e8 Reviewed-by: Jerome Pasion <jerome.pasion@digia.com>
* QFlags: use unsigned int when the enum's underlying is unsignedMarc Mutz2012-09-281-2/+16
| | | | | | | | | | | Replace storage and operator int() return types with unsigned int if the enum is unsigned. This fixes a number of exisiting warnings, in particular with Qt::MouseButton under GCC. Change-Id: Ia12d36212329aec3e9d62a5fbd38809a6c2b36d0 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Move QFutureSynchronizer back to QtCoreMarc Mutz2012-09-283-0/+164
| | | | | | | This class, too, belongs with QFuture. Change-Id: I41a532ca66c156f1631e4b22ffc1a5879c854488 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Move QFutureWatcher back to QtCoreMarc Mutz2012-09-284-0/+949
| | | | | | | | This belongs with QFuture. Change-Id: I555cd01c1d3890fbbaca4fd8a9170292ea4eb0fb Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Move QFuture from QtConcurrent to QtCoreMarc Mutz2012-09-284-0/+1444
| | | | | | | | | This class belongs to QThreadPool/QRunnable more than to QtConcurrent, so move to QtCore, where QThreadPool awaits it. Change-Id: Ibf20288a986593bf779453427c2dae8db1e1423a Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Move QtConcurrent::ResultStore as QtPrivate::ResultStore to QtCoreMarc Mutz2012-09-283-0/+497
| | | | | | | | | | No compatibility header needed. While this wasn't marked as private API, it wasn't documented, either. This is a prerequisite for moving QFuture to QtCore. Change-Id: I8e986e6e2a22fbe5cf08d0600ec39ae9ae993e20 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Update the NaN tests to deal with non-conformance betterThiago Macieira2012-09-281-15/+16
| | | | | | | | | | | | ICC apparently optimises 0 * anything directly to zero, even when it should be doing a multiplication to conform to IEEE requirements. GCC in fast-math mode does the same, but that also makes the rest of the function unreliable, so we try to turn off fast-math mode if we can. Task-number: QTBUG-22340 Change-Id: I0e3c5f4927b0a6bcb3189bb156c18843fc4b29b9 Reviewed-by: Caroline Chao <caroline.chao@digia.com>
* Test: Split tst_QVarLengthArray::oldTestsCaroline Chao2012-09-271-46/+48
| | | | | | | | | | | | | | | The entire test is currently skipped while only the last part is causing problems. Move the out of memory test code to its own test function and skip only this function with the appropriate bug number. By allocating too much memory this test is causing a crash. Task-number: QTBUG-27361 Task-number: QTBUG-22342 Change-Id: Ia308099b7f12cf2c567b62063a7bbcc6fb38515b Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
* remove no-op test from tst_qfileJoerg Bornemann2012-09-271-23/+0
| | | | | | | | | | According to the repo history the tailFile was introduced with the S60 port but the functionality it's testing was never implemented. Task-number: QTBUG-22341 Change-Id: I16e8e43bbd799f05f8b136925cb0add0b918289e Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
* Test: tst_QFile::writeLargeDataBlock() unstable failure as XFAILCaroline Chao2012-09-261-2/+10
| | | | | | | | | | | | While the large data block can be written to a file, the test is also showing instability while reading back the written block. Adding another expected failure to address this instability. Task-number: QTBUG-26906 Change-Id: I9704d441cf2bd6d7ef0f9023240ea61bb89561b6 Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
* Fix qstringlist autotest build for WinCE.Janne Anttila2012-09-261-0/+13
| | | | | | | | | | WinCE does not have setlocale, used SetUserDefaultLCID correspondingly as it is done in qstring autotest for WEC7. Change-Id: I7866bf0f365c7c6efbf3b439cdd9a281c6a1b2e0 Reviewed-by: Kevin Funk <kevin.funk@kdab.com> Reviewed-by: Andreas Holzammer <andreas.holzammer@kdab.com> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
* Remove duplicate words and punctuation from documentation.Mitch Curtis2012-09-261-1/+1
| | | | | Change-Id: I5550c62d412510bc2c5acceb2cae7d2f2ef6a8d3 Reviewed-by: Jerome Pasion <jerome.pasion@digia.com>
* QCharAttributes: add wordStart/wordEnd flagsKonstantin Ritt2012-09-261-1/+63
| | | | | | | | | | | | | | | A simple heuristic is used to detect the word beginning and ending by looking at the word break property value of surrounding characters. This behaves better than the white-spaces based implementation used before and makes it possible to tailor the default algorithm for complex scripts. BIG FAT WARNING: The QCharAttributes buffer now has to have a length of string length + 1 for the flags at end of text. Task-Id: QTBUG-6498 Change-Id: I5589b191ffde6a50d2af0c14a00430d3852c67b4 Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
* Test: tst_QFile::writeLargeDataBlock() unstable failure as XFAILCaroline Chao2012-09-251-1/+1
| | | | | | | | | | The current check is not enough to catch the unstable failure. Update the test to catch the failure in all cases. Task-number: QTBUG-26906 Change-Id: I2e37a1f6513df768cd410df7c91a9fd843150e57 Reviewed-by: Sergio Ahumada <sergio.ahumada@digia.com>
* Fix default-constructed QFileSystemEntryJoão Abecasis2012-09-251-0/+41
| | | | | | | | | | | | | | Member variables for lastSeparator, first and lastDotInFileName are now initialized to -1 (non-existing), where the previous value of zero would mean a separator/dot at that position and resulted in path() returning '/', instead of '.'. Tests were expanded for better coverage of empty state and default-constructed instances. Change-Id: Ie27547886b52224d38b5be0b4f920c9927fd440f Reviewed-by: Andy Shaw <andy.shaw@digia.com> Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* Test: Enabled tst_QFile::invalidFileCaroline Chao2012-09-241-2/+1
| | | | | | | | | | | | The test is not hanging on Windows anymore. On Windows, add an expected failure for the failing case. Task-number: QTBUG-22801 Task-number: QTBUG-27306 Change-Id: Iede95766504f3e8a278a4554a5967ca333aae3bf Reviewed-by: Sergio Ahumada <sergio.ahumada@digia.com>
* Add some tests for compatible and incompatible custom deletersThiago Macieira2012-09-241-0/+20
| | | | | Change-Id: I2bb7f597aab0f00a250881602e6a6bb7bfe42e18 Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
* Fix potential breakage in QString.Jędrzej Nowacki2012-09-241-3/+7
| | | | | | | Negation operator ("!") have precedence over bitwise and ("&"). Change-Id: I39e2d99da6eaa4477bbe35a1259f745e05c9841a Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Use QStringList::join(QChar) overload where applicable [QtCore]Marc Mutz2012-09-232-2/+2
| | | | | | | | | | This is an automated change performing the following replacements: join\("(.)"\) -> join('\1') join\(QLatin1String\("(.)"\)\) -> join(QLatin1Char('\1')) join\(QStringLiteral\("(.)"\)\) -> join(QLatin1Char('\1')) Change-Id: I81c378ef6aeeada5e116f1394cc9fc67f901ffd6 Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
* QModelIndex: clean up integer size confusion in the APIMarc Mutz2012-09-221-1/+1
| | | | | | | | | | | | | | | | | | | | | | QAIM::createIndex() took either int or quint32, but QMI::internalId() returned qint64. In the new interface, createIndex() takes, and internalId() provides, integers of type quintptr. This matches the storage size of the void* in the model index and avoids truncation. Remove the createIndex(int, int, quint32) and \obsolete createIndex(int,int,int) overloads. This makes a literal 0 in the third parameter ambiguous now. The solutions have been noted in changes-5.0.0. Change-Id: I0a0ecd8430eaf695129a4d09d14d4e30745485c4 Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
* Change copyrights from Nokia to DigiaIikka Eklund2012-09-22215-5202/+5202
| | | | | | | | Change copyrights and license headers from Nokia to Digia Change-Id: If1cc974286d29fd01ec6c19dd4719a67f4c3f00e Reviewed-by: Lars Knoll <lars.knoll@digia.com> Reviewed-by: Sergio Ahumada <sergio.ahumada@digia.com>
* Test: Update QSKIP message of tst_QVector::outOfMemoryCaroline Chao2012-09-221-1/+1
| | | | | | | | | | | This test is crashing. Specify the bug report number in the QSKIP message. Task-number: QTBUG-22343 Task-number: QTBUG-27285 Change-Id: I4d4ead4f54944a545103a3d01c5c9d302d7fb1df Reviewed-by: Sergio Ahumada <sergio.ahumada@digia.com>
* Test: fix warning for tst_QPluginLoader::loadGarbageCaroline Chao2012-09-221-3/+5
| | | | | | | Garbage libs (under elftest) are numbered from 1 to 5 and not from 0 to 4. Change-Id: Ia0162372bf5cd1fb53a0442543c5a65716880611 Reviewed-by: Sergio Ahumada <sergio.ahumada@digia.com>
* remove mentions of borland from project filesOswald Buddenhagen2012-09-195-5/+2
| | | | | Change-Id: I3049b24ae287bee50aca1de06664a2309df69edf Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
* Blackberry: fix tst_QFileInfo::fileTimes()Rafael Roquetto2012-09-141-1/+5
| | | | | | | | | | | The Blackberry OS uses a filesystem with the noatime option, which returns a "wrong" access time. Change-Id: I04cdb899699e819a36e0917e30d750067b33388d Reviewed-by: Tobias Koenig Reviewed-by: Thomas McGuire <thomas.mcguire@kdab.com> Reviewed-by: Peter Hartmann <phartmann@rim.com> Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
* Autotests: Use qInstallMessageHandlerKai Koehne2012-09-141-2/+1
| | | | | | | | qInstallMsgHandler got deprecated in Qt 5. Change-Id: Ib36983e66b3a8090b99f14e3fd4e210602a3f018 Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* tests: Don't omit the body of a test function with QT_BUILD_INTERNALSergio Ahumada2012-09-146-52/+76
| | | | | | | | | | Changing it outside of the test function definition to avoid running empty/inapplicable test functions. Change-Id: I713560cde7f715696984ed082d682900f5f1bcdd Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Caroline Chao <caroline.chao@nokia.com>
* Use QElapsedTimer instead of QTime to measure elapsed timeThiago Macieira2012-09-131-1/+1
| | | | | | | | | QElaspedTimer is a lot more efficient. Change-Id: I66d9514108f800a45181d8960b01a5e7d3fa9e80 Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org> Reviewed-by: Olivier Goffart <ogoffart@woboq.com> Reviewed-by: Lars Knoll <lars.knoll@nokia.com>