Imports System.Text
Public Class AssetContext
Private Const DataProtector As String = "12345"
Private Const DataFileName As String = ".\assets.dat"
Private Shared characterEncoding As Encoding
Private Shared lock As Object = New Object
Private Shared context As AssetContext
Public Shared ReadOnly Property Instance As AssetContext
Get
Dim result As AssetContext = CType(Nothing, AssetContext)
SyncLock lock
If context Is Nothing Then
context = New AssetContext
End If
result = context
End SyncLock
Return result
End Get
End Property
Friend Function Write(list As List(Of AssetInfo)) As Boolean
Return Write(list, DataFileName, DataProtector)
End Function
Friend Function Write(list As List(Of AssetInfo), filename As String, guard As String) As Boolean
If characterEncoding Is Nothing Then
Dim encoder As Encoding = CType(Encoding.UTF8.Clone(), Encoding)
encoder.EncoderFallback = EncoderFallback.ReplacementFallback
characterEncoding = encoder
End If
Using writer As New System.IO.BinaryWriter(System.IO.File.Open(filename, System.IO.FileMode.Create), characterEncoding)
writer.Write(AssetObfuscation.Obfuscate(guard, guard))
writer.Write(list.Count)
For Each current As AssetInfo In list
writer.Write(AssetObfuscation.Obfuscate(current.Index, guard))
writer.Write(AssetObfuscation.Obfuscate(current.UriString, guard))
Next
Return True
End Using
Return False
End Function
Friend Function Read() As List(Of AssetInfo)
Return Read(DataFileName, DataProtector)
End Function
Friend Function Read(filename As String, guard As String) As List(Of AssetInfo)
Dim assets As List(Of AssetInfo) = CType(Nothing, List(Of AssetInfo))
If (System.IO.File.Exists(filename)) Then
Using reader As New System.IO.BinaryReader(System.IO.File.Open(filename, System.IO.FileMode.Open), New System.Text.UTF8Encoding(False, False))
Dim protection As String = AssetObfuscation.DeObfuscate(reader.ReadString, guard)
If protection <> guard Then
Return Nothing
End If
Dim count As Integer = reader.ReadInt32()
assets = New List(Of AssetInfo)()
For i As Integer = 0 To count - 1
Dim asset As AssetInfo = New AssetInfo
asset.Index = AssetObfuscation.DeObfuscate(reader.ReadString, guard)
asset.UriString = AssetObfuscation.DeObfuscate(reader.ReadString, guard)
assets.Add(asset)
Next
End Using
End If
Return assets
End Function
End Class