190930
This commit is contained in:
86
Pilz.Updating/Updater.vb
Normal file
86
Pilz.Updating/Updater.vb
Normal file
@@ -0,0 +1,86 @@
|
||||
Imports System.IO
|
||||
Imports System.IO.Compression
|
||||
Imports System.Net
|
||||
Imports System.Reflection
|
||||
Imports Newtonsoft.Json.Linq
|
||||
Imports Pilz.Updating.Model
|
||||
Imports Pilz.Updating.MyEventArgs
|
||||
|
||||
Public Class Updater
|
||||
|
||||
Public Event UpdatesFound(sender As Object, e As UpdatesFoundEventArgs)
|
||||
Public Event NoUpdatesFound(sender As Object, e As EventArgs)
|
||||
Public Event UpdateInstallerStarted(Sender As Object, e As EventArgs)
|
||||
|
||||
Public Property InstallAsAdmin As Boolean = True
|
||||
Public Property RestartHostApplication As Boolean = True
|
||||
Public Property AutomaticlyCloseHostApplication As Boolean = True
|
||||
Public Property UpdateDirURL As String
|
||||
Public Property UpdateInfoURL As String
|
||||
|
||||
Public Sub New(updateUrl As String)
|
||||
UpdateInfoURL = updateUrl
|
||||
UpdateDirURL = updateUrl.Remove(updateUrl.LastIndexOf("/"c))
|
||||
End Sub
|
||||
|
||||
Public Async Function Update() As Task
|
||||
Dim wc As New WebClient
|
||||
Dim updateInstallerZipPath As String = Path.Combine(MyTempPath, "Pilz.Updating.UpdateInstaller.zip")
|
||||
Dim updateInstallerPath As String = updateInstallerZipPath & "_unpacked"
|
||||
Dim updateInstallerExePath As String = Path.Combine(updateInstallerPath, "Pilz.Updating.UpdateInstaller.exe")
|
||||
|
||||
'Clean AppData
|
||||
For Each dir As String In Directory.GetDirectories(MyTempPath, "*", SearchOption.TopDirectoryOnly)
|
||||
Directory.Delete(dir, True)
|
||||
Next
|
||||
|
||||
'Download UpdateInfos
|
||||
Dim strUpdateInfos As String = Await wc.DownloadStringTaskAsync(UpdateInfoURL)
|
||||
Dim updateInfos As UpdateInfo() = JArray.Parse(strUpdateInfos).ToObject(Of UpdateInfo())
|
||||
|
||||
If updateInfos.Any Then
|
||||
'Order update infos from newest to oldest
|
||||
updateInfos = updateInfos.OrderByDescending(
|
||||
Function(n)
|
||||
Return n.Version.ToString &
|
||||
(Byte.MaxValue - n.State).ToString("X2") &
|
||||
n.Build.ToString("X4")
|
||||
End Function).ToArray
|
||||
|
||||
'Interagate with user
|
||||
Dim e As New UpdatesFoundEventArgs(updateInfos)
|
||||
RaiseEvent UpdatesFound(Me, e)
|
||||
|
||||
'Install updates
|
||||
If Not e.Cancel Then
|
||||
Dim updateInfo As UpdateInfo = updateInfos(0)
|
||||
Dim updatePackageZipFilename As String = $"{updateInfo.Version.ToString} {CByte(updateInfo.State)} {updateInfo.Build}.zip"
|
||||
Dim updatePackageZipPath As String = Path.Combine(MyTempPath, updatePackageZipFilename)
|
||||
Dim updatePackagePath As String = updatePackageZipPath & "_unpacked"
|
||||
|
||||
'Download UpdateInstaller
|
||||
Await wc.DownloadFileTaskAsync(UpdateDirURL & "/Pilz.Updating.UpdateInstaller.zip", updateInstallerZipPath)
|
||||
ZipFile.ExtractToDirectory(updateInstallerZipPath, updateInstallerPath)
|
||||
|
||||
'Download Update Package
|
||||
Await wc.DownloadFileTaskAsync(UpdateDirURL & "/" & updatePackageZipFilename, updatePackageZipPath)
|
||||
ZipFile.ExtractToDirectory(updatePackageZipFilename, updatePackagePath)
|
||||
|
||||
'Build process arguments
|
||||
Dim applicationExePath As String = Assembly.GetExecutingAssembly.Location
|
||||
Dim procArgs As String = $"restartHostApp#{RestartHostApplication} autoCloseHostApp#{AutomaticlyCloseHostApplication} ""updatePackage#{updatePackagePath}"" ""applicationPath#{applicationExePath}"""
|
||||
|
||||
'Finally start update installer to install updates
|
||||
Process.Start(updateInstallerExePath, procArgs)
|
||||
|
||||
'Interagate with user
|
||||
RaiseEvent UpdateInstallerStarted(Me, New EventArgs)
|
||||
End If
|
||||
Else
|
||||
RaiseEvent NoUpdatesFound(Me, New EventArgs)
|
||||
End If
|
||||
|
||||
wc.Dispose()
|
||||
End Function
|
||||
|
||||
End Class
|
||||
Reference in New Issue
Block a user