diff --git a/GBM/Classes/XML Serialize Classes/Game.vb b/GBM/Classes/XML Serialize Classes/Game.vb
new file mode 100644
index 0000000..ec9809b
--- /dev/null
+++ b/GBM/Classes/XML Serialize Classes/Game.vb
@@ -0,0 +1,83 @@
+Public Class Game
+ Private sGameName As String
+ Private sProcessName As String
+ Private sPath As String
+ Private bAbsolutePath As Boolean
+ Private bFolderSave As Boolean
+ Private sFileType As String
+ Private sExcludeList As String
+ Private oTags As List(Of Tag)
+
+ Property Name As String
+ Set(value As String)
+ sGameName = value
+ End Set
+ Get
+ Return sGameName
+ End Get
+ End Property
+
+ Property ProcessName As String
+ Set(value As String)
+ sProcessName = value
+ End Set
+ Get
+ Return sProcessName
+ End Get
+ End Property
+
+ Property Path As String
+ Set(value As String)
+ sPath = mgrPath.ReverseSpecialPaths(value)
+ End Set
+ Get
+ Return mgrPath.ReplaceSpecialPaths(sPath)
+ End Get
+ End Property
+
+ Property AbsolutePath As Boolean
+ Set(value As Boolean)
+ bAbsolutePath = value
+ End Set
+ Get
+ Return bAbsolutePath
+ End Get
+ End Property
+
+ Property FolderSave As Boolean
+ Set(value As Boolean)
+ bFolderSave = value
+ End Set
+ Get
+ Return bFolderSave
+ End Get
+ End Property
+
+ Property FileType As String
+ Set(value As String)
+ sFileType = value
+ End Set
+ Get
+ Return sFileType
+ End Get
+ End Property
+
+ Property ExcludeList As String
+ Set(value As String)
+ sExcludeList = value
+ End Set
+ Get
+ Return sExcludeList
+ End Get
+ End Property
+
+ Property Tags As List(Of Tag)
+ Get
+ Return oTags
+ End Get
+ Set(value As List(Of Tag))
+ oTags = value
+ End Set
+ End Property
+
+End Class
diff --git a/GBM/Classes/XML Serialize Classes/Tag.vb b/GBM/Classes/XML Serialize Classes/Tag.vb
new file mode 100644
index 0000000..8d726f9
--- /dev/null
+++ b/GBM/Classes/XML Serialize Classes/Tag.vb
@@ -0,0 +1,13 @@
+Public Class Tag
+ Private sTagName As String
+
+ Property Name As String
+ Get
+ Return sTagName
+ End Get
+ Set(value As String)
+ sTagName = value
+ End Set
+ End Property
+
+End Class
diff --git a/GBM/Classes/clsGame.vb b/GBM/Classes/clsGame.vb
index 8bac9bf..d4ba291 100644
--- a/GBM/Classes/clsGame.vb
+++ b/GBM/Classes/clsGame.vb
@@ -18,6 +18,7 @@
Private bDuplicate As Boolean = False
Private sDOSBoxProcess As String = String.Empty
Private bTempGame As Boolean = False
+ Private oImportTags As New List(Of Tag)
Property ID As String
Set(value As String)
@@ -156,40 +157,40 @@
End Set
End Property
- Property Enabled As Boolean
- Set(value As Boolean)
- bEnabled = value
- End Set
+ Property Enabled As Boolean
Get
Return bEnabled
End Get
+ Set(value As Boolean)
+ bEnabled = value
+ End Set
End Property
- Property MonitorOnly As Boolean
- Set(value As Boolean)
- bMonitorOnly = value
- End Set
+ Property MonitorOnly As Boolean
Get
Return bMonitorOnly
End Get
+ Set(value As Boolean)
+ bMonitorOnly = value
+ End Set
End Property
Property Duplicate As Boolean
- Set(value As Boolean)
- bDuplicate = value
- End Set
Get
Return bDuplicate
End Get
+ Set(value As Boolean)
+ bDuplicate = value
+ End Set
End Property
- Property DOSBoxProcess As String
- Set(value As String)
- sDOSBoxProcess = value
- End Set
+ Property DOSBoxProcess As String
Get
Return sDOSBoxProcess
End Get
+ Set(value As String)
+ sDOSBoxProcess = value
+ End Set
End Property
ReadOnly Property TruePath As String
@@ -213,6 +214,15 @@
End Set
End Property
+ Property ImportTags As List(Of Tag)
+ Get
+ Return oImportTags
+ End Get
+ Set(value As List(Of Tag))
+ oImportTags = value
+ End Set
+ End Property
+
Public Function SyncEquals(obj As Object) As Boolean
Dim oGame As clsGame = TryCast(obj, clsGame)
If oGame Is Nothing Then
diff --git a/GBM/Game Backup Monitor.vbproj b/GBM/Game Backup Monitor.vbproj
index 877f924..f32d1fa 100644
--- a/GBM/Game Backup Monitor.vbproj
+++ b/GBM/Game Backup Monitor.vbproj
@@ -113,6 +113,8 @@
+
+
diff --git a/GBM/Managers/mgrGameTags.vb b/GBM/Managers/mgrGameTags.vb
index 630188f..353c06a 100644
--- a/GBM/Managers/mgrGameTags.vb
+++ b/GBM/Managers/mgrGameTags.vb
@@ -100,6 +100,29 @@
Return hshList
End Function
+ Public Shared Function GetTagsByGameForExport(ByVal sMonitorID As String) As List(Of Tag)
+ Dim oDatabase As New mgrSQLite(mgrSQLite.Database.Local)
+ Dim oData As DataSet
+ Dim sSQL As String
+ Dim oList As New List(Of Tag)
+ Dim hshParams As New Hashtable
+ Dim oTag As Tag
+
+ sSQL = "SELECT TagID, tags.Name FROM gametags NATURAL JOIN tags WHERE MonitorID = @ID"
+
+ hshParams.Add("ID", sMonitorID)
+
+ oData = oDatabase.ReadParamData(sSQL, hshParams)
+
+ For Each dr As DataRow In oData.Tables(0).Rows
+ oTag = New Tag
+ oTag.Name = CStr(dr(1))
+ oList.Add(oTag)
+ Next
+
+ Return oList
+ End Function
+
Public Shared Function GetTagsByGameMulti(ByVal sMonitorIDs As List(Of String)) As Hashtable
Dim oDatabase As New mgrSQLite(mgrSQLite.Database.Local)
Dim oData As DataSet
@@ -116,7 +139,7 @@
hshParams.Add("MonitorID" & iCounter, s)
iCounter += 1
Next
-
+
sSQL = sSQL.TrimEnd(",")
sSQL &= ")"
diff --git a/GBM/Managers/mgrMonitorList.vb b/GBM/Managers/mgrMonitorList.vb
index db3914e..decd91e 100644
--- a/GBM/Managers/mgrMonitorList.vb
+++ b/GBM/Managers/mgrMonitorList.vb
@@ -45,6 +45,8 @@ Public Class mgrMonitorList
Dim hshSyncItems As Hashtable
Dim oFromItem As clsGame
Dim oToItem As clsGame
+ Dim oTag As clsTag
+ Dim oGameTag As clsGameTag
Dim iItems As Integer = 0
Cursor.Current = Cursors.WaitCursor
@@ -74,6 +76,20 @@ Public Class mgrMonitorList
For Each oGame As clsGame In frm.ImportData.Values
If Not DoDuplicateListCheck(oGame.Name, oGame.TrueProcess) Then
DoListAdd(oGame, mgrSQLite.Database.Local)
+ 'Handle Tag Import (TODO: This could use some optimization, way too many DB hits.)
+ For Each t As Tag In oGame.ImportTags
+ If mgrTags.DoCheckDuplicate(t.Name) Then
+ oTag = mgrTags.DoTagGetbyName(t.Name)
+ Else
+ oTag = New clsTag
+ oTag.Name = t.Name
+ mgrTags.DoTagAdd(oTag)
+ End If
+ oGameTag = New clsGameTag
+ oGameTag.MonitorID = oGame.ID
+ oGameTag.TagID = oTag.ID
+ mgrGameTags.DoGameTagAdd(oGameTag)
+ Next
iItems += 1
End If
Next
@@ -88,12 +104,16 @@ Public Class mgrMonitorList
End Sub
Public Shared Sub ExportMonitorList(ByVal sLocation As String)
- Dim hshList As Hashtable = ReadList(eListTypes.FullList, mgrSQLite.Database.Local)
+ 'Dim hshList As Hashtable = ReadList(eListTypes.FullList, mgrSQLite.Database.Local)
+ 'Dim bSuccess As Boolean
+ 'bSuccess = mgrXML.ExportMonitorList(hshList, sLocation)
+
+ Dim oList As List(Of Game) = ReadListForExport()
Dim bSuccess As Boolean
- bSuccess = mgrXML.ExportMonitorList(hshList, sLocation)
+ bSuccess = mgrXML.SerializeAndExport(oList, sLocation)
If bSuccess Then
- MsgBox("Export Complete. " & hshList.Count & " entries have been exported.", MsgBoxStyle.Information, "Game Backup Monitor")
+ MsgBox("Export Complete. " & oList.Count & " entries have been exported.", MsgBoxStyle.Information, "Game Backup Monitor")
End If
End Sub
@@ -207,6 +227,7 @@ Public Class mgrMonitorList
Return False
End If
End If
+ Return True
End Function
Public Shared Function ReadList(ByVal eListType As eListTypes, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As Hashtable
@@ -272,6 +293,34 @@ Public Class mgrMonitorList
Return hshList
End Function
+ Public Shared Function ReadListForExport(Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As List(Of Game)
+ Dim oDatabase As New mgrSQLite(iSelectDB)
+ Dim oData As DataSet
+ Dim sSQL As String
+ Dim sID As String
+ Dim oList As New List(Of Game)
+ Dim oGame As Game
+
+ sSQL = "SELECT * from monitorlist ORDER BY Name Asc"
+ oData = oDatabase.ReadParamData(sSQL, New Hashtable)
+
+ For Each dr As DataRow In oData.Tables(0).Rows
+ oGame = New Game
+ sID = CStr(dr(0))
+ oGame.Name = CStr(dr(1))
+ oGame.ProcessName = CStr(dr(2))
+ If Not IsDBNull(dr(3)) Then oGame.Path = CStr(dr(3))
+ oGame.AbsolutePath = CBool(dr(4))
+ oGame.FolderSave = CBool(dr(5))
+ If Not IsDBNull(dr(6)) Then oGame.FileType = CStr(dr(6))
+ If Not IsDBNull(dr(8)) Then oGame.ExcludeList = CStr(dr(8))
+ oGame.Tags = mgrGameTags.GetTagsByGameForExport(sID)
+ oList.Add(oGame)
+ Next
+
+ Return oList
+ End Function
+
Public Shared Sub DoListAdd(ByVal oGame As clsGame, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local)
Dim oDatabase As New mgrSQLite(iSelectDB)
Dim sSQL As String
diff --git a/GBM/Managers/mgrXML.vb b/GBM/Managers/mgrXML.vb
index 476132a..002d734 100644
--- a/GBM/Managers/mgrXML.vb
+++ b/GBM/Managers/mgrXML.vb
@@ -1,11 +1,12 @@
-Imports System.Xml
+Imports System.Xml.Serialization
Imports System.IO
-Imports System.Text
+Imports System.Net
+
Public Class mgrXML
Public Shared Function ReadMonitorList(ByVal sLocation As String, Optional ByVal bWebRead As Boolean = False) As Hashtable
- Dim xFileReader As XmlTextReader
+ Dim oList As List(Of Game)
Dim hshList As New Hashtable
Dim hshDupeList As New Hashtable
Dim oGame As clsGame
@@ -16,82 +17,78 @@ Public Class mgrXML
Return hshList
End If
- Try
- xFileReader = New XmlTextReader(sLocation)
- xFileReader.WhitespaceHandling = WhitespaceHandling.None
+ oList = ImportandDeserialize(sLocation, bWebRead)
- While (xFileReader.Read())
- If xFileReader.Name = "app" Then
- oGame = New clsGame
- oGame.Name = xFileReader.GetAttribute("name")
- xFileReader.Read()
- oGame.ProcessName = xFileReader.ReadElementString("process")
- oGame.AbsolutePath = xFileReader.ReadElementString("absolutepath")
- oGame.Path = xFileReader.ReadElementString("savelocation")
- oGame.FolderSave = xFileReader.ReadElementString("foldersave")
- oGame.FileType = xFileReader.ReadElementString("filetype")
- oGame.ExcludeList = xFileReader.ReadElementString("excludelist")
+ For Each g As Game In oList
+ oGame = New clsGame
+ oGame.Name = g.Name
+ oGame.ProcessName = g.ProcessName
+ oGame.AbsolutePath = g.AbsolutePath
+ oGame.Path = g.Path
+ oGame.FolderSave = g.FolderSave
+ oGame.FileType = g.FileType
+ oGame.ExcludeList = g.ExcludeList
+ For Each t As Tag In g.Tags
+ oGame.ImportTags.Add(t)
+ Next
- If hshList.Contains(oGame.ProcessName) Or hshDupeList.Contains(oGame.ProcessName) Then
- oDupeGame = DirectCast(hshList.Item(oGame.ProcessName), clsGame)
- If Not hshDupeList.Contains(oGame.ProcessName) Then
- hshDupeList.Add(oGame.ProcessName, oDupeGame)
- hshList.Remove(oDupeGame.ProcessName)
- oDupeGame.Duplicate = True
- oDupeGame.ProcessName = oDupeGame.ProcessName & ":" & oDupeGame.Name
- hshList.Add(oDupeGame.ProcessName, oDupeGame)
- End If
- oGame.ProcessName = oGame.ProcessName & ":" & oGame.Name
- oGame.Duplicate = True
- End If
-
- hshList.Add(oGame.ProcessName, oGame)
+ If hshList.Contains(oGame.ProcessName) Or hshDupeList.Contains(oGame.ProcessName) Then
+ oDupeGame = DirectCast(hshList.Item(oGame.ProcessName), clsGame)
+ If Not hshDupeList.Contains(oGame.ProcessName) Then
+ hshDupeList.Add(oGame.ProcessName, oDupeGame)
+ hshList.Remove(oDupeGame.ProcessName)
+ oDupeGame.Duplicate = True
+ oDupeGame.ProcessName = oDupeGame.ProcessName & ":" & oDupeGame.Name
+ hshList.Add(oDupeGame.ProcessName, oDupeGame)
End If
- End While
+ oGame.ProcessName = oGame.ProcessName & ":" & oGame.Name
+ oGame.Duplicate = True
+ End If
- xFileReader.Close()
-
- 'We need to trigger a manual garbage collection here to prevent issues with the reader freezing up with multiple uses.
- 'There's no way to properly dispose a xml text reader in .NET 4, that's only fixed in 4.5+.
- GC.Collect()
-
- Catch ex As Exception
- MsgBox("An error occured reading the monitor list import file." & vbCrLf & ex.Message, MsgBoxStyle.Exclamation, "Game Backup Monitor")
- End Try
+ hshList.Add(oGame.ProcessName, oGame)
+ Next
Return hshList
End Function
- Public Shared Function ExportMonitorList(ByVal hshList As Hashtable, ByVal sLocation As String) As Boolean
- Dim xFileWriter As XmlTextWriter
+ Public Shared Function ImportandDeserialize(ByVal sLocation As String, Optional ByVal bWebRead As Boolean = False) As List(Of Game)
+ Dim oReader As StreamReader
+ Dim oWebClient As WebClient
+ Dim oSerializer As XmlSerializer
+ Dim oList As New List(Of Game)
Try
- xFileWriter = New XmlTextWriter(sLocation, System.Text.Encoding.UTF8)
- xFileWriter.Formatting = Formatting.Indented
- xFileWriter.WriteStartDocument()
- xFileWriter.WriteComment("GBM Export: " & Date.Now)
- xFileWriter.WriteComment("Entries: " & hshList.Count)
- xFileWriter.WriteStartElement("aMon")
- For Each o As clsGame In hshList.Values
- xFileWriter.WriteStartElement("app")
- xFileWriter.WriteAttributeString("name", o.Name)
- xFileWriter.WriteElementString("process", o.TrueProcess)
- xFileWriter.WriteElementString("absolutepath", o.AbsolutePath)
- xFileWriter.WriteElementString("savelocation", o.TruePath)
- xFileWriter.WriteElementString("foldersave", o.FolderSave)
- xFileWriter.WriteElementString("filetype", o.FileType)
- xFileWriter.WriteElementString("excludelist", o.ExcludeList)
- xFileWriter.WriteEndElement()
- Next
- xFileWriter.WriteEndElement()
- xFileWriter.WriteEndDocument()
- xFileWriter.Flush()
- xFileWriter.Close()
+ If bWebRead Then
+ oWebClient = New WebClient
+ oReader = New StreamReader(oWebClient.OpenRead(sLocation))
+ Else
+ oReader = New StreamReader(sLocation)
+ End If
+
+ oSerializer = New XmlSerializer(oList.GetType(), New XmlRootAttribute("gbm"))
+ oList = oSerializer.Deserialize(oReader)
+ oReader.Close()
+ Catch ex As Exception
+ MsgBox("The XML file cannot be read, it may be an invalid format or corrupted." & vbCrLf & vbCrLf & ex.Message, MsgBoxStyle.Exclamation, "Game Backup Monitor")
+ End Try
+
+ Return oList
+ End Function
+
+ Public Shared Function SerializeAndExport(ByVal oList As List(Of Game), ByVal sLocation As String) As Boolean
+ Dim oSerializer As XmlSerializer
+ Dim oWriter As StreamWriter
+
+ Try
+ oSerializer = New XmlSerializer(oList.GetType(), New XmlRootAttribute("gbm"))
+ oWriter = New StreamWriter(sLocation)
+ oSerializer.Serialize(oWriter.BaseStream, oList)
Return True
Catch ex As Exception
- MsgBox("An error occured exporting the monitor list. " & ex.Message, MsgBoxStyle.Exclamation, "Game Backup Monitor")
+ MsgBox("An error occured exporting the XML data." & vbCrLf & vbCrLf & ex.Message, MsgBoxStyle.Exclamation, "Game Backup Monitor")
Return False
End Try
End Function
+
End Class