[PATCH] Add native Bluetooth support for Windows platforms

Thiago Macieira thiago at macieira.org
Thu Aug 20 21:22:52 PDT 2015

On Wednesday 19 August 2015 00:57:20 Claudiu Olteanu wrote:
> Hi there,
> As I promised, I created a new set of patches. You can find it
> attached to this e-mail.
> Here is a list with the changes I did after the feedback:
> - initialized the internal variables (patch 06)


> - moved the *WSACleanup* call from patch 06 to patch 12

Good, like I said that is now better than Qt itself.

> - removed the implementation of my internal *getLastError* and started
> using *qt_error_string* (patch 11)
> - used *WSAAddressToStringW* instead of *WSAAddressToStringA* (patch 11)
> - avoided some code duplication (patches 14, 15, 17)
> I hope that I covered all of Thiago's suggestions.

Yes, it does.

> Also I didn't remove the call of strdup method from
> *qtserialbluetooth::qt_serial_open *because the
> *WSAStringToAddressA* method is expecting to receive
> LPSTR {aka char*} parameter while I have the address
> represented as const char*.

The Win32 API documentation says it's an input parameter. It's probably a 
mistake on MSFT's part to have forgotten the "const" there. But let's not 
tempt fate and we'll leave it with the strdup.

> I tried as well to replace the WSAStringToAddressA with
> WSAStringToAddressW but I had to represent the
> address as a wchar_t* and and when I wanted to use
> mbstowcs_s for conversion (from const char* to wchar_t*)
> the compiler couldn't find the declaration to the method
> (even though I included the stdlib header). After some
> failed attempts I gave up :).

Like I said, never, ever use <wchar.h> functions. Those are braindead in 
design, at least compared to Qt's equivalents.

Before I go into this, let me say that the patches are fine and Dirk can apply 
them as-is. There's no need to change further.

With that now said, here's how you can improve. Your code is:

> +       char *address = strdup(devaddr);
> +       if (WSAStringToAddressA(address,
> +                               AF_BTH,
> +                               NULL,
> +                               (LPSOCKADDR) &socketBthAddress,
> +                               &socketBthAddressBth
> +                               ) != 0) {
> +

To use the W function:

	QString address = QString::fromLatin1(devaddr);
	if (WSAStringToAddressW(reinterpret_cast<wchar_t*>(address.utf16()),

This also solves the strdup() and free() calls. And if the line didn't get too 
long, you could do everything in one line.

Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
   Software Architect - Intel Open Source Technology Center
      PGP/GPG: 0x6EF45358; fingerprint:
      E067 918B B660 DBD1 105C  966C 33F5 F005 6EF4 5358

More information about the subsurface mailing list