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