From ca47896204482bf4a6979e3838bf7f09f61cebeb Mon Sep 17 00:00:00 2001
From: giy <giy@omp-system.ru>
Date: Fri, 02 Sep 2022 14:16:56 +0300
Subject: [PATCH] Обновление до версии 2.9.0
---
QtVsTools.Core/QtVersionManager.cs | 246 ++++++++++++++++++++-----------------------------
1 files changed, 100 insertions(+), 146 deletions(-)
diff --git a/QtVsTools.Core/QtVersionManager.cs b/QtVsTools.Core/QtVersionManager.cs
index 000a198..15a3ae2 100644
--- a/QtVsTools.Core/QtVersionManager.cs
+++ b/QtVsTools.Core/QtVersionManager.cs
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt VS Tools.
@@ -26,16 +26,14 @@
**
****************************************************************************/
-using Microsoft.VisualStudio.VCProjectEngine;
-using Microsoft.Win32;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
-using System.Linq;
using System.Threading;
-using QtVsTools.VisualStudio;
-using EnvDTE;
+using Microsoft.VisualStudio.Shell;
+using Microsoft.VisualStudio.VCProjectEngine;
+using Microsoft.Win32;
namespace QtVsTools.Core
{
@@ -45,37 +43,20 @@
public class QtVersionManager
{
private static QtVersionManager instance;
- private string regVersionPath;
- private string strVersionKey;
+ private readonly string regVersionPath;
+ private readonly string strVersionKey;
private Hashtable versionCache;
protected QtVersionManager()
{
strVersionKey = "Versions";
regVersionPath = Resources.registryVersionPath;
- RefreshVersionNames();
}
- void RefreshVersionNames()
- {
- var rootKeyPath = "SOFTWARE\\" + Resources.registryRootPath;
- try {
- using (var rootKey = Registry.CurrentUser.OpenSubKey(rootKeyPath, true))
- using (var versionsKey = rootKey.OpenSubKey(strVersionKey, true)) {
- versionsKey.SetValue("VersionNames", string.Join(";", GetVersions()));
- }
+ private static readonly EventWaitHandle packageInit = new EventWaitHandle(false, EventResetMode.ManualReset);
+ private static EventWaitHandle packageInitDone = null;
- } catch (Exception e) {
- Messages.Print(
- e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
- }
- }
-
- static EventWaitHandle
- packageInit = new EventWaitHandle(false, EventResetMode.ManualReset),
- packageInitDone = null;
-
- static public QtVersionManager The(EventWaitHandle initDone = null)
+ public static QtVersionManager The(EventWaitHandle initDone = null)
{
if (initDone == null) {
packageInit.WaitOne();
@@ -92,10 +73,10 @@
public VersionInformation GetVersionInfo(string name)
{
- if (name == "$(DefaultQtVersion)")
- name = GetDefaultVersion();
if (name == null)
return null;
+ if (name == "$(DefaultQtVersion)")
+ name = GetDefaultVersion();
if (versionCache == null)
versionCache = new Hashtable();
@@ -111,13 +92,8 @@
public VersionInformation GetVersionInfo(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return GetVersionInfo(GetProjectQtVersion(project));
- }
-
- public void ClearVersionCache()
- {
- if (versionCache != null)
- versionCache.Clear();
}
public string[] GetVersions()
@@ -130,13 +106,12 @@
if (qtDir == null)
return null;
- qtDir = qtDir.ToLower();
var versions = GetVersions();
foreach (var version in versions) {
var installPath = GetInstallPath(version);
if (installPath == null)
continue;
- if (installPath.ToLower() == qtDir)
+ if (installPath.Equals(qtDir, StringComparison.OrdinalIgnoreCase))
return version;
}
@@ -157,84 +132,61 @@
/// <summary>
/// Check if all Qt versions are valid and readable.
/// </summary>
- /// Also sets the default Qt version to the newest version, if needed.
/// <param name="errorMessage"></param>
- /// <returns>true, if we found an invalid version</returns>
- public bool HasInvalidVersions(out string errorMessage)
+ /// <returns>true, if there are one or more invalid Qt version</returns>
+ public bool HasInvalidVersions(out string errorMessage, out bool defaultVersionInvalid)
{
- var validVersions = new Dictionary<string, QtConfig>();
- var invalidVersions = new List<string>();
+ var defaultVersion = GetDefaultVersionString();
+ defaultVersionInvalid = string.IsNullOrEmpty(defaultVersion);
- foreach (var v in GetVersions()) {
- if (v == "$(DefaultQtVersion)")
- continue;
-
- var vPath = GetInstallPath(v);
- if (string.IsNullOrEmpty(vPath)) {
- invalidVersions.Add(v);
- continue;
- }
-
- if (vPath.StartsWith("SSH:") || vPath.StartsWith("WSL:"))
- continue;
-
- var qmakePath = Path.Combine(vPath, "bin", "qmake.exe");
- if (!File.Exists(qmakePath))
- qmakePath = Path.Combine(vPath, "qmake.exe");
- if (!File.Exists(qmakePath)) {
- invalidVersions.Add(v);
- continue;
- }
-
- validVersions[v] = new QtConfig(vPath);
- }
-
- if (invalidVersions.Count > 0) {
- errorMessage = "These Qt version are inaccessible:\n";
- foreach (var invalidVersion in invalidVersions)
- errorMessage += invalidVersion + " in " + GetInstallPath(invalidVersion) + "\n";
- errorMessage += "Make sure that you have read access to all files in your Qt directories.";
-
- // Is the default Qt version invalid?
- var isDefaultQtVersionInvalid = false;
- var defaultQtVersionName = GetDefaultVersion();
- if (string.IsNullOrEmpty(defaultQtVersionName)) {
- isDefaultQtVersionInvalid = true;
- } else {
- foreach (var name in invalidVersions) {
- if (name == defaultQtVersionName) {
- isDefaultQtVersionInvalid = true;
- break;
- }
- }
- }
-
- // find the newest valid Qt version that can be used as default version
- if (isDefaultQtVersionInvalid && validVersions.Count > 0) {
- QtConfig defaultQtVersionConfig = null;
- foreach (var vNameConfig in validVersions) {
- var vName = vNameConfig.Key;
- var v = vNameConfig.Value;
- if (defaultQtVersionConfig == null) {
- defaultQtVersionConfig = v;
- defaultQtVersionName = vName;
- continue;
- }
- if (defaultQtVersionConfig.VersionMajor < v.VersionMajor ||
- (defaultQtVersionConfig.VersionMajor == v.VersionMajor && (defaultQtVersionConfig.VersionMinor < v.VersionMinor ||
- (defaultQtVersionConfig.VersionMinor == v.VersionMinor && defaultQtVersionConfig.VersionPatch < v.VersionPatch)))) {
- defaultQtVersionConfig = v;
- defaultQtVersionName = vName;
- }
- }
- if (defaultQtVersionConfig != null)
- SaveDefaultVersion(defaultQtVersionName);
- }
-
- return true;
- }
errorMessage = null;
- return false;
+ foreach (var version in GetVersions()) {
+ if (version == "$(DefaultQtVersion)")
+ continue;
+
+ var path = GetInstallPath(version);
+ if (path != null && (path.StartsWith("SSH:") || path.StartsWith("WSL:")))
+ continue;
+
+ if (string.IsNullOrEmpty(path) || !QMake.Exists(path)) {
+ errorMessage += version + " in " + path + "\n";
+ defaultVersionInvalid |= version == defaultVersion;
+ }
+
+ if (!string.IsNullOrEmpty(errorMessage)) {
+ errorMessage = "These Qt version are inaccessible:\n"
+ + errorMessage
+ + "Make sure that you have read access to all files in your Qt directories.";
+ }
+ }
+ return errorMessage != null;
+ }
+
+ public void SetLatestQtVersionAsDefault()
+ {
+ var validVersions = new Dictionary<string, Version>();
+ foreach (var version in GetVersions()) {
+ if (version == "$(DefaultQtVersion)")
+ continue;
+
+ var path = GetInstallPath(version);
+ if (!string.IsNullOrEmpty(path) && QMake.Exists(path))
+ validVersions[version] = new Version(new QtConfig(path).VersionString);
+ }
+
+ if (validVersions.Count <= 0)
+ return;
+
+ var defaultName = "";
+ Version defaultVersion = null;
+ foreach (var tmp in validVersions) {
+ var version = tmp.Value;
+ if (defaultVersion == null || defaultVersion < version) {
+ defaultName = tmp.Key;
+ defaultVersion = version;
+ }
+ }
+ SaveDefaultVersion(defaultName);
}
public string GetInstallPath(string version)
@@ -252,16 +204,14 @@
return Environment.GetEnvironmentVariable("QTDIR");
var key = root.OpenSubKey("SOFTWARE\\" + Resources.registryRootPath, false);
- if (key == null)
- return null;
- var versionKey = key.OpenSubKey(strVersionKey + "\\" + version, false);
- if (versionKey == null)
- return null;
- return (string)versionKey.GetValue("InstallDir");
+ var versionKey = key?.OpenSubKey(strVersionKey + "\\" + version, false);
+ return versionKey?.GetValue("InstallDir") as string;
}
public string GetInstallPath(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var version = GetProjectQtVersion(project);
if (version == "$(DefaultQtVersion)")
version = GetDefaultVersion();
@@ -309,7 +259,6 @@
versionKey.SetValue("InstallDir", dir);
}
}
- RefreshVersionNames();
return true;
}
@@ -320,10 +269,9 @@
return;
key.DeleteSubKey(versionName);
key.Close();
- RefreshVersionNames();
}
- private bool IsVersionAvailable(string version)
+ internal bool IsVersionAvailable(string version)
{
var versionAvailable = false;
var versions = GetVersions();
@@ -338,13 +286,17 @@
public bool SaveProjectQtVersion(EnvDTE.Project project, string version)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return SaveProjectQtVersion(project, version, project.ConfigurationManager.ActiveConfiguration.PlatformName);
}
public bool SaveProjectQtVersion(EnvDTE.Project project, string version, string platform)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (!IsVersionAvailable(version) && version != "$(DefaultQtVersion)")
return false;
+
if (QtProject.GetFormatVersion(project) >= Resources.qtMinFormatVersion_Settings) {
var vcPro = project.Object as VCProject;
if (vcPro == null)
@@ -365,6 +317,8 @@
public string GetProjectQtVersion(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
EnvDTE.Configuration config = null;
try {
config = project.ConfigurationManager.ActiveConfiguration;
@@ -382,13 +336,15 @@
}
if (version == null)
- version = GetSolutionQtVersion(project.DTE.Solution);
+ version = Legacy.QtVersionManager.GetSolutionQtVersion(project.DTE.Solution);
return version;
}
public string GetProjectQtVersion(EnvDTE.Project project, EnvDTE.Configuration config)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (QtProject.GetFormatVersion(project) >= Resources.qtMinFormatVersion_Settings)
return QtProject.GetPropertyValue(project, config, "QtInstall");
@@ -402,6 +358,8 @@
public string GetProjectQtVersion(EnvDTE.Project project, string platform)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (QtProject.GetFormatVersion(project) >= Resources.qtMinFormatVersion_Settings)
return GetProjectQtVersion(project);
@@ -426,29 +384,6 @@
version = Environment.GetEnvironmentVariable(env);
}
}
- }
-
- public bool SaveSolutionQtVersion(EnvDTE.Solution solution, string version)
- {
- if (!IsVersionAvailable(version) && version != "$(DefaultQtVersion)")
- return false;
- solution.Globals["Qt5Version"] = version;
- if (!solution.Globals.get_VariablePersists("Qt5Version"))
- solution.Globals.set_VariablePersists("Qt5Version", true);
- return true;
- }
-
- public string GetSolutionQtVersion(EnvDTE.Solution solution)
- {
- if (solution == null)
- return null;
-
- if (solution.Globals.get_VariableExists("Qt5Version")) {
- var version = (string)solution.Globals["Qt5Version"];
- return VerifyIfQtVersionExists(version) ? version : null;
- }
-
- return null;
}
public string GetDefaultVersion()
@@ -489,6 +424,25 @@
}
}
return VerifyIfQtVersionExists(defaultVersion) ? defaultVersion : null;
+ }
+
+ public string GetDefaultVersionString()
+ {
+ string defaultVersion = null;
+ try {
+ var key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\" + regVersionPath, false);
+ if (key != null)
+ defaultVersion = key.GetValue("DefaultQtVersion") as string;
+ } catch {
+ Messages.Print("Cannot read the default Qt version from registry.");
+ }
+
+ if (defaultVersion == null) {
+ var qtDir = Environment.GetEnvironmentVariable("QTDIR");
+ if (string.IsNullOrEmpty(qtDir))
+ return defaultVersion;
+ }
+ return defaultVersion;
}
public bool SaveDefaultVersion(string version)
@@ -540,7 +494,7 @@
}
}
- private bool VerifyIfQtVersionExists(string version)
+ internal bool VerifyIfQtVersionExists(string version)
{
if (version == "$(DefaultQtVersion)")
version = GetDefaultVersion();
--
Gitblit v1.9.1