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