summaryrefslogtreecommitdiff
path: root/vcl/win/app/salinst.cxx
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2017-09-28 12:40:42 +0300
committerMike Kaganski <mike.kaganski@collabora.com>2017-09-29 14:55:11 +0200
commit0dd2e602e5c1b46e82abc6051677aeaab1d265b8 (patch)
tree7f7a1cbc9cb87c38c732d4691129bf81dc1d04ff /vcl/win/app/salinst.cxx
parent8b12c98ec7ec0b5ba20c28890ee63803fb9518d5 (diff)
Drop check for Windows versions we don't support
Since we dropped support of Vista and below in master toward 6.0, those checks are needless. Removing the code that only worked in older versions, and streamlining the resulting code. Also, use kernel32.dll version for Windows version, instead of deprecated GetVersionEx, and inconvenient VersionHelpers. Since both GetVersion(Ex) and VersionHelpers (based on VerifyVersionInfo) are subject to manifest-based behavior since Windows 8.1, this move will hopefully result in more reliable OS version detection. Change-Id: I3edd8fc1843e64b6a65bd3a126be6a085511f13c Reviewed-on: https://gerrit.libreoffice.org/42905 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com> Tested-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'vcl/win/app/salinst.cxx')
-rw-r--r--vcl/win/app/salinst.cxx175
1 files changed, 72 insertions, 103 deletions
diff --git a/vcl/win/app/salinst.cxx b/vcl/win/app/salinst.cxx
index bc0c908d9af2..437e8b594c65 100644
--- a/vcl/win/app/salinst.cxx
+++ b/vcl/win/app/salinst.cxx
@@ -67,9 +67,6 @@
#include <gdiplus.h>
#include <shlobj.h>
-#ifdef _WIN32_WINNT_WINBLUE
-#include <VersionHelpers.h>
-#endif
#include "postwin.h"
#if defined _MSC_VER
@@ -359,35 +356,6 @@ SalInstance* CreateSalInstance()
{
SalData* pSalData = GetSalData();
- // determine the windows version
- aSalShlData.mbWXP = 0;
- aSalShlData.mbWVista = 0;
- aSalShlData.mbW7 = 0;
-// the Win32 SDK 8.1 deprecates GetVersionEx()
-#ifdef _WIN32_WINNT_WINBLUE
- aSalShlData.mbWXP = IsWindowsXPOrGreater() ? 1 : 0;
- aSalShlData.mbWVista = IsWindowsVistaOrGreater() ? 1 : 0;
- aSalShlData.mbW7 = IsWindows7OrGreater() ? 1 : 0;
-#else
- OSVERSIONINFO aVersionInfo;
- memset( &aVersionInfo, 0, sizeof(aVersionInfo) );
- aVersionInfo.dwOSVersionInfoSize = sizeof( aVersionInfo );
- if (GetVersionEx( &aVersionInfo ))
- {
- // Windows XP ?
- if (aVersionInfo.dwMajorVersion > 5 ||
- (aVersionInfo.dwMajorVersion == 5 && aVersionInfo.dwMinorVersion >= 1))
- aSalShlData.mbWXP = 1;
- // Windows Vista ?
- if (aVersionInfo.dwMajorVersion >= 6)
- aSalShlData.mbWVista = 1;
- // Windows 7 ?
- if (aVersionInfo.dwMajorVersion > 6 ||
- (aVersionInfo.dwMajorVersion == 6 && aVersionInfo.dwMinorVersion >= 1))
- aSalShlData.mbW7 = 1;
- }
-#endif
-
pSalData->mnAppThreadId = GetCurrentThreadId();
// register frame class
@@ -414,8 +382,7 @@ SalInstance* CreateSalInstance()
return nullptr;
// shadow effect for popups on XP
- if( aSalShlData.mbWXP )
- aWndClassEx.style |= CS_DROPSHADOW;
+ aWndClassEx.style |= CS_DROPSHADOW;
aWndClassEx.lpszClassName = SAL_TMPSUBFRAME_CLASSNAMEW;
if ( !RegisterClassExW( &aWndClassEx ) )
return nullptr;
@@ -865,50 +832,47 @@ void WinSalInstance::AddToRecentDocumentList(const OUString& rFileUrl, const OUS
if (osl::FileBase::E_None == rc)
{
- if ( aSalShlData.mbW7 )
- {
- IShellItem* pShellItem = nullptr;
+ IShellItem* pShellItem = nullptr;
- HRESULT hr = SHCreateItemFromParsingName(SAL_W(system_path.getStr()), nullptr, IID_PPV_ARGS(&pShellItem));
+ HRESULT hr = SHCreateItemFromParsingName(SAL_W(system_path.getStr()), nullptr, IID_PPV_ARGS(&pShellItem));
- if ( SUCCEEDED(hr) && pShellItem )
+ if ( SUCCEEDED(hr) && pShellItem )
+ {
+ OUString sApplicationName;
+
+ if ( rDocumentService == "com.sun.star.text.TextDocument" ||
+ rDocumentService == "com.sun.star.text.GlobalDocument" ||
+ rDocumentService == "com.sun.star.text.WebDocument" ||
+ rDocumentService == "com.sun.star.xforms.XMLFormDocument" )
+ sApplicationName = "Writer";
+ else if ( rDocumentService == "com.sun.star.sheet.SpreadsheetDocument" ||
+ rDocumentService == "com.sun.star.chart2.ChartDocument" )
+ sApplicationName = "Calc";
+ else if ( rDocumentService == "com.sun.star.presentation.PresentationDocument" )
+ sApplicationName = "Impress";
+ else if ( rDocumentService == "com.sun.star.drawing.DrawingDocument" )
+ sApplicationName = "Draw";
+ else if ( rDocumentService == "com.sun.star.formula.FormulaProperties" )
+ sApplicationName = "Math";
+ else if ( rDocumentService == "com.sun.star.sdb.DatabaseDocument" ||
+ rDocumentService == "com.sun.star.sdb.OfficeDatabaseDocument" ||
+ rDocumentService == "com.sun.star.sdb.RelationDesign" ||
+ rDocumentService == "com.sun.star.sdb.QueryDesign" ||
+ rDocumentService == "com.sun.star.sdb.TableDesign" ||
+ rDocumentService == "com.sun.star.sdb.DataSourceBrowser" )
+ sApplicationName = "Base";
+
+ if ( !sApplicationName.isEmpty() )
{
- OUString sApplicationName;
-
- if ( rDocumentService == "com.sun.star.text.TextDocument" ||
- rDocumentService == "com.sun.star.text.GlobalDocument" ||
- rDocumentService == "com.sun.star.text.WebDocument" ||
- rDocumentService == "com.sun.star.xforms.XMLFormDocument" )
- sApplicationName = "Writer";
- else if ( rDocumentService == "com.sun.star.sheet.SpreadsheetDocument" ||
- rDocumentService == "com.sun.star.chart2.ChartDocument" )
- sApplicationName = "Calc";
- else if ( rDocumentService == "com.sun.star.presentation.PresentationDocument" )
- sApplicationName = "Impress";
- else if ( rDocumentService == "com.sun.star.drawing.DrawingDocument" )
- sApplicationName = "Draw";
- else if ( rDocumentService == "com.sun.star.formula.FormulaProperties" )
- sApplicationName = "Math";
- else if ( rDocumentService == "com.sun.star.sdb.DatabaseDocument" ||
- rDocumentService == "com.sun.star.sdb.OfficeDatabaseDocument" ||
- rDocumentService == "com.sun.star.sdb.RelationDesign" ||
- rDocumentService == "com.sun.star.sdb.QueryDesign" ||
- rDocumentService == "com.sun.star.sdb.TableDesign" ||
- rDocumentService == "com.sun.star.sdb.DataSourceBrowser" )
- sApplicationName = "Base";
-
- if ( !sApplicationName.isEmpty() )
- {
- OUString sApplicationID("TheDocumentFoundation.LibreOffice.");
- sApplicationID += sApplicationName;
+ OUString sApplicationID("TheDocumentFoundation.LibreOffice.");
+ sApplicationID += sApplicationName;
- SHARDAPPIDINFO info;
- info.psi = pShellItem;
- info.pszAppID = SAL_W(sApplicationID.getStr());
+ SHARDAPPIDINFO info;
+ info.psi = pShellItem;
+ info.pszAppID = SAL_W(sApplicationID.getStr());
- SHAddToRecentDocs ( SHARD_APPIDINFO, &info );
- return;
- }
+ SHAddToRecentDocs ( SHARD_APPIDINFO, &info );
+ return;
}
}
// For whatever reason, we could not use the SHARD_APPIDINFO semantics
@@ -958,38 +922,43 @@ int WinSalInstance::WorkaroundExceptionHandlingInUSER32Lib(int, LPEXCEPTION_POIN
OUString WinSalInstance::getOSVersion()
{
- SalData* pSalData = GetSalData();
- if ( !pSalData )
- return OUString("unknown");
-
- WORD nMajor = 0, nMinor = 0;
-#ifdef _WIN32_WINNT_WINBLUE
- // Trying to hide the real version info behind an
- // uber-lame non-forward-compatible, 'compatibility' API
- // seems unlikely to help OS designers, or API users.
- nMajor = 30;
- while( !IsWindowsVersionOrGreater( nMajor, 0, 0 ) && nMajor > 0)
- nMajor--;
- nMinor = 30;
- while( !IsWindowsVersionOrGreater( nMajor, nMinor, 0 ) && nMinor > 0)
- nMinor--;
-#else
- OSVERSIONINFO aVersionInfo;
- memset( &aVersionInfo, 0, sizeof( aVersionInfo ) );
- aVersionInfo.dwOSVersionInfoSize = sizeof( aVersionInfo );
- if ( GetVersionEx( &aVersionInfo ) )
+ // GetVersion(Ex) and VersionHelpers (based on VerifyVersionInfo) API are
+ // subject to manifest-based behavior since Windows 8.1, so give wrong results.
+ // Another approach would be to use NetWkstaGetInfo, but that has some small
+ // reported delays (some milliseconds), and might get slower in domains with
+ // poor network connections.
+ // So go with a solution described at https://msdn.microsoft.com/en-us/library/ms724429
+ HINSTANCE hLibrary = LoadLibraryW(L"kernel32.dll");
+ if (hLibrary != nullptr)
{
- nMajor = aVersionInfo.dwMajorVersion;
- nMinor = aVersionInfo.dwMinorVersion;
+ wchar_t szPath[MAX_PATH];
+ DWORD dwCount = GetModuleFileNameW(hLibrary, szPath, SAL_N_ELEMENTS(szPath));
+ FreeLibrary(hLibrary);
+ if (dwCount != 0 && dwCount < SAL_N_ELEMENTS(szPath))
+ {
+ dwCount = GetFileVersionInfoSizeW(szPath, NULL);
+ if (dwCount != 0)
+ {
+ std::unique_ptr<char> ver(new char[dwCount]);
+ if (GetFileVersionInfoW(szPath, 0, dwCount, ver.get()) != FALSE)
+ {
+ void* pBlock = nullptr;
+ UINT dwBlockSz = 0;
+ if (VerQueryValueW(ver.get(), L"\\", &pBlock, &dwBlockSz) != FALSE && dwBlockSz >= sizeof(VS_FIXEDFILEINFO))
+ {
+ VS_FIXEDFILEINFO *vinfo = reinterpret_cast<VS_FIXEDFILEINFO *>(pBlock);
+ OUStringBuffer aVer;
+ aVer.append("Windows ");
+ aVer.append((sal_Int32)HIWORD(vinfo->dwProductVersionMS));
+ aVer.append(".");
+ aVer.append((sal_Int32)LOWORD(vinfo->dwProductVersionMS));
+ return aVer.makeStringAndClear();
+ }
+ }
+ }
+ }
}
-#endif
- OUStringBuffer aVer;
- aVer.append( "Windows " );
- aVer.append( (sal_Int32)nMajor );
- aVer.append( "." );
- aVer.append( (sal_Int32)nMinor );
-
- return aVer.makeStringAndClear();
+ return "unknown";
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */