summaryrefslogtreecommitdiffstats
path: root/src/network/socket
Commit message (Collapse)AuthorAgeFilesLines
* Fix network doc links.Frederik Gladhorn2012-09-213-6/+7
| | | | | | | | Change-Id: I319644da80d91c5cf6d247410f022fbfd062a1f3 Reviewed-by: Jerome Pasion <jerome.pasion@digia.com> Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org> Reviewed-by: Martin Smith <martin.smith@digia.com> Reviewed-by: Peter Hartmann <phartmann@rim.com>
* Fix doc errors.Frederik Gladhorn2012-09-211-1/+1
| | | | | | Change-Id: I9974d870c081620217582fcb6f8b146d208a471c Reviewed-by: Peter Hartmann <phartmann@rim.com> Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org>
* Network: Fix mingw-gcc warningKai Koehne2012-09-181-1/+1
| | | | | | | | Fix warning: missing braces around initializer for 'BYTE [6] {aka unsigned char [6]}' Change-Id: Ic247ff0721955c4562ed027fad7cb3786809a840 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* Fix thread-safety of qt_ignore_sigpipeThiago Macieira2012-09-181-1/+5
| | | | | | | | | | | | | The testAndSet operation would mean another thread could see the value of 1 and proceed to write(2)/sendto(2) before SIGPIPE had been ignored. If the pipe or socket were already closed by then, a SIGPIPE would be delivered to the application with its default action: terminate. Change-Id: I62dc8f5fa14c1dd453d13e4053c642bd78fbc468 Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com> Reviewed-by: Shane Kearns <shane.kearns@accenture.com> Reviewed-by: Peter Hartmann <phartmann@rim.com>
* network: Fix missing or improper include guard in headersSergio Ahumada2012-09-154-5/+6
| | | | | | | | | | Use an include guard in headers to ensure the header is not included more than once. Make the header guard match its file name. Also, cpp files should include their own headers first (but below config.h) Change-Id: Iecf5da23c0f8e6d457f67657b88ef7557bde9669 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Remove misleading documentation about QAbstractSocket::bytesWrittenThiago Macieira2012-09-101-4/+3
| | | | | | | | | | | The signal has nothing to do with any action on the remote side. It is emitted when the class has written the bytes to the operating system. More likely than not, the bytes have not been even sent yet, much less read by the other side. Change-Id: Ia04d37ffc8c0788173d3d29f49c5759bcdef6afa Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org> Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* Removing duplicate includesSergio Ahumada2012-09-091-3/+0
| | | | | | | Do not include a header more than once Change-Id: Ia2e5d66e72988ad833cf5177a3f8aa988bf510e9 Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
* QtNetwork: bypass proxy for local connectionsJulien Brianceau2012-09-071-9/+0
| | | | | | | | | | | | According to Qt doc, "Network proxy is not used if the address used in connectToHost(), bind() or listen() is equivalent to QHostAddress::LocalHost or QHostAddress::LocalHostIPv6. This is not the case in current implementation. Change-Id: I6b8a40c1e8bd8aad9504d8f939b87eda6e93337c Reviewed-by: Richard J. Moore <rich@kde.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* Revert "Use true and false in preference to TRUE and FALSE"Sergio Ahumada2012-09-071-6/+6
| | | | | | | | | | | Even though I really think the change was the right thing to do, it seems like Windows people don't like this change because of some Windows Data Types specific rules. This reverts parts of the commit 56d5c909af6473be64a1ae487b45bd444a9a8553. Change-Id: I2c67d9b1bab36fc63937ef386aef56d2a4472a04 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
* Use true and false in preference to TRUE and FALSESergio Ahumada2012-09-051-6/+6
| | | | | | | | The TRUE and FALSE macros are obsolete and should be replaced with true and false (all lower case) respectively. Change-Id: Iee352e8173500683e6319be0abbf5bacf29016e0 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Fix sockets for Windows CEAndreas Holzammer2012-08-141-2/+2
| | | | | | | | | Version numbers for CE are higher then for the desktop, so insert a check for this, as the api is not working as for windows 7 and above. Change-Id: I79baba9183e11c714cffd0bb43327c197043d6e0 Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* QtNetwork: Handle FD_CLOSE on WindowsMartin Petersson2012-08-016-0/+52
| | | | | | | | | | | | | We need to handle FD_CLOSE separately on Windows as this will be sent only once. When we get FD_CLOSE we need to check if there is more data available for reading. It there is this might indicate that there is another FD_READ that we need to handle after the FD_CLOSE. So in this case we will manually create another close event. Task-number: QTBUG-19409 Task-number: QTBUG-25386 Change-Id: Ie19906bc3f64fb6a85a508a5ab12caac5d70ccdb Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* QtNetwork: Better detection of connection failures on WindowsMartin Petersson2012-07-301-21/+41
| | | | | | | | | | | | | | | If the error code from WSAConnect is WSAEWOULDBLOCK, then the operation proceeds but the outcome is not known at that time. We then check SO_ERROR's value to detect errors. But if that call returns 0 this could indicate that the value is still not know. In this case we try one more time to increase the chance of getting the correct value. This fixed the tst_QNetworkReply::getFromUnreachableIp auto test on Windows. Change-Id: I25008aca062b2f823e3d93ebb0ae456d7e4a6ecc Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* QtNetwork: use nullary version of qRegisterMetaType<T>("T")Marc Mutz2012-07-251-0/+3
| | | | | | | | | | | | | | | | | Using the nullary version has the advantage that multiple calls during a program run are much more efficient, since an inlined atomic is used to store the result. It also ensures that Q_DECLARE_METATYPE(T) has been used, whereas qRegisterMetaType<T>("T") will happily register anything. So I've added the macro where it was missing, or moved it to a central place when it existed hidden. In tst_qnetworkreply, this became a bit tricky, because a private header is conditionally included, so moved the Q_DECLARE_METATYPE() into a conditional section, too. Change-Id: I71484523e4277f4697b7d4b2ddc3505375162727 Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
* Replace Q_REGISTER_METATYPE in QAbstractSocket::stateChanged doc.Mitch Curtis2012-07-231-1/+1
| | | | | | | | Should be Q_DECLARE_METATYPE. Task-number: QTBUG-24692 Change-Id: I9c8b8d503fba254661e8f0d72855758d5d03ada1 Reviewed-by: Geir Vattekar <geir.vattekar@nokia.com>
* QtNetwork: normalize signals/slotsMarc Mutz2012-07-181-1/+1
| | | | | | | | | | This is the result of running util/normalize --modify from Qt 4.7 with manual review. Change-Id: I3f89d5138ea9905c42ed581991426e72c90d4069 Reviewed-by: Richard J. Moore <rich@kde.org> Reviewed-by: Marc Mutz <marc.mutz@kdab.com> Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
* Fix some spelling errorsSergio Ahumada2012-07-112-3/+3
| | | | | | Change-Id: I19d3b2e9a5180b13deb828b55195404ef20be295 Reviewed-by: Daniel Teske <daniel.teske@nokia.com> Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
* QNativeSocketEngine: remove compile watning on WindowsMartin Petersson2012-07-031-0/+2
| | | | | | | Remove warning of unused variable. Change-Id: Ia361dcb9081cd47c7018f5e75cdb8eb74f5474d4 Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* SocketEngine Windows: If not dual stack, use IPv4 for AnyIPProtocolMartin Petersson2012-07-031-0/+3
| | | | | | | | | If the Windows version doesn't support dual stack then we should bind to IPv4. So we should change the socketProtocol to QAbstractSocket::IPv4Protocol as well. Change-Id: I7f9d0bdd861f82d720e347d3fa968198de720d1a Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* QAbstractSocket: Enable readNotifier on read from bufferMartin Petersson2012-06-262-0/+10
| | | | | | | | | | | | | | This is needed for the QSslSocket. When we read on that socket we will only read from the QIODevice buffer to get the unencrypted data. So when the readNotifier has been turned off on the plainsocket there is nothing to trigger it to be turned on again. This will add a readData with zero size when we have read everything from the buffer. This is so that we get a call into the socket to check if the readNotifier should be turned on again. Change-Id: I3b63e33de007db823e964480903186eb1b8caac2 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QtNetwork: remove double buffering on socketsMartin Petersson2012-06-264-121/+41
| | | | | | | | | Removes the readBuffer from the QAbstractSocket since data is already buffered in the QIODevice. Change-Id: I4e50b791fd2852455e526fa2c07089d4d3f0b2a4 Reviewed-by: Prasanth Ullattil <prasanth.ullattil@nokia.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Fix non inheritable socket creation on old windows versionsShane Kearns2012-06-221-16/+21
| | | | | | | | | | | | | | | | | | The documentation is misleading, as using the new API actually causes WSASocket to fail. New behaviour: On windows vista or earlier: skip the new API, use old one On windows 7: try the new API first, if it fails try the old one On windows 8: try the new API only The windows 7 behaviour is because we don't know if the service pack has been installed or not. (And IT departments may have specifically installed/blocked the hotfix) Task-number: QTBUG-26224 Change-Id: I6da47959919caee0cd2697f1ae1fca46aa33c1ff Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Mikhail Vorozhtsov
* Handle fragmented responses on SOCKS5 control channelShane Kearns2012-06-212-15/+27
| | | | | | | | | | | | Server responses may arrive in more than one packet, though this is rare due to nagle algorithm. Also fixed IPv6 addresses being discarded from server responses, which was caught by the new autotest. Task-number: QTBUG-18564 Change-Id: I32d9e2978037fb3e1fff27b7e618b5da6d222f28 Reviewed-by: Martin Petersson <Martin.Petersson@nokia.com>
* Fix double error setting, which overrode correct value.Jonas M. Gastal2012-06-151-1/+0
| | | | | Change-Id: I3bc992b8b41f305a01b80bca16346e18ac4d7833 Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* Partial fix for WebKit compilation on WindowsSimon Hausmann2012-06-131-0/+3
| | | | | | | | | | | | | | | | | | | | | | qdatetime.h uses std::min/max and on Windows windows.h (or some subsequent header file) may under certain circumstances define min/max as macros. The easiest way to prevent the windows header files from doing that is to define NOMINMAX in the place right before windows.h is included. The other way is to define min and max to min/max themselves to prevent windows.h from doing its evil thing. If a user of Qt (WebKit in this case) chooses the approach of defining min/max to themselves and then includes qdatetime.h, then a subsequent inclusion of windows.h doesn't work because qdatetime.h undefines min/max. We should not enforce the type of workaround needed, therefore this patch removes the workaround from qdatetime.h and requires user code that happens to include windows header files before qdatetime.h (seldom case) to choose either workaround. Change-Id: I7347eec7369491a065e894cff557004e069453d5 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Fix compile warnings with MSVCShane Kearns2012-05-231-2/+1
| | | | | | | | | | Calling a static function non statically causes an unused variable warning for the optimised away d pointer. sscanf causes an insecure functions warning. (Even though it was used safely in this case) Change-Id: I07700e2155284ef3ebbe7d604ed59b2e61ee7f95 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
* Fallback to IPv4 when IPv6 is not present.Jonas M. Gastal2012-05-214-5/+23
| | | | | | | In tests when IPv6 is not present QSKIP IPv6 tests. Task-number: QTBUG-23660 Change-Id: I02abc7322d765a93cbf661e53c76257f03dca73e Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* Make the windows socket handle non inheritableShane Kearns2012-05-181-1/+23
| | | | | | | | | | | | This is for behaviour consistency with Qt on unix, as well as the socket close issues described in the task. Task-number: QTBUG-4465 Change-Id: Ida95650d8a9bd7b5bc3d3926d22e20a6d7eeb30b Reviewed-by: Robin Burchell <robin+qt@viroteck.net> Reviewed-by: Joerg Bornemann <joerg.bornemann@nokia.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* Remove capitalization when specifying include-libraries.kb2012-05-142-4/+4
| | | | | | | | | | | | | MinGW installations on case-sensitive filesystems expect lowercase names of include-libraries and (usually) include files. When crosscompiling on Debian 6 (targeting MS Windows) linking fails because mingw is looking for non-existent include-libraries. Using lowercase names solves this. Change-Id: Id3454f4ed8ba42b6ea93d65d9c0ce567db6712df Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
* Fix sending UDP packets to link local addressesShane Kearns2012-05-112-20/+27
| | | | | | | | | | | | When the scope ID is not set, Mac and Windows will not transmit packets to link local addresses. This patch implements setting the scope in the native socket engines and adds a test case. (it was partially implemented already, though UDP specific code paths were missed in the unix engine) Task-number: QTBUG-25634 Change-Id: I23300bdc9856e38458078e913daaa59cd05a74b5 Reviewed-by: Martin Petersson <Martin.Petersson@nokia.com>
* Doc: Fix \sa usageMarius Storm-Olsen2012-05-111-1/+1
| | | | | | | | | Ensure comma between elements (757 missing), single space and curly- braces around title elements, etc. Change-Id: Id16c3fda7fc47a12a0682f8720214f4990609a97 Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> Reviewed-by: Casper van Donderen <casper.vandonderen@nokia.com>
* Doc: Modularize QtNetwork documentation.Casper van Donderen2012-05-095-11/+11
| | | | | | | This change moves the snippets and imagesto the modularized directories. Change-Id: If14912692a7f72d7de345eaf88d9ec9752310fca Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
* Various minor fixes for qdoc warnings.Richard Moore2012-05-061-1/+1
| | | | | Change-Id: I54c5ab6e1bfb1816bb510be9e2bfa1e3362faa36 Reviewed-by: Casper van Donderen <casper.vandonderen@nokia.com>
* Fix more qdoc warnings in qtnetwork.Richard Moore2012-05-061-7/+5
| | | | | Change-Id: Ibfac6236e9f68b41e34e67ef03cfd590582439be Reviewed-by: Casper van Donderen <casper.vandonderen@nokia.com>
* Rename QAbstractSocket::PauseOnNotify -> PauseOnSslErrorsShane Kearns2012-05-042-5/+5
| | | | | | | | | | | | | | | Although we created an enum for pause modes to make 5.x binary compatible with 5.0, the enum value is not well named. In 5.1, we propose to add PauseOnProxyAuthentication to the enum. PauseOnNotify is not clear what it means, while PauseOnSslErrors is. Any new notification in a minor release would need a new enum value otherwise applications would get pauses they did not expect. Task-number: QTBUG-19032 Change-Id: I4dbb7467663b37ca7f0551d24a31bc013968bedc Reviewed-by: Richard J. Moore <rich@kde.org> Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
* Pull in netinet/in.h. Required for definition of sockaddr_in and friends.Robin Burchell2012-05-031-0/+1
| | | | | | Change-Id: I3b1c7dc1c08ec54f5537b6019dc2554763538cfd Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* Implement QLocalServer::socketOptions on windowsShane Kearns2012-05-033-1/+130
| | | | | | | | | | Tested manually using the localfortuneserver example and multiple login sessions. The linux autotest isn't suitable for windows due to pipe permissions not appearing in the filesystem. Task-number: QTBUG-25147 Change-Id: I5ea4db81d1870dc45bd483fa8d0b06afede3b722 Reviewed-by: Joerg Bornemann <joerg.bornemann@nokia.com>
* Fix documentation of QLocalServerShane Kearns2012-05-031-4/+6
| | | | | | | | | Added \since 5.0 and corrected the enum documentation to match the code. Task-number: QTBUG-24001 Change-Id: I8e284b6eaaf68c46bbd0e07f4378f0c442f2edd4 Reviewed-by: Casper van Donderen <casper.vandonderen@nokia.com>
* Fix tst_qtcpserver::serverAddress on Mac OSXShane Kearns2012-04-241-1/+5
| | | | | | | | | | | | | While linux returns the local address of dual mode sockets as "::" i.e. the IPv6 address, OSX returns "::FFFF:0.0.0.0" i.e. the IPv4 address. In the unix socket engine, treat both of these as candidates for being a dual mode socket. This should hopefully cover other unixes which we haven't tested. Task-Number: QTBUG-25445 Change-Id: If1251018d54da98618223ba538c00ba54ac4cb4e Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Merge remote-tracking branch 'origin/master' into api_changesOswald Buddenhagen2012-04-104-2/+34
|\ | | | | | | | | | | | | | | | | | | Conflicts: configure src/widgets/styles/qwindowsxpstyle.cpp tests/auto/gui/kernel/qwindow/qwindow.pro tests/auto/gui/kernel/qwindow/tst_qwindow.cpp Change-Id: I624b6d26abce9874c610c04954c1c45bc074bef3
| * QAbstractSocket::waitForConnected check if host name is an IP addressMartin Petersson2012-04-021-1/+10
| | | | | | | | | | | | | | | | | | | | | | If the current host name is an ip address we can create the QHostInfo directly instead of performing a reverse lookup. Task-number: QTBUG-18881 Change-Id: If239481e455f4f7fb74d978f685dc5d8e9f22c0a Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Jonas Gastal <jgastal@profusion.mobi> Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
| * Fix QTcpServer::listen() returning true when the port is in use on OS X.Robin Burchell2012-04-021-1/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Way back in the mists of time, someone added SO_REUSEPORT to socket binding, which was great, because otherwise it meant that multiple UDP sockets couldn't share the same port on OS X (as platforms with SO_REUSEPORT apparently don't support rebinding with SO_REUSEADDR). However: SO_REUSEPORT also means that *any* bind on a port will succeed, which is most definitely not wanted in the case of TCP sockets, so check the socket type before performing the actual bind. Also test that multiple listens don't take effect. Change-Id: I2f8d450bcfb8a7f3abd8918a4e789a850281dd13 Done-with: Thiago Macieira Done-with: Shane Kearns Task-number: QTBUG-6305 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
| * Fix multicast join/leave when binding to QHostAddress::Any.Robin Burchell2012-04-022-0/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | On OS X and Windows, this was not working, because the socket was being bound in v6 mode (due to ::Any being for dual mode), but the address passed was a v4 address, meaning it took the wrong codepath. Linux, strangely, apparently works anyway. This is fixable in OS X (by using the v6 join path when bound in v6/dual mode), but the same fix doesn't work on Windows, failing with WSAEADDRNOTAVAIL. Don't allow this behaviour, and provide a sane error message telling the user what to do instead. Done-with: Shane Kearns Task-number: QTBUG-25047 Change-Id: Iaf5bbee82e13ac92e11b60c558f5af9ce26f474b Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* | Merge master into api_changesKent Hansen2012-03-234-4/+8
|\| | | | | | | Change-Id: I93551e4d13a1b0815b359b9415060e9089477db1
| * QLocalSocket: remove double buffer on qlocalsocket_unixMartin Petersson2012-03-231-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | The QLocalSocket is using a QLocalUnixSocket which is a QTcpSocket that has buffering enabled. Because QLocalSocket is a QIODevice it also has its own read buffer. By opening the QIODevice Unbuffered we only use the buffer in the QLocalUnixSocket. Change-Id: I4b9091522f73b0831b20efb4a2a00c2603fc748b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Richard J. Moore <rich@kde.org> Reviewed-by: Lars Knoll <lars.knoll@nokia.com> Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
| * Allow autobound UDP sockets to send to IPv4 and IPv6Shane Kearns2012-03-223-3/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When writeDatagram is called without first binding the UDP socket, then bind it as QHostAddress::Any. This allows the same socket to be used to sent to both IPv4 and IPv6 destination addresses. Allowing the OS to autobind the socket inside sendTo() may result in a single protocol socket. Task-number: QTBUG-5275 Change-Id: I2b76507e8a8a38369c6eafb61ce4191d1d6cc930 Reviewed-by: Richard J. Moore <rich@kde.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Martin Petersson <Martin.Petersson@nokia.com>
* | Merge master into api_changesKent Hansen2012-03-162-0/+3
|\| | | | | | | | | | | | | | | | | Conflicts: src/corelib/kernel/qmetatype.cpp src/gui/kernel/qplatformsurface_qpa.cpp tests/auto/corelib/tools/qtimeline/qtimeline.pro Change-Id: Iff3fff34eeeb06f02369767ddfce44cfde505178
| * Fix QUdpSocket bindMode autotest regressionShane2012-03-151-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | When binding with the DefaultForPlatform bindmode, then don't set options on the socket related to sharability, leave them at the platform default. This restores compatiblity with Qt 4 Change-Id: I612a3acb976f08446b4eef03ccdcdf84b3477c3c Reviewed-by: Robin Burchell <robin+qt@viroteck.net> Reviewed-by: Martin Petersson <Martin.Petersson@nokia.com>
| * Add missing private headers to .pri.Xizhi Zhu2012-03-151-0/+1
| | | | | | | | | | Change-Id: I7ba23f23c1e7cb19152f2c0cedec3549ddfb11c9 Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
* | QtNetwork: make some constructors explicitMarc Mutz2012-03-141-1/+1
|/ | | | | | | | | | This is a semi-automatic search, so I'm reasonably sure that all the exported ones have been caught. Change-Id: Ia00eb9194a5f64002bd7e7b894abf6333d1b825e Reviewed-by: Jonas Gastal <jgastal@profusion.mobi> Reviewed-by: Shane Kearns <shane.kearns@accenture.com>