summaryrefslogtreecommitdiffstats
path: root/src/network
Commit message (Collapse)AuthorAgeFilesLines
* Fix tst_QNetworkReply::httpWithNoCredentialUsage autotestShane Kearns2012-03-063-7/+10
| | | | | | | | | | | | The test was testing the wrong thing, and passing even though QNetworkRequest::AuthenticationReuseAttribute was not being respected, until recently when I fixed username/password in URLs Now the cache is properly bypassed when this attribute is set to manual, and the autotest is updated to check this. Change-Id: I87943515562d0b16b03504f0758ba265758d1c22 Reviewed-by: Martin Petersson <Martin.Petersson@nokia.com>
* Windows - fix QWindowsSystemProxy global static raceShane Kearns2012-03-061-1/+1
| | | | | | | | Loser of the race would try to delete an uninitialised pointer Task-number: QTBUG-15765 Change-Id: Ie184ee2306e102aa8fbad752ef09b95c3ede00c2 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QSslCertificate - make lazy initialisation thread safeShane Kearns2012-03-061-0/+9
| | | | | | | | | | | | | | | | | | | QSslCertificate can be copied around into multiple threads, without detaching. For example, the https worker threads inside QNetworkAccessManager. There are const methods, which lazily initialise members of the private class without detaching (i.e. caching results of expensive function calls) These functions now lock the d pointer using QMutexPool to avoid concurrency related crashes. autotest crashes 20% of the time in release builds without the fix, passes 100 times in a row with the fix. Task-number: QTBUG-20452 Change-Id: I64a01af8159216f2dd6215a08669890f6c029ca8 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Richard J. Moore <rich@kde.org>
* QNam: only init channels when needed.Martin Petersson2012-03-063-46/+138
| | | | | | | | | | Each channel will create a socket that will allocate memory for the read and write buffers. QNam generaly inits 6 sockets for each connection. That means that by default 12 such buffers are created. This will instead initialize channels when they are needed. Change-Id: Ie3f2cf789e084fd3d17d3b2a9bb3d3a4370b3da4 Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* Change bugreports.qt.nokia.com -> bugreports.qt-project.orgSergio Ahumada2012-03-022-3/+3
| | | | | Change-Id: Ia795098f24cf358b15067f54cd08dff0bd792bc5 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Remove the usage of deprecated qdoc macros.Casper van Donderen2012-03-0212-149/+149
| | | | | | | | | | | QDoc now has support for Doxygen style commands for italics, bold and list items. This change applies that change in QDoc to the actual documentation. Task-number: QTBUG-24578 Change-Id: I519bf9c29b14092e3ab6067612f42bf749eeedf5 Reviewed-by: Shane Kearns <shane.kearns@accenture.com> Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
* Name threads properlymae2012-03-022-0/+4
| | | | | | | | When there is no QObject subclass with Q_OBJECT macro, we must at least set an object name Change-Id: Ib429a9b246d9d6b4b4cfb11593e4f358850677f2 Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
* Use QSystemError for QDnsLookup windows backendShane Kearns2012-03-011-1/+2
| | | | | | | | | | | The OS provides the error string in this case. This gives more information to the developer seeing a generic error. Change-Id: Ia03642982f3513ee5a8a9fa98d918e948f8d97a5 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Richard J. Moore <rich@kde.org>
* Fix buffer overrun crash running MSVC2010 win32 Qt on win64Shane Kearns2012-03-012-32/+4
| | | | | | | | | | | | | | | | | | | | When loading dnsapi.dll as a plugin, we experience crashes because the calling convention is not specified. The default is _cdecl, but __stdcall (via the WINAPI macro) should be used for windows APIs. Mismatched calling convention results in corruption of local variables, probably because the stack pointer is incorrect and SP offsets are used in optimised builds rather than frame pointer offsets. Since the library has been available since Windows 2000, I don't think that we need to load it dynamically. (Unlike the unix version where it isn't part of the LSB) Also checked that the current release of mingw works. Task-number: QTBUG-24227 Change-Id: I37c0a6aa0c133799c2a6dd9391ca1435ba2539ea Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
* Windows - fix getsockopt calls for narrower than int optionsShane Kearns2012-03-011-5/+7
| | | | | | | | | | | | | | | | | | | | | | Windows unhelpfully writes to only one byte of the output buffer when getsockopt is called for a boolean option. Therefore we have to zero initialise the int rather than initialising to -1 as was done before. This in general only works for little endian architecture, because the word would look like 0x01000000 on big endian. So I have added some compile time asserts in the assumption that windows is always little endian. This is ok for comparisons with 0/false, but not comparisons with true or nonzero values. In the case of IPV6_V6ONLY, it is documented as DWORD (unsigned int) but on some windows versions it is returned as a boolean triggering the warning. I removed the warning, as the conversion to int works on both LE and BE since it is only compared with zero. Task-number: QTBUG-23488 Change-Id: I3c586d1ada76465fc045a82661f289920c657a4c Reviewed-by: Richard J. Moore <rich@kde.org> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com> Reviewed-by: Andreas Holzammer <andreas.holzammer@kdab.com>
* 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>