From 748a921d1c8bed858b195ba34a21b46d88b53a7b Mon Sep 17 00:00:00 2001 From: MikeMaximus Date: Thu, 6 Sep 2018 12:35:14 -0600 Subject: [PATCH] Changes for issue #152 - Pass 1 --- GBM/Classes/clsBackup.vb | 2 +- GBM/Classes/clsGame.vb | 2 +- GBM/Classes/clsPathVariable.vb | 2 +- GBM/Forms/frmMain.vb | 2 +- GBM/Managers/mgrPath.vb | 137 ++++++++++++++++----------- GBM/Managers/mgrSQLite.vb | 35 +++++++ GBM/My Project/Resources.Designer.vb | 9 ++ GBM/My Project/Resources.resx | 3 + 8 files changed, 134 insertions(+), 58 deletions(-) diff --git a/GBM/Classes/clsBackup.vb b/GBM/Classes/clsBackup.vb index f790844..d353ce4 100644 --- a/GBM/Classes/clsBackup.vb +++ b/GBM/Classes/clsBackup.vb @@ -74,7 +74,7 @@ Property RestorePath As String Get - Return mgrPath.ReplaceSpecialPaths(sRestorePath) + Return Environment.ExpandEnvironmentVariables(sRestorePath) End Get Set(value As String) sRestorePath = mgrPath.ReverseSpecialPaths(value) diff --git a/GBM/Classes/clsGame.vb b/GBM/Classes/clsGame.vb index 0ea8ec7..3aecc69 100644 --- a/GBM/Classes/clsGame.vb +++ b/GBM/Classes/clsGame.vb @@ -93,7 +93,7 @@ Public Class clsGame sPath = mgrPath.ReverseSpecialPaths(value) End Set Get - Return mgrPath.ReplaceSpecialPaths(sPath) + Return Environment.ExpandEnvironmentVariables(sPath) End Get End Property diff --git a/GBM/Classes/clsPathVariable.vb b/GBM/Classes/clsPathVariable.vb index 014bcef..70319d4 100644 --- a/GBM/Classes/clsPathVariable.vb +++ b/GBM/Classes/clsPathVariable.vb @@ -24,7 +24,7 @@ ReadOnly Property FormattedName As String Get - Return "*" & sVariableName & "*" + Return "%" & sVariableName & "%" End Get End Property diff --git a/GBM/Forms/frmMain.vb b/GBM/Forms/frmMain.vb index e284f5c..05a056c 100644 --- a/GBM/Forms/frmMain.vb +++ b/GBM/Forms/frmMain.vb @@ -935,7 +935,7 @@ Public Class frmMain Dim frm As New frmVariableManager PauseScan() frm.ShowDialog() - mgrPath.CustomVariablesReload() + mgrPath.LoadCustomVariables() mgrMonitorList.SyncMonitorLists(oSettings) ResumeScan() End Sub diff --git a/GBM/Managers/mgrPath.vb b/GBM/Managers/mgrPath.vb index 9cfe373..262769a 100644 --- a/GBM/Managers/mgrPath.vb +++ b/GBM/Managers/mgrPath.vb @@ -12,10 +12,12 @@ Public Class mgrPath Private Shared sLogFile As String = sSettingsRoot & Path.DirectorySeparatorChar & "gbm_log_" & Date.Now.ToString("dd-MM-yyyy-HH-mm-ss") & ".txt" Private Shared sRemoteDatabaseLocation As String Private Shared hshCustomVariables As Hashtable + Private Shared hshUnixEnv As Hashtable Private Shared oReleaseType As ProcessorArchitecture = AssemblyName.GetAssemblyName(Application.ExecutablePath()).ProcessorArchitecture Shared Sub New() - hshCustomVariables = mgrVariables.ReadVariables + SetEnv() + LoadCustomVariables() End Sub Shared ReadOnly Property ReleaseType As Integer @@ -238,24 +240,24 @@ Public Class mgrPath Dim oMatch As Match Try - If sPath.Contains("*appdatalocal*") Then - sReplace = "*appdatalocal*" + If sPath.Contains("%LOCALAPPDATA%") Then + sReplace = "%LOCALAPPDATA%" sRegistry = File.ReadAllText(sPrefix & Path.DirectorySeparatorChar & "user.reg") oParse = New Regex("""Local AppData""="".+?(?=\n)") - ElseIf sPath.Contains("*appdataroaming*") Then - sReplace = "*appdataroaming*" + ElseIf sPath.Contains("%APPDATA%") Then + sReplace = "%APPDATA%" sRegistry = File.ReadAllText(sPrefix & Path.DirectorySeparatorChar & "user.reg") oParse = New Regex("""AppData""="".+?(?=\n)") - ElseIf sPath.Contains("*mydocs*") Then - sReplace = "*mydocs*" + ElseIf sPath.Contains("%USERDOCUMENTS%") Then + sReplace = "%USERDOCUMENTS%" sRegistry = File.ReadAllText(sPrefix & Path.DirectorySeparatorChar & "user.reg") oParse = New Regex("""Personal""="".+?(?=\n)") - ElseIf sPath.Contains("*publicdocs*") Then - sReplace = "*publicdocs*" + ElseIf sPath.Contains("%COMMONDOCUMENTS%") Then + sReplace = "%COMMONDOCUMENTS%" sRegistry = File.ReadAllText(sPrefix & Path.DirectorySeparatorChar & "system.reg") oParse = New Regex("""Common Documents""="".+?(?=\n)") - ElseIf sPath.Contains("*currentuser*") Then - sReplace = "*currentuser*" + ElseIf sPath.Contains("%USERPROFILE%") Then + sReplace = "%USERPROFILE%" sRegistry = File.ReadAllText(sPrefix & Path.DirectorySeparatorChar & "user.reg") oParse = New Regex("""Personal""="".+?(?=\\\\My Documents)") Else @@ -325,61 +327,84 @@ Public Class mgrPath Return bNoError End Function - Public Shared Function ReplaceSpecialPaths(sValue As String) As String - Dim sMyDocs As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) - Dim sPublicDocs As String = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments) - Dim sAppDataRoaming As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) - Dim sAppDataLocal As String = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) - Dim sCurrentUser As String = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) - Dim oCustomVariable As clsPathVariable - - - For Each oCustomVariable In hshCustomVariables.Values - If sValue.Contains(oCustomVariable.FormattedName) Then - Return sValue.Replace(oCustomVariable.FormattedName, oCustomVariable.Path) - End If - Next - - If sValue.Contains("*appdatalocal*") Then - Return sValue.Replace("*appdatalocal*", sAppDataLocal) - End If - - If sValue.Contains("*appdataroaming*") Then - Return sValue.Replace("*appdataroaming*", sAppDataRoaming) - End If - - 'This needs to be tested last for Unix compatability - If sValue.Contains("*mydocs*") Then - Return sValue.Replace("*mydocs*", sMyDocs) - End If - - 'Don't use these in Unix + Private Shared Sub SetEnv() If Not mgrCommon.IsUnix Then - If sValue.Contains("*publicdocs*") Then - Return sValue.Replace("*publicdocs*", sPublicDocs) + Environment.SetEnvironmentVariable("USERDOCUMENTS", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)) + Environment.SetEnvironmentVariable("COMMONDOCUMENTS", Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments)) + Else + GetUnixEnv() + Environment.SetEnvironmentVariable("USERDOCUMENTS", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)) + Environment.SetEnvironmentVariable("APPDATA", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + Environment.SetEnvironmentVariable("LOCALAPPDATA", Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)) + End If + + End Sub + + Private Shared Sub GetUnixEnv() + Dim prEnv As Process + Dim sEnv As String() + + Try + hshUnixEnv = New Hashtable + prEnv = New Process + prEnv.StartInfo.FileName = "/usr/bin/env" + prEnv.StartInfo.UseShellExecute = False + prEnv.StartInfo.RedirectStandardOutput = True + prEnv.StartInfo.CreateNoWindow = True + prEnv.Start() + + Using swEnv As StreamReader = prEnv.StandardOutput + While Not swEnv.EndOfStream + sEnv = swEnv.ReadLine().Split("=") + If Not hshUnixEnv.Contains(sEnv(0)) Then + hshUnixEnv.Add(sEnv(0), sEnv(1)) + End If + End While + End Using + Catch ex As Exception + mgrCommon.ShowMessage(mgrPath_ErrorUnixEnv, ex.Message, MsgBoxStyle.Exclamation) + End Try + End Sub + + Private Shared Function ProcessEnvironmentVariables(ByVal sValue As String) As String + Dim sUnixShortHome As String = "~" + Dim sEnvUnixHome As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + Dim sCurrentUnixVar As String + + If mgrCommon.IsUnix Then + 'Replace ~ for HOME + If sValue.Contains(sUnixShortHome) Then + Return sValue.Replace(sUnixShortHome, sEnvUnixHome) End If - If sValue.Contains("*currentuser*") Then - Return sValue.Replace("*currentuser*", sCurrentUser) - End If + 'Replace any other environemnt variable + For Each de As DictionaryEntry In hshUnixEnv + sCurrentUnixVar = "$" & de.Key + If sValue.Contains(sCurrentUnixVar) Then + sValue = sValue.Replace(sCurrentUnixVar, de.Value) + End If + Next + Else + sValue = Environment.ExpandEnvironmentVariables(sValue) End If Return sValue End Function Public Shared Function ReverseSpecialPaths(sValue As String) As String - Dim sMyDocs As String = "*mydocs*" + Dim sMyDocs As String = "%USERDOCUMENTS%" Dim sEnvMyDocs As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) - Dim sPublicDocs As String = "*publicdocs*" + Dim sPublicDocs As String = "%COMMONDOCUMENTS%" Dim sEnvPublicDocs As String = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments) - Dim sAppDataLocal As String = "*appdatalocal*" + Dim sAppDataLocal As String = "%LOCALAPPDATA%" Dim sEnvAppDataLocal As String = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) - Dim sAppDataRoaming As String = "*appdataroaming*" + Dim sAppDataRoaming As String = "%APPDATA%" Dim sEnvAppDataRoaming As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) - Dim sCurrentUser As String = "*currentuser*" + Dim sCurrentUser As String = "%USERPROFILE%" Dim sEnvCurrentUser As String = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) Dim oCustomVariable As clsPathVariable + sValue = ProcessEnvironmentVariables(sValue) For Each oCustomVariable In hshCustomVariables.Values If sValue.Contains(oCustomVariable.Path) Then @@ -400,7 +425,7 @@ Public Class mgrPath Return sValue.Replace(sEnvMyDocs, sMyDocs) End If - 'Don't use these in Unix + 'Mono doesn't set a path for these folders If Not mgrCommon.IsUnix Then If sValue.Contains(sEnvPublicDocs) Then Return sValue.Replace(sEnvPublicDocs, sPublicDocs) @@ -447,7 +472,7 @@ Public Class mgrPath Public Shared Function VerifyCustomVariables(ByVal hshScanlist As Hashtable, ByRef sGames As String) As Boolean Dim hshCustomVariables As Hashtable = mgrVariables.ReadVariables Dim sVariableCheck As String - Dim sPattern As String = "\*(.*)\*" + Dim sPattern As String = "\%(.*)\%" Dim oGame As clsGame Dim oMatch As Match Dim bClean As Boolean = True @@ -455,7 +480,7 @@ Public Class mgrPath For Each oGame In hshScanlist.Values oMatch = Regex.Match(oGame.Path, sPattern) If oMatch.Success Then - sVariableCheck = oMatch.Value.Replace("*", String.Empty) + sVariableCheck = oMatch.Value.Replace("%", String.Empty) If Not hshCustomVariables.ContainsKey(sVariableCheck) Then sGames &= vbCrLf & oGame.Name & " (" & sVariableCheck & ")" bClean = False @@ -466,8 +491,12 @@ Public Class mgrPath Return bClean End Function - Public Shared Sub CustomVariablesReload() + Public Shared Sub LoadCustomVariables() hshCustomVariables = mgrVariables.ReadVariables + + For Each oVariable As clsPathVariable In hshCustomVariables.Values + Environment.SetEnvironmentVariable(oVariable.Name, oVariable.Path) + Next End Sub Public Shared Function SetManualGamePath() As String diff --git a/GBM/Managers/mgrSQLite.vb b/GBM/Managers/mgrSQLite.vb index 17d9b66..0431200 100644 --- a/GBM/Managers/mgrSQLite.vb +++ b/GBM/Managers/mgrSQLite.vb @@ -848,6 +848,41 @@ Public Class mgrSQLite CompactDatabase() End If End If + + '1.15 Upgrade + If GetDatabaseVersion() < 115 Then + If eDatabase = Database.Local Then + 'Backup DB before starting + BackupDB("v110") + + sSQL = "PRAGMA user_version=115" + + RunParamQuery(sSQL, New Hashtable) + End If + If eDatabase = Database.Remote Then + 'Backup DB before starting + BackupDB("v110") + + 'Convert core path variables to new standard + sSQL = "UPDATE monitorlist SET Path = Replace(Path,'*appdatalocal*','%LOCALAPPDATA%');" + sSQL &= "UPDATE monitorlist SET Path = Replace(Path,'*appdataroaming*','%APPDATA%');" + sSQL &= "UPDATE monitorlist SET Path = Replace(Path,'*mydocs*','%USERDOCUMENTS%');" + sSQL &= "UPDATE monitorlist SET Path = Replace(Path,'*currentuser*','%USERPROFILE%');" + sSQL &= "UPDATE monitorlist SET Path = Replace(Path,'*publicdocs*','%COMMONDOCUMENTS%');" + + 'Convert custom variables to new standard + Dim hshVariables As Hashtable = mgrVariables.ReadVariables() + Dim sOldVariable As String + For Each oVariable As clsPathVariable In hshVariables.Values + sOldVariable = "*" & oVariable.Name & "*" + sSQL &= "UPDATE monitorlist SET Path = Replace(Path,'" & sOldVariable & "','" & oVariable.FormattedName & "');" + Next + + sSQL &= "PRAGMA user_version=115" + + RunParamQuery(sSQL, New Hashtable) + End If + End If End Sub Public Function GetDBSize() As Long diff --git a/GBM/My Project/Resources.Designer.vb b/GBM/My Project/Resources.Designer.vb index 504fcd7..4ce4134 100644 --- a/GBM/My Project/Resources.Designer.vb +++ b/GBM/My Project/Resources.Designer.vb @@ -6123,6 +6123,15 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to An error occured while building a list of environment variables.[BR][BR][PARAM]. + ''' + Friend ReadOnly Property mgrPath_ErrorUnixEnv() As String + Get + Return ResourceManager.GetString("mgrPath_ErrorUnixEnv", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to An error occured when determining a Wine prefix.[BR][BR][PARAM]. ''' diff --git a/GBM/My Project/Resources.resx b/GBM/My Project/Resources.resx index 056b5e8..65d3277 100644 --- a/GBM/My Project/Resources.resx +++ b/GBM/My Project/Resources.resx @@ -2218,4 +2218,7 @@ An error occured when determining a Wine prefix.[BR][BR][PARAM] + + An error occured while building a list of environment variables.[BR][BR][PARAM] + \ No newline at end of file