From 0d43d54c3b2a04114b9d1bd7d8e07dd0734a0906 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Mon, 2 May 2011 04:04:04 +0200 Subject: [PATCH] ugly hacks to make liblastfm compile on windows --- thirdparty/liblastfm2/src/CMakeLists.txt | 5 ++- .../src/ws/NetworkAccessManager.cpp | 28 ++++++------- thirdparty/liblastfm2/src/ws/win/ComSetup.h | 27 +++++++------ thirdparty/liblastfm2/src/ws/win/IeSettings.h | 6 ++- .../liblastfm2/src/ws/win/NdisEvents.cpp | 26 ++++++------ thirdparty/liblastfm2/src/ws/win/NdisEvents.h | 10 ++--- thirdparty/liblastfm2/src/ws/win/Pac.cpp | 40 +++++++++++-------- thirdparty/liblastfm2/src/ws/win/Pac.h | 10 ++--- thirdparty/liblastfm2/src/ws/win/WmiSink.h | 4 +- 9 files changed, 84 insertions(+), 72 deletions(-) diff --git a/thirdparty/liblastfm2/src/CMakeLists.txt b/thirdparty/liblastfm2/src/CMakeLists.txt index a9cd2622e..2859d826c 100644 --- a/thirdparty/liblastfm2/src/CMakeLists.txt +++ b/thirdparty/liblastfm2/src/CMakeLists.txt @@ -78,7 +78,7 @@ if(UNIX) endif(APPLE) endif(UNIX) if(WIN32) - set(SOURCES ${SOURCES} ws/win/WNetworkConnectionMonitor_win.cpp) + set(SOURCES ${SOURCES} ws/win/WNetworkConnectionMonitor_win.cpp ws/win/Pac.cpp ws/win/NdisEvents.cpp ) set(MOC_HEADERS ${MOC_HEADERS} ws/win/WNetworkConnectionMonitor.h) endif(WIN32) @@ -100,9 +100,10 @@ ENDIF() target_link_libraries(tomahawk_lastfm2 ${QT_LIBRARIES} ${QT_QTDBUS_LIBRARY} + ) -set_target_properties(tomahawk_lastfm2 PROPERTIES COMPILE_FLAGS "-DLASTFM_OHAI_QMAKE" ) +set_target_properties(tomahawk_lastfm2 PROPERTIES COMPILE_FLAGS "-DLASTFM_OHAI_QMAKE" ) if(APPLE) target_link_libraries(tomahawk_lastfm2 diff --git a/thirdparty/liblastfm2/src/ws/NetworkAccessManager.cpp b/thirdparty/liblastfm2/src/ws/NetworkAccessManager.cpp index 2d628b1ad..95845c0ff 100644 --- a/thirdparty/liblastfm2/src/ws/NetworkAccessManager.cpp +++ b/thirdparty/liblastfm2/src/ws/NetworkAccessManager.cpp @@ -1,5 +1,5 @@ /* - Copyright 2009 Last.fm Ltd. + Copyright 2009 Last.fm Ltd. - Primarily authored by Max Howell, Jono Cole and Doug Mansell This file is part of liblastfm. @@ -34,11 +34,11 @@ static struct NetworkAccessManagerInit { - // We do this upfront because then our Firehose QTcpSocket will have a proxy + // We do this upfront because then our Firehose QTcpSocket will have a proxy // set by default. As well as any plain QNetworkAcessManager stuff, and the // scrobbler - // In theory we should do this every request in case the configuration - // changes but that is fairly unlikely use case, init? Maybe we should + // In theory we should do this every request in case the configuration + // changes but that is fairly unlikely use case, init? Maybe we should // anyway.. NetworkAccessManagerInit() @@ -50,7 +50,7 @@ static struct NetworkAccessManagerInit // at two seconds, so that hangs startup if (!s.fAutoDetect && s.lpszProxy) { - QUrl url( QString::fromUtf16(s.lpszProxy) ); + QUrl url( QString::fromUtf16((const unsigned short*)s.lpszProxy) ); QNetworkProxy proxy( QNetworkProxy::HttpProxy ); proxy.setHostName( url.host() ); proxy.setPort( url.port() ); @@ -69,10 +69,10 @@ static struct NetworkAccessManagerInit } #endif } -} init; +} init; -namespace lastfm +namespace lastfm { LASTFM_DLLEXPORT QByteArray UserAgent; } @@ -106,12 +106,12 @@ lastfm::NetworkAccessManager::~NetworkAccessManager() QNetworkProxy lastfm::NetworkAccessManager::proxy( const QNetworkRequest& request ) -{ +{ Q_UNUSED( request ); - + #ifdef WIN32 IeSettings s; - if (s.fAutoDetect) + if (s.fAutoDetect) { if (!m_pac) { m_pac = new Pac; @@ -122,9 +122,9 @@ lastfm::NetworkAccessManager::proxy( const QNetworkRequest& request ) } } return m_pac->resolve( request, s.lpszAutoConfigUrl ); - } + } #endif - + return QNetworkProxy::applicationProxy(); } @@ -136,7 +136,7 @@ lastfm::NetworkAccessManager::createRequest( Operation op, const QNetworkRequest request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache ); request.setRawHeader( "User-Agent", lastfm::UserAgent ); - + #ifdef WIN32 // PAC proxies can vary by domain, so we have to check everytime :( QNetworkProxy proxy = this->proxy( request ); @@ -152,7 +152,7 @@ void lastfm::NetworkAccessManager::onConnectivityChanged( bool up ) { Q_UNUSED( up ); - + #ifdef WIN32 if (up && m_pac) m_pac->resetFailedState(); #endif diff --git a/thirdparty/liblastfm2/src/ws/win/ComSetup.h b/thirdparty/liblastfm2/src/ws/win/ComSetup.h index fc3816bd7..7389f0976 100644 --- a/thirdparty/liblastfm2/src/ws/win/ComSetup.h +++ b/thirdparty/liblastfm2/src/ws/win/ComSetup.h @@ -1,5 +1,5 @@ /* - Copyright 2009 Last.fm Ltd. + Copyright 2009 Last.fm Ltd. - Primarily authored by Max Howell, Jono Cole and Doug Mansell This file is part of liblastfm. @@ -23,12 +23,13 @@ #endif #include -#include -#include - +//#include +//#include +//#include +#include /** @brief WsConnectionMonitor needs Com to work as early as possible so we do this - * @author + * @author */ class ComSetup { @@ -37,27 +38,27 @@ public: { HRESULT hr = CoInitialize(0); m_bComInitialised = SUCCEEDED(hr); - _ASSERT(m_bComInitialised); + //_ASSERT(m_bComInitialised); if (m_bComInitialised) { setupSecurity(); } } - + void setupSecurity() { - CSecurityDescriptor sd; - sd.InitializeFromThreadToken(); - HRESULT hr = CoInitializeSecurity(sd, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); - _ASSERT(SUCCEEDED(hr)); + //CSecurityDescriptor sd; + //sd.InitializeFromThreadToken(); + //HRESULT hr = CoInitializeSecurity(sd, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); + //_ASSERT(SUCCEEDED(hr)); } - + ~ComSetup() { if (m_bComInitialised) { CoUninitialize(); } } - + private: bool m_bComInitialised; }; diff --git a/thirdparty/liblastfm2/src/ws/win/IeSettings.h b/thirdparty/liblastfm2/src/ws/win/IeSettings.h index 5d756a5ea..c86774b8d 100644 --- a/thirdparty/liblastfm2/src/ws/win/IeSettings.h +++ b/thirdparty/liblastfm2/src/ws/win/IeSettings.h @@ -1,5 +1,5 @@ /* - Copyright 2009 Last.fm Ltd. + Copyright 2009 Last.fm Ltd. - Primarily authored by Max Howell, Jono Cole and Doug Mansell This file is part of liblastfm. @@ -26,6 +26,7 @@ */ struct IeSettings : WINHTTP_CURRENT_USER_IE_PROXY_CONFIG { +#ifndef WIN32 IeSettings() { if (!WinHttpGetIEProxyConfigForCurrentUser(this)) { @@ -33,7 +34,8 @@ struct IeSettings : WINHTTP_CURRENT_USER_IE_PROXY_CONFIG lpszAutoConfigUrl = lpszProxy = lpszProxyBypass = 0; } } - +#endif + ~IeSettings() { if (lpszAutoConfigUrl) GlobalFree(lpszAutoConfigUrl); diff --git a/thirdparty/liblastfm2/src/ws/win/NdisEvents.cpp b/thirdparty/liblastfm2/src/ws/win/NdisEvents.cpp index 7263af24b..7b5822ac6 100644 --- a/thirdparty/liblastfm2/src/ws/win/NdisEvents.cpp +++ b/thirdparty/liblastfm2/src/ws/win/NdisEvents.cpp @@ -1,5 +1,5 @@ /* - Copyright 2009 Last.fm Ltd. + Copyright 2009 Last.fm Ltd. - Primarily authored by Max Howell, Jono Cole and Doug Mansell This file is part of liblastfm. @@ -32,35 +32,37 @@ NdisEvents::NdisEvents() NdisEvents::~NdisEvents() { +#ifndef WIN32 if (m_pSink) m_pSink->disconnect(); - if (m_pServices && m_pSink) - m_pServices->CancelAsyncCall(m_pSink); +#endif + //if (m_pServices && m_pSink) + //m_pServices->CancelAsyncCall(m_pSink); // and reference counting will take care of the WmiSink object } HRESULT NdisEvents::registerForNdisEvents() { - HRESULT hr = m_pLocator.CoCreateInstance(CLSID_WbemLocator); + HRESULT hr = 0; //m_pLocator.CoCreateInstance(CLSID_WbemLocator); if (FAILED(hr)) return hr; // Connect to the root\wmi namespace with the current user. - hr = m_pLocator->ConnectServer(CComBSTR("ROOT\\WMI"), // strNetworkResource + hr = 0; /*m_pLocator->ConnectServer(CComBSTR("ROOT\\WMI"), // strNetworkResource NULL, // strUser NULL, // strPassword - NULL, // strLocale + NULL, // strLocale 0, // lSecurityFlags - CComBSTR(""), // strAuthority + CComBSTR(""), // strAuthority NULL, // pCtx &m_pServices - ); + );*/ if (FAILED(hr)) return hr; - +#ifndef WIN32 m_pSink = new WmiSink(this); - +#endif ////////////////////////// // other notifications we're not interested in right now include... @@ -75,12 +77,12 @@ NdisEvents::registerForNdisEvents() // MSNdis_StatusProtocolUnbind // MSNdis_StatusMediaSpecificIndication - CComBSTR wql("WQL"); + /*CComBSTR wql("WQL"); CComBSTR query("SELECT * FROM MSNdis_StatusMediaDisconnect"); hr = m_pServices->ExecNotificationQueryAsync(wql, query, 0, 0, m_pSink); query = "SELECT * FROM MSNdis_StatusMediaConnect"; - hr = m_pServices->ExecNotificationQueryAsync(wql, query, 0, 0, m_pSink); + hr = m_pServices->ExecNotificationQueryAsync(wql, query, 0, 0, m_pSink);*/ return S_OK; } diff --git a/thirdparty/liblastfm2/src/ws/win/NdisEvents.h b/thirdparty/liblastfm2/src/ws/win/NdisEvents.h index 1e1cfcf9c..8b4efe0e1 100644 --- a/thirdparty/liblastfm2/src/ws/win/NdisEvents.h +++ b/thirdparty/liblastfm2/src/ws/win/NdisEvents.h @@ -1,5 +1,5 @@ /* - Copyright 2009 Last.fm Ltd. + Copyright 2009 Last.fm Ltd. - Primarily authored by Max Howell, Jono Cole and Doug Mansell This file is part of liblastfm. @@ -21,8 +21,8 @@ #define NDIS_EVENTS_H #include -#include -#include +//#include +//#include class NdisEvents { @@ -35,8 +35,8 @@ public: virtual void onConnectionDown(BSTR name) = 0; private: - CComPtr m_pLocator; - CComPtr m_pServices; + //CComPtr m_pLocator; + //CComPtr m_pServices; class WmiSink *m_pSink; }; diff --git a/thirdparty/liblastfm2/src/ws/win/Pac.cpp b/thirdparty/liblastfm2/src/ws/win/Pac.cpp index 3e3d72b12..b0a836c7f 100644 --- a/thirdparty/liblastfm2/src/ws/win/Pac.cpp +++ b/thirdparty/liblastfm2/src/ws/win/Pac.cpp @@ -1,5 +1,5 @@ /* - Copyright 2009 Last.fm Ltd. + Copyright 2009 Last.fm Ltd. - Primarily authored by Max Howell, Jono Cole and Doug Mansell This file is part of liblastfm. @@ -21,8 +21,9 @@ #include #include #include -#include -#include +//#include +//#include +#include static bool @@ -45,7 +46,7 @@ parsePacServer(const QString &s, QNetworkProxy &p) static QList parsePacResult(const QString &pacResult) { - // msdn says: "The proxy server list contains one or more of the + // msdn says: "The proxy server list contains one or more of the // following strings separated by semicolons or whitespace." // ([=]["://"][":"]) @@ -73,8 +74,10 @@ lastfm::Pac::Pac() lastfm::Pac::~Pac() { +#ifndef WIN32 if (m_hSession) WinHttpCloseHandle(m_hSession); +#endif } QNetworkProxy @@ -86,42 +89,45 @@ lastfm::Pac::resolve(const QNetworkRequest &request, const wchar_t* pacUrl) if (!m_hSession) { QByteArray user_agent = request.rawHeader("user-agent"); - m_hSession = WinHttpOpen(CA2W(user_agent), WINHTTP_ACCESS_TYPE_NO_PROXY, 0, 0, WINHTTP_FLAG_ASYNC); + //m_hSession = WinHttpOpen(CA2W(user_agent), WINHTTP_ACCESS_TYPE_NO_PROXY, 0, 0, WINHTTP_FLAG_ASYNC); } if (m_hSession) { WINHTTP_PROXY_INFO info; WINHTTP_AUTOPROXY_OPTIONS opts; memset(&opts, 0, sizeof(opts)); - if (pacUrl) + if (pacUrl) { - opts.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL; - opts.lpszAutoConfigUrl = pacUrl; - } + //opts.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL; + //opts.lpszAutoConfigUrl = pacUrl; + } else { - opts.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT; - opts.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP | WINHTTP_AUTO_DETECT_TYPE_DNS_A; + //opts.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT; + //opts.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP | WINHTTP_AUTO_DETECT_TYPE_DNS_A; } opts.fAutoLogonIfChallenged = TRUE; - - if (WinHttpGetProxyForUrl(m_hSession, request.url().toString().utf16(), &opts, &info)) { - if (info.lpszProxy) +#ifndef WIN32 + if (WinHttpGetProxyForUrl(m_hSession, (const WCHAR*)(request.url().toString().utf16()), &opts, &info)) { + if (info.lpszProxy) { - QList proxies = parsePacResult(QString::fromUtf16(info.lpszProxy)); + QList proxies = parsePacResult(QString::fromUtf16((const ushort*)info.lpszProxy)); if (!proxies.empty()) { out = proxies.at(0); } - GlobalFree(info.lpszProxy); + // pay attention! casting away constness + GlobalFree((void*)info.lpszProxy); } if (info.lpszProxyBypass) { - GlobalFree(info.lpszProxyBypass); + // pay attention! casting away constness + GlobalFree((void*)info.lpszProxyBypass); } } else { m_bFailed = true; } +#endif } return out; diff --git a/thirdparty/liblastfm2/src/ws/win/Pac.h b/thirdparty/liblastfm2/src/ws/win/Pac.h index 075d128f6..98d3e6b0e 100644 --- a/thirdparty/liblastfm2/src/ws/win/Pac.h +++ b/thirdparty/liblastfm2/src/ws/win/Pac.h @@ -1,5 +1,5 @@ /* - Copyright 2009 Last.fm Ltd. + Copyright 2009 Last.fm Ltd. - Primarily authored by Max Howell, Jono Cole and Doug Mansell This file is part of liblastfm. @@ -24,14 +24,14 @@ #include #include class QNetworkRequest; - + namespace lastfm { - /** @brief simple wrapper to do per url automatic proxy detection + /** @brief simple wrapper to do per url automatic proxy detection * @author */ class Pac - { + { HINTERNET m_hSession; bool m_bFailed; @@ -49,4 +49,4 @@ namespace lastfm }; } -#endif \ No newline at end of file +#endif \ No newline at end of file diff --git a/thirdparty/liblastfm2/src/ws/win/WmiSink.h b/thirdparty/liblastfm2/src/ws/win/WmiSink.h index 1bce28fdd..8f58a1f4a 100644 --- a/thirdparty/liblastfm2/src/ws/win/WmiSink.h +++ b/thirdparty/liblastfm2/src/ws/win/WmiSink.h @@ -1,5 +1,5 @@ /* - Copyright 2009 Last.fm Ltd. + Copyright 2009 Last.fm Ltd. - Primarily authored by Max Howell, Jono Cole and Doug Mansell This file is part of liblastfm. @@ -20,7 +20,7 @@ #ifndef WMISINK_WIN_H #define WMISINK_WIN_H -#include "WbemCli.h" +#include "wbemcli.h" // Sink object for WMI NDIS notifications class WmiSink : public IWbemObjectSink