-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathBinariesResolverBase.vb
96 lines (79 loc) · 3.98 KB
/
BinariesResolverBase.vb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#Region "Copyright"
' Copyright © 2025, TeamDev. All rights reserved.
'
' Redistribution and use in source and/or binary forms, with or without
' modification, must retain the above copyright notice and the following
' disclaimer.
'
' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
' "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
' LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
' A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
' OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
' SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
' LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
' DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
' THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
' (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
' OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#End Region
Imports System
Imports System.Diagnostics
Imports System.IO
Imports System.Net.Http
Imports System.Reflection
Imports System.Threading.Tasks
''' <summary>
''' The abstract class for implementing the binaries resolver.
''' </summary>
Public MustInherit Class BinariesResolverBase
Private ReadOnly client As HttpClient
Protected ReadOnly Property RequestUri() As String
''' <summary>
''' Occurs when the status update messages are sent by the implementation.
''' These messages can be used to update the application UI and indicate the progress.
''' </summary>
Public Event StatusUpdated As EventHandler(Of BinariesResolverStatusEventArgs)
Protected Sub New(ByVal uri As String, Optional ByVal domain As AppDomain = Nothing)
If domain Is Nothing Then
domain = AppDomain.CurrentDomain
End If
Me.RequestUri = uri
client = New HttpClient()
AddHandler domain.AssemblyResolve, AddressOf Resolve
End Sub
''' <summary>
''' The AssemblyResolve event handler.
''' </summary>
''' <param name="sender"></param>
''' <param name="args"></param>
''' <returns></returns>
Public Function Resolve(ByVal sender As Object, ByVal args As ResolveEventArgs) As System.Reflection.Assembly
Return If(args.Name.StartsWith("DotNetBrowser.Chromium"), Resolve(args.Name).Result, Nothing)
End Function
Protected Sub OnStatusUpdated(ByVal message As String, Optional ByVal completed As Boolean = False)
StatusUpdatedEvent?.Invoke(Me, New BinariesResolverStatusEventArgs(message, completed))
End Sub
Protected MustOverride Function PrepareRequest(ByVal assemblyName As AssemblyName) As String
Protected MustOverride Function ProcessResponse(ByVal responseBody As Stream, ByVal assemblyName As AssemblyName) As System.Reflection.Assembly
Private Async Function Resolve(ByVal binariesAssemblyName As String) As Task(Of System.Reflection.Assembly)
'Note: assemblies are usually resolved in the background thread of the UI application.
Try
'Construct a request using the fully-qualified assembly name.
Dim assemblyName As New AssemblyName(binariesAssemblyName)
Dim request As String = PrepareRequest(assemblyName)
'Perform the request and download the response.
OnStatusUpdated("Downloading Chromium binaries...")
Debug.WriteLine($"Downloading {request}")
Dim response As HttpResponseMessage = Await client.GetAsync(request)
response.EnsureSuccessStatusCode()
OnStatusUpdated("Chromium binaries package downloaded")
Dim responseBody As Stream = Await response.Content.ReadAsStreamAsync()
'Process the response bytes and load the assembly.
Return ProcessResponse(responseBody, assemblyName)
Catch e As Exception
Debug.WriteLine("Exception caught: {0} ", e)
End Try
Return Nothing
End Function
End Class