diff --git a/GBM/Classes/XML Serialize Classes/Game.vb b/GBM/Classes/XML Serialize Classes/Game.vb index 8c474ba..9ecadc8 100644 --- a/GBM/Classes/XML Serialize Classes/Game.vb +++ b/GBM/Classes/XML Serialize Classes/Game.vb @@ -1,6 +1,7 @@ Public Class Game Private sGameName As String Private sProcessName As String + Private sParameter As String Private sPath As String Private bAbsolutePath As Boolean Private bFolderSave As Boolean @@ -26,6 +27,15 @@ End Get End Property + Property Parameter As String + Set(value As String) + sParameter = value + End Set + Get + Return sParameter + End Get + End Property + Property Path As String Set(value As String) sPath = value diff --git a/GBM/Classes/clsGame.vb b/GBM/Classes/clsGame.vb index 43ce188..a01573b 100644 --- a/GBM/Classes/clsGame.vb +++ b/GBM/Classes/clsGame.vb @@ -2,6 +2,7 @@ Private sGameID As String = Guid.NewGuid.ToString Private sGameName As String = String.Empty Private sProcessName As String = String.Empty + Private sParameter As String = String.Empty Private sPath As String = String.Empty Private bAbsolutePath As Boolean = False Private bFolderSave As Boolean = False @@ -74,6 +75,15 @@ End Get End Property + Property Parameter As String + Set(value As String) + sParameter = value + End Set + Get + Return sParameter + End Get + End Property + Property Path As String Set(value As String) sPath = mgrPath.ReverseSpecialPaths(value) @@ -263,6 +273,9 @@ If ProcessName <> oGame.ProcessName Then Return False End If + If Parameter <> oGame.Parameter Then + Return False + End If If Path <> oGame.Path Then Return False End If diff --git a/GBM/Forms/frmChooseGame.vb b/GBM/Forms/frmChooseGame.vb index f79125e..a0690dc 100644 --- a/GBM/Forms/frmChooseGame.vb +++ b/GBM/Forms/frmChooseGame.vb @@ -30,8 +30,10 @@ Public Class frmChooseGame lstGameBox.DisplayMember = "Value" For Each o As clsGame In Process.DuplicateList - lstGameBox.Items.Add(New KeyValuePair(Of String, String)(o.ID, o.Name)) - oGamesHash.Add(o.ID, o) + If o.Parameter = String.Empty Then + lstGameBox.Items.Add(New KeyValuePair(Of String, String)(o.ID, o.Name)) + oGamesHash.Add(o.ID, o) + End If Next lstGameBox.SelectedIndex = 0 diff --git a/GBM/Forms/frmGameManager.Designer.vb b/GBM/Forms/frmGameManager.Designer.vb index 8ed79ed..b1316a0 100644 --- a/GBM/Forms/frmGameManager.Designer.vb +++ b/GBM/Forms/frmGameManager.Designer.vb @@ -28,6 +28,8 @@ Partial Class frmGameManager Me.btnBackup = New System.Windows.Forms.Button() Me.btnClose = New System.Windows.Forms.Button() Me.grpConfig = New System.Windows.Forms.GroupBox() + Me.txtParameter = New System.Windows.Forms.TextBox() + Me.lblParameter = New System.Windows.Forms.Label() Me.chkCleanFolder = New System.Windows.Forms.CheckBox() Me.lblLimit = New System.Windows.Forms.Label() Me.nudLimit = New System.Windows.Forms.NumericUpDown() @@ -152,6 +154,8 @@ Partial Class frmGameManager 'grpConfig ' Me.grpConfig.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.grpConfig.Controls.Add(Me.txtParameter) + Me.grpConfig.Controls.Add(Me.lblParameter) Me.grpConfig.Controls.Add(Me.chkCleanFolder) Me.grpConfig.Controls.Add(Me.lblLimit) Me.grpConfig.Controls.Add(Me.nudLimit) @@ -178,13 +182,29 @@ Partial Class frmGameManager Me.grpConfig.TabStop = False Me.grpConfig.Text = "Configuration" ' + 'txtParameter + ' + Me.txtParameter.Location = New System.Drawing.Point(333, 45) + Me.txtParameter.Name = "txtParameter" + Me.txtParameter.Size = New System.Drawing.Size(150, 20) + Me.txtParameter.TabIndex = 7 + ' + 'lblParameter + ' + Me.lblParameter.AutoSize = True + Me.lblParameter.Location = New System.Drawing.Point(269, 48) + Me.lblParameter.Name = "lblParameter" + Me.lblParameter.Size = New System.Drawing.Size(58, 13) + Me.lblParameter.TabIndex = 6 + Me.lblParameter.Text = "Parameter:" + ' 'chkCleanFolder ' Me.chkCleanFolder.AutoSize = True Me.chkCleanFolder.Location = New System.Drawing.Point(329, 101) Me.chkCleanFolder.Name = "chkCleanFolder" Me.chkCleanFolder.Size = New System.Drawing.Size(136, 17) - Me.chkCleanFolder.TabIndex = 11 + Me.chkCleanFolder.TabIndex = 13 Me.chkCleanFolder.Text = "Delete folder on restore" Me.chkCleanFolder.UseVisualStyleBackColor = True ' @@ -194,7 +214,7 @@ Partial Class frmGameManager Me.lblLimit.Location = New System.Drawing.Point(375, 130) Me.lblLimit.Name = "lblLimit" Me.lblLimit.Size = New System.Drawing.Size(68, 13) - Me.lblLimit.TabIndex = 14 + Me.lblLimit.TabIndex = 16 Me.lblLimit.Text = "Backup Limit" Me.lblLimit.Visible = False ' @@ -204,7 +224,7 @@ Partial Class frmGameManager Me.nudLimit.Minimum = New Decimal(New Integer() {2, 0, 0, 0}) Me.nudLimit.Name = "nudLimit" Me.nudLimit.Size = New System.Drawing.Size(40, 20) - Me.nudLimit.TabIndex = 13 + Me.nudLimit.TabIndex = 15 Me.nudLimit.Value = New Decimal(New Integer() {2, 0, 0, 0}) Me.nudLimit.Visible = False ' @@ -213,7 +233,7 @@ Partial Class frmGameManager Me.btnExclude.Location = New System.Drawing.Point(9, 125) Me.btnExclude.Name = "btnExclude" Me.btnExclude.Size = New System.Drawing.Size(175, 23) - Me.btnExclude.TabIndex = 9 + Me.btnExclude.TabIndex = 11 Me.btnExclude.Text = "E&xclude Items..." Me.btnExclude.UseVisualStyleBackColor = True ' @@ -222,7 +242,7 @@ Partial Class frmGameManager Me.btnInclude.Location = New System.Drawing.Point(9, 97) Me.btnInclude.Name = "btnInclude" Me.btnInclude.Size = New System.Drawing.Size(175, 23) - Me.btnInclude.TabIndex = 8 + Me.btnInclude.TabIndex = 10 Me.btnInclude.Text = "In&clude Items..." Me.btnInclude.UseVisualStyleBackColor = True ' @@ -241,13 +261,13 @@ Partial Class frmGameManager Me.btnSavePathBrowse.Location = New System.Drawing.Point(489, 71) Me.btnSavePathBrowse.Name = "btnSavePathBrowse" Me.btnSavePathBrowse.Size = New System.Drawing.Size(30, 20) - Me.btnSavePathBrowse.TabIndex = 7 + Me.btnSavePathBrowse.TabIndex = 9 Me.btnSavePathBrowse.Text = "..." Me.btnSavePathBrowse.UseVisualStyleBackColor = True ' 'btnProcessBrowse ' - Me.btnProcessBrowse.Location = New System.Drawing.Point(489, 45) + Me.btnProcessBrowse.Location = New System.Drawing.Point(225, 44) Me.btnProcessBrowse.Name = "btnProcessBrowse" Me.btnProcessBrowse.Size = New System.Drawing.Size(30, 20) Me.btnProcessBrowse.TabIndex = 5 @@ -305,7 +325,7 @@ Partial Class frmGameManager Me.chkTimeStamp.Location = New System.Drawing.Point(190, 129) Me.chkTimeStamp.Name = "chkTimeStamp" Me.chkTimeStamp.Size = New System.Drawing.Size(133, 17) - Me.chkTimeStamp.TabIndex = 12 + Me.chkTimeStamp.TabIndex = 14 Me.chkTimeStamp.Text = "Save multiple backups" Me.chkTimeStamp.UseVisualStyleBackColor = True ' @@ -315,7 +335,7 @@ Partial Class frmGameManager Me.chkFolderSave.Location = New System.Drawing.Point(190, 101) Me.chkFolderSave.Name = "chkFolderSave" Me.chkFolderSave.Size = New System.Drawing.Size(109, 17) - Me.chkFolderSave.TabIndex = 10 + Me.chkFolderSave.TabIndex = 12 Me.chkFolderSave.Text = "Save entire folder" Me.chkFolderSave.UseVisualStyleBackColor = True ' @@ -324,13 +344,13 @@ Partial Class frmGameManager Me.txtSavePath.Location = New System.Drawing.Point(69, 71) Me.txtSavePath.Name = "txtSavePath" Me.txtSavePath.Size = New System.Drawing.Size(414, 20) - Me.txtSavePath.TabIndex = 6 + Me.txtSavePath.TabIndex = 8 ' 'txtProcess ' Me.txtProcess.Location = New System.Drawing.Point(69, 45) Me.txtProcess.Name = "txtProcess" - Me.txtProcess.Size = New System.Drawing.Size(414, 20) + Me.txtProcess.Size = New System.Drawing.Size(150, 20) Me.txtProcess.TabIndex = 4 ' 'txtName @@ -941,4 +961,6 @@ Partial Class frmGameManager Friend WithEvents cmsDeleteOne As ToolStripMenuItem Friend WithEvents cmsDeleteAll As ToolStripMenuItem Friend WithEvents chkCleanFolder As CheckBox + Friend WithEvents txtParameter As TextBox + Friend WithEvents lblParameter As Label End Class diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index 125bfc4..c6d473f 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -737,6 +737,7 @@ Public Class frmGameManager txtID.Text = oApp.ID txtName.Text = oApp.Name txtProcess.Text = oApp.TrueProcess + txtParameter.Text = oApp.Parameter txtSavePath.Text = oApp.Path txtFileType.Text = oApp.FileType txtExclude.Text = oApp.ExcludeList @@ -1126,6 +1127,7 @@ Public Class frmGameManager Else oApp.ProcessName = txtProcess.Text End If + oApp.Parameter = txtParameter.Text oApp.Path = txtSavePath.Text 'Only do a simple root check here in case the user doesn't really understand creating a proper configuration oApp.AbsolutePath = Path.IsPathRooted(txtSavePath.Text) @@ -1257,6 +1259,13 @@ Public Class frmGameManager Return False End If + If oApp.Parameter <> String.Empty Then + If mgrMonitorList.DoDuplicateParameterCheck(oApp.ProcessName, oApp.Parameter, , oApp.ID) Then + mgrCommon.ShowMessage(frmGameManager_ErrorProcessParameterDupe, MsgBoxStyle.Exclamation) + Return False + End If + End If + Return True End Function @@ -1489,6 +1498,7 @@ Public Class frmGameManager btnProcessBrowse.Text = frmGameManager_btnProcessBrowse lblSavePath.Text = frmGameManager_lblSavePath lblProcess.Text = frmGameManager_lblProcess + lblParameter.Text = frmGameManager_lblParameter lblName.Text = frmGameManager_lblName chkTimeStamp.Text = frmGameManager_chkTimeStamp chkFolderSave.Text = frmGameManager_chkFolderSave diff --git a/GBM/Forms/frmMain.Designer.vb b/GBM/Forms/frmMain.Designer.vb index 29ee4b0..8ba204b 100644 --- a/GBM/Forms/frmMain.Designer.vb +++ b/GBM/Forms/frmMain.Designer.vb @@ -75,7 +75,6 @@ Partial Class frmMain Me.gMonHelpAbout = New System.Windows.Forms.ToolStripMenuItem() Me.gMonNotification = New System.Windows.Forms.ToolStripMenuItem() Me.pbIcon = New System.Windows.Forms.PictureBox() - Me.btnLogToggle = New System.Windows.Forms.Button() Me.lblGameTitle = New System.Windows.Forms.Label() Me.lblLastAction = New System.Windows.Forms.Label() Me.lblLastActionTitle = New System.Windows.Forms.Label() @@ -222,6 +221,9 @@ Partial Class frmMain ' 'txtLog ' + Me.txtLog.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ + Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.txtLog.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) Me.txtLog.Location = New System.Drawing.Point(12, 184) Me.txtLog.MaxLength = 524288 @@ -430,17 +432,11 @@ Partial Class frmMain Me.pbIcon.TabIndex = 9 Me.pbIcon.TabStop = False ' - 'btnLogToggle - ' - Me.btnLogToggle.Location = New System.Drawing.Point(437, 155) - Me.btnLogToggle.Name = "btnLogToggle" - Me.btnLogToggle.Size = New System.Drawing.Size(75, 23) - Me.btnLogToggle.TabIndex = 7 - Me.btnLogToggle.Text = "Show &Log" - Me.btnLogToggle.UseVisualStyleBackColor = True - ' 'lblGameTitle ' + Me.lblGameTitle.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.lblGameTitle.AutoEllipsis = True Me.lblGameTitle.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) Me.lblGameTitle.Location = New System.Drawing.Point(66, 36) Me.lblGameTitle.Name = "lblGameTitle" @@ -450,6 +446,8 @@ Partial Class frmMain ' 'lblLastAction ' + Me.lblLastAction.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.lblLastAction.AutoEllipsis = True Me.lblLastAction.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) Me.lblLastAction.Location = New System.Drawing.Point(12, 165) @@ -480,7 +478,8 @@ Partial Class frmMain ' 'btnCancelOperation ' - Me.btnCancelOperation.Location = New System.Drawing.Point(437, 126) + Me.btnCancelOperation.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.btnCancelOperation.Location = New System.Drawing.Point(437, 155) Me.btnCancelOperation.Name = "btnCancelOperation" Me.btnCancelOperation.Size = New System.Drawing.Size(75, 23) Me.btnCancelOperation.TabIndex = 6 @@ -489,6 +488,8 @@ Partial Class frmMain ' 'lblStatus1 ' + Me.lblStatus1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.lblStatus1.AutoEllipsis = True Me.lblStatus1.Location = New System.Drawing.Point(66, 58) Me.lblStatus1.Name = "lblStatus1" @@ -497,6 +498,8 @@ Partial Class frmMain ' 'lblStatus2 ' + Me.lblStatus2.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.lblStatus2.AutoEllipsis = True Me.lblStatus2.Location = New System.Drawing.Point(66, 74) Me.lblStatus2.Name = "lblStatus2" @@ -505,6 +508,8 @@ Partial Class frmMain ' 'lblStatus3 ' + Me.lblStatus3.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.lblStatus3.AutoEllipsis = True Me.lblStatus3.Location = New System.Drawing.Point(66, 90) Me.lblStatus3.Name = "lblStatus3" @@ -523,7 +528,6 @@ Partial Class frmMain ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.AutoSize = True Me.ClientSize = New System.Drawing.Size(524, 401) Me.Controls.Add(Me.pbTime) Me.Controls.Add(Me.lblStatus3) @@ -534,16 +538,13 @@ Partial Class frmMain Me.Controls.Add(Me.lblLastActionTitle) Me.Controls.Add(Me.lblLastAction) Me.Controls.Add(Me.lblGameTitle) - Me.Controls.Add(Me.btnLogToggle) Me.Controls.Add(Me.pbIcon) Me.Controls.Add(Me.gMonStatusStrip) Me.Controls.Add(Me.gMonMainMenu) Me.Controls.Add(Me.txtLog) - Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) Me.KeyPreview = True Me.MainMenuStrip = Me.gMonMainMenu - Me.MaximizeBox = False Me.MinimizeBox = False Me.Name = "frmMain" Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide @@ -586,7 +587,6 @@ Partial Class frmMain Friend WithEvents gMonTraySetupGameManager As System.Windows.Forms.ToolStripMenuItem Friend WithEvents gMonTraySetupCustomVariables As System.Windows.Forms.ToolStripMenuItem Friend WithEvents pbIcon As System.Windows.Forms.PictureBox - Friend WithEvents btnLogToggle As System.Windows.Forms.Button Friend WithEvents lblGameTitle As System.Windows.Forms.Label Friend WithEvents lblLastAction As System.Windows.Forms.Label Friend WithEvents lblLastActionTitle As System.Windows.Forms.Label diff --git a/GBM/Forms/frmMain.vb b/GBM/Forms/frmMain.vb index b21e742..baaaa80 100644 --- a/GBM/Forms/frmMain.vb +++ b/GBM/Forms/frmMain.vb @@ -39,8 +39,6 @@ Public Class frmMain Private sPriorPath As String Private sPriorCompany As String Private sPriorVersion As String - Private iFormHeight As Integer - Private iLogSpacer As Integer Private iRestoreTimeOut As Integer 'Developer Debug Flags @@ -75,7 +73,7 @@ Public Class frmMain Me.Invoke(d, New Object() {sMessage}) Else Dim sPattern As String = "h:mm tt" - lblLastActionTitle.Visible = True + lblLastActionTitle.Visible = True lblLastAction.Text = sMessage.TrimEnd(".") & " " & mgrCommon.FormatString(frmMain_AtTime, TimeOfDay.ToString(sPattern)) End If End Sub @@ -161,7 +159,7 @@ Public Class frmMain OperationEnded() End Sub - Private Sub ExecuteRestore(ByVal oRestoreList As List(Of clsBackup)) + Private Sub ExecuteRestore(ByVal oRestoreList As List(Of clsBackup)) oRestore.DoRestore(oRestoreList) OperationEnded() End Sub @@ -322,7 +320,7 @@ Public Class frmMain End If If bDoBackup Then - If Not oBackup.CheckBackupPrereq(oProcess.GameInfo) Then + If Not oBackup.CheckBackupPrereq(oProcess.GameInfo) Then SetLastAction(mgrCommon.FormatString(frmMain_ErrorBackupCancel, oProcess.GameInfo.CroppedName)) OperationEnded() Else @@ -331,7 +329,7 @@ Public Class frmMain Dim trd As New System.Threading.Thread(AddressOf ExecuteBackup) trd.IsBackground = True trd.Start(oReadyList) - End If + End If End If End Sub @@ -477,8 +475,8 @@ Public Class frmMain End If RunRestore(hshRestore) - End If End If + End If 'Shutdown if we are finished If bFinished Then @@ -534,7 +532,7 @@ Public Class frmMain Private Sub ResetGameInfo(Optional ByVal bKeepInfo As Boolean = False) If bKeepInfo And Not oProcess.GameInfo Is Nothing Then - lblGameTitle.Text = mgrCommon.FormatString(frmMain_LastGame, oProcess.GameInfo.CroppedName) + lblGameTitle.Text = mgrCommon.FormatString(frmMain_LastGame, oProcess.GameInfo.Name) pbIcon.Image = oPriorImage lblStatus1.Text = sPriorPath lblStatus2.Text = sPriorCompany @@ -599,7 +597,7 @@ Public Class frmMain Else bAllowIcon = True bAllowDetails = True - lblGameTitle.Text = oProcess.GameInfo.CroppedName + lblGameTitle.Text = oProcess.GameInfo.Name Try Dim ic As Icon = System.Drawing.Icon.ExtractAssociatedIcon(oProcess.FoundProcess.MainModule.FileName) @@ -817,9 +815,11 @@ Public Class frmMain Dim sVersion As String = My.Application.Info.Version.Major & "." & My.Application.Info.Version.Minor & "." & My.Application.Info.Version.Build Dim sProcessType = [Enum].GetName(GetType(System.Reflection.ProcessorArchitecture), iProcessType) Dim sRevision As String = My.Application.Info.Version.Revision + Dim oDatabase As New mgrSQLite(mgrSQLite.Database.Local) + Dim sSqliteVersion As String = oDatabase.ReportVersion Dim sConstCopyright As String = Chr(169) & mgrCommon.FormatString(App_Copyright, Now.Year.ToString) - mgrCommon.ShowMessage(frmMain_About, New String() {sVersion, sProcessType, sRevision, sConstCopyright}, MsgBoxStyle.Information) + mgrCommon.ShowMessage(frmMain_About, New String() {sVersion, sProcessType, sRevision, sSqliteVersion, sConstCopyright}, MsgBoxStyle.Information) End Sub Private Sub OpenTags() @@ -1027,22 +1027,6 @@ Public Class frmMain End Sub 'Functions that handle buttons, menus and other GUI features on this form - Private Sub ToggleLog() - If bLogToggle = False Then - txtLog.Visible = True - Me.Size = New System.Drawing.Size(Me.Size.Width, iFormHeight) - bLogToggle = True - btnLogToggle.Text = frmMain_btnToggleLog_Hide - txtLog.Select(txtLog.TextLength, 0) - txtLog.ScrollToCaret() - Else - txtLog.Visible = False - Me.Size = New System.Drawing.Size(Me.Size.Width, Me.Size.Height - (txtLog.Height + iLogSpacer)) - bLogToggle = False - btnLogToggle.Text = frmMain_btnToggleLog_Show - End If - End Sub - Private Sub ToggleState() 'Toggle State with Tray Clicks If Not bShowToggle Then @@ -1257,8 +1241,8 @@ Public Class frmMain End Sub Private Sub SetForm() - 'Disable Autosize in Linux (Mono prevents manual resizing when this is enabled) - If mgrCommon.IsUnix Then Me.AutoSize = False + 'Set Minimum Size + Me.MinimumSize = New Size(Me.Size.Width, Me.Size.Height - txtLog.Size.Height) 'Set Form Name Me.Name = App_NameLong @@ -1317,14 +1301,10 @@ Public Class frmMain gMonStripAdminButton.ToolTipText = frmMain_RunningAsNormal End If btnCancelOperation.Visible = False - txtLog.Visible = False lblLastActionTitle.Visible = False lblLastAction.Text = String.Empty pbTime.SizeMode = PictureBoxSizeMode.AutoSize pbTime.Image = Icon_Clock - iFormHeight = Me.Size.Height - iLogSpacer = gMonStatusStrip.Location.Y - (txtLog.Location.Y + txtLog.Height) - Me.Size = New System.Drawing.Size(Me.Size.Width, Me.Size.Height - (txtLog.Height + iLogSpacer)) AddHandler mgrMonitorList.UpdateLog, AddressOf UpdateLog ResetGameInfo() End Sub @@ -1470,9 +1450,20 @@ Public Class frmMain End Function + Private Function CheckForParametersDuplicate() As Boolean + For Each o As clsGame In oProcess.DuplicateList + If o.Parameter <> String.Empty And oProcess.FullCommand.Contains(o.Parameter) Then + oProcess.GameInfo = o + oProcess.Duplicate = False + Return True + End If + Next + Return False + End Function + Private Sub CheckForSavedDuplicate() For Each o As clsGame In oProcess.DuplicateList - If o.ProcessPath.ToLower = oProcess.GameInfo.ProcessPath.ToLower Then + If o.ProcessPath.ToLower = oProcess.GameInfo.ProcessPath.ToLower And o.Parameter = String.Empty Then oProcess.GameInfo = o oProcess.Duplicate = False End If @@ -1631,10 +1622,6 @@ Public Class frmMain OpenGameManager(True) End Sub - Private Sub btnLogToggle_Click(sender As Object, e As EventArgs) Handles btnLogToggle.Click - ToggleLog() - End Sub - Private Sub gMonStripSplitStatusButton_ButtonClick(sender As Object, e As EventArgs) Handles gMonStripStatusButton.Click ScanToggle() End Sub @@ -1725,20 +1712,20 @@ Public Class frmMain End If If bContinue = True Then - CheckForSavedDuplicate() + If Not CheckForParametersDuplicate() Then CheckForSavedDuplicate() If oProcess.Duplicate Then - UpdateLog(frmMain_MultipleGamesDetected, oSettings.ShowDetectionToolTips) - UpdateStatus(frmMain_MultipleGamesDetected) - SetGameInfo(True) + UpdateLog(frmMain_MultipleGamesDetected, oSettings.ShowDetectionToolTips) + UpdateStatus(frmMain_MultipleGamesDetected) + SetGameInfo(True) + Else + UpdateLog(mgrCommon.FormatString(frmMain_GameDetected, oProcess.GameInfo.Name), oSettings.ShowDetectionToolTips) + UpdateStatus(mgrCommon.FormatString(frmMain_GameDetected, oProcess.GameInfo.CroppedName)) + SetGameInfo() + End If + oProcess.StartTime = Now + bwMonitor.RunWorkerAsync() Else - UpdateLog(mgrCommon.FormatString(frmMain_GameDetected, oProcess.GameInfo.Name), oSettings.ShowDetectionToolTips) - UpdateStatus(mgrCommon.FormatString(frmMain_GameDetected, oProcess.GameInfo.CroppedName)) - SetGameInfo() - End If - oProcess.StartTime = Now - bwMonitor.RunWorkerAsync() - Else - StopScan() + StopScan() End If End If End Sub @@ -1850,14 +1837,18 @@ Public Class frmMain End If End Sub - Private Sub txtGameInfo_Enter(sender As Object, e As EventArgs) - btnLogToggle.Focus() - End Sub - Private Sub frmMain_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown If e.KeyCode = Keys.Oemtilde AndAlso e.Modifiers = Keys.Control Then OpenDevConsole() End If End Sub + 'This event handler lets the user clear focus from the log by clicking anywhere on the form. + 'Due to txtLog being the only focusable control in most cases, it's impossible for it to lose focus unless a change is forced. + Private Sub ClearLogFocus(sender As Object, e As EventArgs) Handles MyBase.Click, lblGameTitle.Click, lblStatus1.Click, lblStatus2.Click, + lblStatus3.Click, pbTime.Click, lblTimeSpent.Click, lblLastActionTitle.Click, lblLastAction.Click, gMonMainMenu.Click, gMonStatusStrip.Click + 'Move focus to first label + lblGameTitle.Focus() + End Sub + End Class \ No newline at end of file diff --git a/GBM/Game Backup Monitor.vbproj b/GBM/Game Backup Monitor.vbproj index 0f8aa1c..0267ad9 100644 --- a/GBM/Game Backup Monitor.vbproj +++ b/GBM/Game Backup Monitor.vbproj @@ -106,6 +106,7 @@ + @@ -346,6 +347,7 @@ PreserveNewest + @@ -358,7 +360,6 @@ - diff --git a/GBM/Managers/mgrMonitorList.vb b/GBM/Managers/mgrMonitorList.vb index 5421043..3dd8a4b 100644 --- a/GBM/Managers/mgrMonitorList.vb +++ b/GBM/Managers/mgrMonitorList.vb @@ -31,6 +31,7 @@ Public Class mgrMonitorList oGame.MonitorOnly = CBool(dr("MonitorOnly")) oGame.BackupLimit = CInt(dr("BackupLimit")) oGame.CleanFolder = CBool(dr("CleanFolder")) + If Not IsDBNull(dr("Parameter")) Then oGame.Parameter = CStr(dr("Parameter")) Return oGame End Function @@ -56,6 +57,7 @@ Public Class mgrMonitorList hshParams.Add("MonitorOnly", oGame.MonitorOnly) hshParams.Add("BackupLimit", oGame.BackupLimit) hshParams.Add("CleanFolder", oGame.CleanFolder) + hshParams.Add("Parameter", oGame.Parameter) Return hshParams End Function @@ -96,7 +98,7 @@ Public Class mgrMonitorList Dim hshParams As Hashtable sSQL = "INSERT INTO monitorlist VALUES (@ID, @Name, @Process, @Path, @AbsolutePath, @FolderSave, @FileType, @TimeStamp, " - sSQL &= "@ExcludeList, @ProcessPath, @Icon, @Hours, @Version, @Company, @Enabled, @MonitorOnly, @BackupLimit, @CleanFolder)" + sSQL &= "@ExcludeList, @ProcessPath, @Icon, @Hours, @Version, @Company, @Enabled, @MonitorOnly, @BackupLimit, @CleanFolder, @Parameter)" 'Parameters hshParams = SetCoreParameters(oGame) @@ -112,7 +114,7 @@ Public Class mgrMonitorList sSQL = "UPDATE monitorlist SET Name=@Name, Process=@Process, Path=@Path, AbsolutePath=@AbsolutePath, FolderSave=@FolderSave, " sSQL &= "FileType=@FileType, TimeStamp=@TimeStamp, ExcludeList=@ExcludeList, ProcessPath=@ProcessPath, Icon=@Icon, " - sSQL &= "Hours=@Hours, Version=@Version, Company=@Company, Enabled=@Enabled, MonitorOnly=@MonitorOnly, BackupLimit=@BackupLimit, CleanFolder=@CleanFolder WHERE MonitorID=@ID" + sSQL &= "Hours=@Hours, Version=@Version, Company=@Company, Enabled=@Enabled, MonitorOnly=@MonitorOnly, BackupLimit=@BackupLimit, CleanFolder=@CleanFolder, Parameter=@Parameter WHERE MonitorID=@ID" 'Parameters hshParams = SetCoreParameters(oGame) @@ -266,6 +268,31 @@ Public Class mgrMonitorList End If End Function + Public Shared Function DoDuplicateParameterCheck(ByVal sProcess As String, ByVal sParameter As String, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local, Optional ByVal sExcludeID As String = "") As Boolean + Dim oDatabase As New mgrSQLite(iSelectDB) + Dim sSQL As String + Dim oData As DataSet + Dim hshParams As New Hashtable + + sSQL = "SELECT * FROM monitorlist WHERE Process = @Process AND Parameter = @Parameter" + + hshParams.Add("Process", sProcess) + hshParams.Add("Parameter", sParameter) + + If sExcludeID <> String.Empty Then + sSQL &= " AND MonitorID <> @MonitorID" + hshParams.Add("MonitorID", sExcludeID) + End If + + oData = oDatabase.ReadParamData(sSQL, hshParams) + + If oData.Tables(0).Rows.Count > 0 Then + Return True + Else + Return False + End If + End Function + 'Sync Functions Public Shared Sub DoListAddUpdateSync(ByVal hshGames As Hashtable, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local, Optional ByVal eSyncFields As clsGame.eOptionalSyncFields = clsGame.eOptionalSyncFields.None) @@ -317,11 +344,11 @@ Public Class mgrMonitorList sVersion = "(SELECT Version FROM monitorlist WHERE MonitorID=@ID)" End If - sSQL = "INSERT OR REPLACE INTO monitorlist (MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder) " + sSQL = "INSERT OR REPLACE INTO monitorlist (MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter) " sSQL &= "VALUES (@ID, @Name, @Process, @Path, @AbsolutePath, @FolderSave, @FileType, " sSQL &= sTimeStamp & ", @ExcludeList, " & sGamePath & ", " sSQL &= sIcon & ", @Hours, " & sVersion & ", " - sSQL &= sCompany & ", " & sMonitorGame & ", @MonitorOnly, " & sBackupLimit & ",@CleanFolder);" + sSQL &= sCompany & ", " & sMonitorGame & ", @MonitorOnly, " & sBackupLimit & ", @CleanFolder, @Parameter);" For Each oGame As clsGame In hshGames.Values hshParams = New Hashtable @@ -338,6 +365,7 @@ Public Class mgrMonitorList hshParams.Add("Hours", oGame.Hours) hshParams.Add("MonitorOnly", oGame.MonitorOnly) hshParams.Add("CleanFolder", oGame.CleanFolder) + hshParams.Add("Parameter", oGame.Parameter) 'Optional Parameters If (eSyncFields And clsGame.eOptionalSyncFields.Company) = clsGame.eOptionalSyncFields.Company Then @@ -474,9 +502,9 @@ Public Class mgrMonitorList Select Case eFilterType Case frmFilter.eFilterType.NoFilter - sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder FROM monitorlist ORDER BY Name Asc" + sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter FROM monitorlist ORDER BY Name Asc" Case frmFilter.eFilterType.FieldAnd, frmFilter.eFilterType.FieldOr - sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder FROM monitorlist" + sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter FROM monitorlist" If hshStringFilters.Count > 0 Then sSQL &= " WHERE (" @@ -498,7 +526,7 @@ Public Class mgrMonitorList End If sSQL &= " ORDER BY Name Asc" Case frmFilter.eFilterType.AnyTag - sSQL = "SELECT DISTINCT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder FROM monitorlist " + sSQL = "SELECT DISTINCT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter FROM monitorlist " sSQL &= "NATURAL JOIN gametags WHERE gametags.TagID IN (" For Each oTag As clsTag In oTagFilters @@ -510,7 +538,7 @@ Public Class mgrMonitorList sSQL = sSQL.TrimEnd(",") sSQL &= ") ORDER BY Name Asc" Case frmFilter.eFilterType.AllTags - sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder FROM monitorlist WHERE MonitorID IN " + sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter FROM monitorlist WHERE MonitorID IN " For Each oTag As clsTag In oTagFilters sSQL &= "(SELECT MonitorID FROM gametags WHERE monitorlist.MonitorID = gametags.MonitorID And TagID = @TagID" & iCounter & ")" @@ -523,7 +551,7 @@ Public Class mgrMonitorList sSQL &= " ORDER BY Name Asc" Case frmFilter.eFilterType.NoTags - sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder FROM monitorlist WHERE MonitorID NOT IN (SELECT MonitorID FROM gametags) ORDER BY Name Asc" + sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter FROM monitorlist WHERE MonitorID NOT IN (SELECT MonitorID FROM gametags) ORDER BY Name Asc" End Select Return sSQL @@ -577,6 +605,7 @@ Public Class mgrMonitorList oGame.FolderSave = CBool(dr("FolderSave")) If Not IsDBNull(dr("FileType")) Then oGame.FileType = CStr(dr("FileType")) If Not IsDBNull(dr("ExcludeList")) Then oGame.ExcludeList = CStr(dr("ExcludeList")) + If Not IsDBNull(dr("Parameter")) Then oGame.Parameter = CStr(dr("Parameter")) oGame.Tags = mgrGameTags.GetTagsByGameForExport(sID) oList.Add(oGame) Next diff --git a/GBM/Managers/mgrProcesses.vb b/GBM/Managers/mgrProcesses.vb index 729b015..dc4e119 100644 --- a/GBM/Managers/mgrProcesses.vb +++ b/GBM/Managers/mgrProcesses.vb @@ -1,6 +1,5 @@ -Imports System.Diagnostics -Imports System.IO -Imports System.Threading +Imports System.IO +Imports System.Management Public Class mgrProcesses @@ -11,6 +10,7 @@ Public Class mgrProcesses Private oDuplicateGames As New ArrayList Private bDuplicates As Boolean Private bVerified As Boolean = False + Private sFullCommand As String = String.Empty Property FoundProcess As Process Get @@ -72,6 +72,15 @@ Public Class mgrProcesses End Set End Property + Property FullCommand As String + Get + Return sFullCommand + End Get + Set(value As String) + sFullCommand = value + End Set + End Property + Private Sub VerifyDuplicate(oGame As clsGame, hshScanList As Hashtable) Dim sProcess As String bDuplicates = True @@ -85,6 +94,30 @@ Public Class mgrProcesses Next End Sub + 'This function will only work correctly on Windows + Private Sub GetWindowsCommand(ByVal prs As Process) + FullCommand = String.Empty + Try + Using searcher As New ManagementObjectSearcher("SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + prs.Id.ToString) + For Each o As ManagementObject In searcher.Get() + FullCommand &= o("CommandLine") & " " + Next + End Using + Catch ex As Exception + 'Do Nothing + End Try + End Sub + + 'This function will only work correctly on Unix + Private Sub GetUnixCommand(ByVal prs As Process) + FullCommand = String.Empty + Try + FullCommand = File.ReadAllText("/proc/" & prs.Id.ToString() & "/cmdline").Replace(vbNullChar, " ") + Catch ex As Exception + 'Do Nothing + End Try + End Sub + 'This function will only work correctly on Unix Private Function GetUnixProcessArguments(ByVal prs As Process) As String() Dim sArguments As String @@ -153,6 +186,12 @@ Public Class mgrProcesses prsFoundProcess = prsCurrent oGame = DirectCast(hshScanList.Item(sProcessCheck), clsGame).ShallowCopy + If mgrCommon.IsUnix Then + GetUnixCommand(prsCurrent) + Else + GetWindowsCommand(prsCurrent) + End If + If oGame.Duplicate = True Then VerifyDuplicate(oGame, hshScanList) Else @@ -160,6 +199,10 @@ Public Class mgrProcesses oDuplicateGames.Clear() End If + If oGame.Parameter <> String.Empty And Not oGame.Duplicate And Not FullCommand.Contains(oGame.Parameter) Then + Return False + End If + If Not oGame.AbsolutePath Or oGame.Duplicate Then Try If Not bWineProcess Then diff --git a/GBM/Managers/mgrSQLite.vb b/GBM/Managers/mgrSQLite.vb index cb7d4c2..bad4fa5 100644 --- a/GBM/Managers/mgrSQLite.vb +++ b/GBM/Managers/mgrSQLite.vb @@ -83,7 +83,7 @@ Public Class mgrSQLite sSql &= "CREATE TABLE monitorlist (MonitorID TEXT NOT NULL UNIQUE, Name TEXT NOT NULL, Process TEXT NOT NULL, Path TEXT, " & "AbsolutePath BOOLEAN NOT NULL, FolderSave BOOLEAN NOT NULL, FileType TEXT, TimeStamp BOOLEAN NOT NULL, ExcludeList TEXT NOT NULL, " & "ProcessPath TEXT, Icon TEXT, Hours REAL, Version TEXT, Company TEXT, Enabled BOOLEAN NOT NULL, MonitorOnly BOOLEAN NOT NULL, " & - "BackupLimit INTEGER NOT NULL, CleanFolder BOOLEAN NOT NULL, PRIMARY KEY(Name, Process));" + "BackupLimit INTEGER NOT NULL, CleanFolder BOOLEAN NOT NULL, Parameter TEXT, PRIMARY KEY(Name, Process));" 'Add Tables (Tags) sSql &= "CREATE TABLE tags (TagID TEXT NOT NULL UNIQUE, Name TEXT NOT NULL PRIMARY KEY); " @@ -120,7 +120,7 @@ Public Class mgrSQLite sSql = "CREATE TABLE monitorlist (MonitorID TEXT NOT NULL UNIQUE, Name TEXT NOT NULL, Process TEXT NOT NULL, Path TEXT, " & "AbsolutePath BOOLEAN NOT NULL, FolderSave BOOLEAN NOT NULL, FileType TEXT, TimeStamp BOOLEAN NOT NULL, ExcludeList TEXT NOT NULL, " & "ProcessPath TEXT, Icon TEXT, Hours REAL, Version TEXT, Company TEXT, Enabled BOOLEAN NOT NULL, MonitorOnly BOOLEAN NOT NULL, " & - "BackupLimit INTEGER NOT NULL, CleanFolder BOOLEAN NOT NULL, PRIMARY KEY(Name, Process));" + "BackupLimit INTEGER NOT NULL, CleanFolder BOOLEAN NOT NULL, Parameter TEXT, PRIMARY KEY(Name, Process));" 'Add Tables (Remote Manifest) sSql &= "CREATE TABLE manifest (ManifestID TEXT NOT NULL PRIMARY KEY, Name TEXT NOT NULL, FileName TEXT NOT NULL, RestorePath TEXT NOT NULL, " & @@ -650,6 +650,10 @@ Public Class mgrSQLite 'Add Table (SavedPath) sSQL = "CREATE TABLE savedpath (PathName TEXT NOT NULL PRIMARY KEY, Path TEXT NOT NULL);" + + 'Add new field(s) + sSQL &= "ALTER TABLE monitorlist ADD COLUMN Parameter TEXT;" + sSQL &= "PRAGMA user_version=102" RunParamQuery(sSQL, New Hashtable) @@ -658,7 +662,10 @@ Public Class mgrSQLite 'Backup DB before starting BackupDB("v101") - sSQL = "PRAGMA user_version=102" + 'Add new field(s) + sSQL = "ALTER TABLE monitorlist ADD COLUMN Parameter TEXT;" + + sSQL &= "PRAGMA user_version=102" RunParamQuery(sSQL, New Hashtable) End If @@ -671,6 +678,10 @@ Public Class mgrSQLite Return Math.Round(oFileInfo.Length / 1024, 2) End Function + Public Function ReportVersion() As String + Return SqliteConnection.SQLiteVersion + End Function + Public Sub CompactDatabase() Dim sSQL As String Dim command As SQLiteCommand diff --git a/GBM/Managers/mgrXML.vb b/GBM/Managers/mgrXML.vb index b9c29ec..a25c35d 100644 --- a/GBM/Managers/mgrXML.vb +++ b/GBM/Managers/mgrXML.vb @@ -28,6 +28,7 @@ Public Class mgrXML oGame.FolderSave = g.FolderSave oGame.FileType = g.FileType oGame.ExcludeList = g.ExcludeList + oGame.Parameter = g.Parameter For Each t As Tag In g.Tags oGame.ImportTags.Add(t) Next diff --git a/GBM/My Project/Resources.Designer.vb b/GBM/My Project/Resources.Designer.vb index 046eedc..db68857 100644 --- a/GBM/My Project/Resources.Designer.vb +++ b/GBM/My Project/Resources.Designer.vb @@ -1635,6 +1635,15 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to A game with this exact process and parameter already exists.. + ''' + Friend ReadOnly Property frmGameManager_ErrorProcessParameterDupe() As String + Get + Return ResourceManager.GetString("frmGameManager_ErrorProcessParameterDupe", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to You must enter a valid game name.. ''' @@ -1842,6 +1851,15 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Parameter:. + ''' + Friend ReadOnly Property frmGameManager_lblParameter() As String + Get + Return ResourceManager.GetString("frmGameManager_lblParameter", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Process:. ''' @@ -2266,7 +2284,7 @@ Namespace My.Resources End Property ''' - ''' Looks up a localized string similar to Game Backup Monitor[BR]Version: [PARAM] ([PARAM])[BR]Build: [PARAM][BR][PARAM][BR][BR]This program comes with ABSOLUTELY NO WARRANTY.[BR]This is free software, and you are welcome to redistribute it under certain conditions.[BR][BR]See gpl-3.0.html in the program folder for details.. + ''' Looks up a localized string similar to Game Backup Monitor[BR]Version: [PARAM] ([PARAM])[BR]Build: [PARAM][BR]SQLite: [PARAM][BR][BR][PARAM][BR][BR]This program comes with ABSOLUTELY NO WARRANTY.[BR]This is free software, and you are welcome to redistribute it under certain conditions.[BR][BR]See gpl-3.0.html in the program folder for details.. ''' Friend ReadOnly Property frmMain_About() As String Get diff --git a/GBM/My Project/Resources.resx b/GBM/My Project/Resources.resx index 8976911..a1fac24 100644 --- a/GBM/My Project/Resources.resx +++ b/GBM/My Project/Resources.resx @@ -122,7 +122,7 @@ ..\Resources\Admin.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - Game Backup Monitor[BR]Version: [PARAM] ([PARAM])[BR]Build: [PARAM][BR][PARAM][BR][BR]This program comes with ABSOLUTELY NO WARRANTY.[BR]This is free software, and you are welcome to redistribute it under certain conditions.[BR][BR]See gpl-3.0.html in the program folder for details. + Game Backup Monitor[BR]Version: [PARAM] ([PARAM])[BR]Build: [PARAM][BR]SQLite: [PARAM][BR][BR][PARAM][BR][BR]This program comes with ABSOLUTELY NO WARRANTY.[BR]This is free software, and you are welcome to redistribute it under certain conditions.[BR][BR]See gpl-3.0.html in the program folder for details. The local manifest is clean. @@ -1783,4 +1783,10 @@ [PARAM] TB + + Parameter: + + + A game with this exact process and parameter already exists. + \ No newline at end of file diff --git a/GBM/readme.txt b/GBM/readme.txt index a23ff91..6d7cd23 100644 --- a/GBM/readme.txt +++ b/GBM/readme.txt @@ -1,22 +1,25 @@ -Game Backup Monitor v1.01 Readme +Game Backup Monitor v1.02 Readme http://mikemaximus.github.io/gbm-web/ gamebackupmonitor@gmail.com -April 1, 2017 +July 1, 2017 -New in 1.01 +New in 1.02 -- (All) Added features to automatically handle new backup files. - - Automatically restore new backup files when they are detected. - - Automatically mark new backup files as restored if the game isn't installed on the current PC. - - These new features are available in the "Backup and Restore" section of the Settings. They are optional and disabled by default. -- (All) Added new configuration option to delete saved game folder on restore - - This option is used for games that change the file names of their saves, which results in a mix of old and new saved games if the old saves aren't deleted first. - - This option has limitations and is not part of official configurations or import/export features. -- (All) The "Verify backup files with a checksum" option has been removed. This feature is now baked into GBM and cannot be disabled. -- (All) GBM will now behave consistently across different configurations (such as LAN) when performing sync operations. -- (Windows) Fixed rare issue related to DPI display scaling. - -Read the "Settings" and "The Game Manager" sections of the manual (http://mikemaximus.github.io/gbm-web/manual.html) for more details on how the new features work and their limitations. +- (Windows) Upgraded SQLite to 3.19.3. +- (All) The SQLite version is displayed on the "About" screen. +- (All) Added the ability to detect command parameters. + - Use parameter detection for better detection of games running in emulators or interpreters like DOSBox. + - This is an advanced optional feature and is not available in the "Add Game Wizard", please read the manual (http://mikemaximus.github.io/gbm-web/manual.html) for more details. + - (Linux) Please note that Wine detection is still handled automatically by GBM and only requires a Windows process name. But this feature does work with Wine if you need to detect parameters! +- (All) Added the ability to resize and maximize the main program window. + - The log is now displayed by default and resizes with the window. + - The "Show/Hide Log" button has been removed due to technical issues with this change. + - The minimum window size will let you easily hide the log as in past versions. +- (All) The last browse location in various dialogs is now saved, such as when using the Import/Export feature. +- (All) Available disk space is checked before attempting a backup. The log now displays available disk space and save folder size. +- (Linux) Using the keyboard to navigate the game list in the Game Manager now works correctly. +- (All) Tags can now be added to a new game configuration before saving on the Game Manager. +- (All) Fixed various issues when adding new game configurations while using filters on the Game Manager. The entire version history of GBM releases is available at http://mikemaximus.github.io/gbm-web/versionhistory.html \ No newline at end of file diff --git a/GBM/x64/sqlite3.dll b/GBM/x64/sqlite3.dll index 3021560..d48a7ef 100644 Binary files a/GBM/x64/sqlite3.dll and b/GBM/x64/sqlite3.dll differ diff --git a/GBM/x86/sqlite3.dll b/GBM/x86/sqlite3.dll index 315ade8..1e537df 100644 Binary files a/GBM/x86/sqlite3.dll and b/GBM/x86/sqlite3.dll differ