1 #Region "Microsoft.VisualBasic::342a6de1f7bc3c807986dc5a2d76b044, Microsoft.VisualBasic.Core\ApplicationServices\Tools\Resources.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Class ResourcesSatellite
35     
36     '         Properties: FileName, MyResource, Resources
37     
38     '         Constructor: (+5 OverloadsSub New
39     
40     '         Function: DirectLoadFrom, (+2 OverloadsGetObject, (+2 OverloadsGetStream, (+3 OverloadsGetString, LoadMy
41     
42     '         Sub: __load, __resParser
43     
44     
45     ' /********************************************************************************/
46
47 #End Region
48
49 Imports System.ComponentModel.Composition
50 Imports System.Globalization
51 Imports System.IO
52 Imports System.Reflection
53 Imports System.Resources
54 Imports System.Runtime.CompilerServices
55 Imports System.Runtime.InteropServices
56 Imports Microsoft.VisualBasic.Language
57 Imports Microsoft.VisualBasic.Text
58
59 Namespace ApplicationServices
60
61     ''' <summary>
62     ''' Represents a resource manager that provides convenient access to culture-specific
63     ''' resources at run time.Security Note: Calling methods in this class with untrusted
64     ''' data is a security risk. Call the methods in the class only with trusted data.
65     ''' For more information, see Untrusted Data Security Risks.
66     ''' (资源卫星程序集)
67     ''' </summary>
68     <Export(GetType(ResourceManager))> Public Class ResourcesSatellite
69
70         ''' <summary>
71         ''' The file path of the resources satellite assembly.
72         ''' </summary>
73         ''' <returns></returns>
74         Public ReadOnly Property FileName As String
75         ''' <summary>
76         ''' <see cref="System.Resources.ResourceManager"/> object in the satellite assembly.
77         ''' </summary>
78         ''' <returns></returns>
79         Public ReadOnly Property Resources As ResourceManager
80
81         ' Exceptions:
82         '   T:System.ArgumentNullException:
83         '     The name parameter is null.
84         '
85         '   T:System.Resources.MissingManifestResourceException:
86         '     No usable set of localized resources has been found, and there are no default
87         '     culture resources. For information about how to handle this exception, see the
88         '     "Handling MissingManifestResourceException and MissingSatelliteAssemblyException
89         '     Exceptions" section in the System.Resources.ResourceManager class topic.
90         '
91         '   T:System.Resources.MissingSatelliteAssemblyException:
92         '     The default culture's resources reside in a satellite assembly that could not
93         '     be found. For information about how to handle this exception, see the "Handling
94         '     MissingManifestResourceException and MissingSatelliteAssemblyException Exceptions"
95         '     section in the System.Resources.ResourceManager class topic.
96
97         ''' <summary>
98         ''' Returns the value of the specified non-string resource.
99         ''' </summary>
100         ''' <param name="name">The name of the resource to get.</param>
101         ''' <returns>The value of the resource localized for the caller's current culture settings.
102         ''' If an appropriate resource set exists but name cannot be found, the method returns
103         ''' null.</returns>
104         ''' 
105         <MethodImpl(MethodImplOptions.AggressiveInlining)>
106         Public Overridable Function GetObject(name As StringAs Object
107             Return Resources.GetObject(name)
108         End Function
109
110         ' Exceptions:
111         '   T:System.ArgumentNullException:
112         '     The name parameter is null.
113         '
114         '   T:System.Resources.MissingManifestResourceException:
115         '     No usable set of resources have been found, and there are no default culture
116         '     resources. For information about how to handle this exception, see the "Handling
117         '     MissingManifestResourceException and MissingSatelliteAssemblyException Exceptions"
118         '     section in the System.Resources.ResourceManager class topic.
119         '
120         '   T:System.Resources.MissingSatelliteAssemblyException:
121         '     The default culture's resources reside in a satellite assembly that could not
122         '     be found. For information about how to handle this exception, see the "Handling
123         '     MissingManifestResourceException and MissingSatelliteAssemblyException Exceptions"
124         '     section in the System.Resources.ResourceManager class topic.
125
126         ''' <summary>
127         ''' Gets the value of the specified non-string resource localized for the specified
128         ''' culture.
129         ''' </summary>
130         ''' <param name="name">The name of the resource to get.</param>
131         ''' <param name="culture">The culture for which the resource is localized. If the resource is not localized
132         ''' for this culture, the resource manager uses fallback rules to locate an appropriate
133         ''' resource.If this value is null, the System.Globalization.CultureInfo object is
134         ''' obtained by using the System.Globalization.CultureInfo.CurrentUICulture property.</param>
135         ''' <returns>The value of the resource, localized for the specified culture. If an appropriate
136         ''' resource set exists but name cannot be found, the method returns null.</returns>
137         ''' 
138         <MethodImpl(MethodImplOptions.AggressiveInlining)>
139         Public Overridable Function GetObject(name As String, culture As CultureInfo) As Object
140             Return Resources.GetObject(name, culture)
141         End Function
142
143         ' Exceptions:
144         '   T:System.InvalidOperationException:
145         '     The value of the specified resource is not a System.IO.MemoryStream object.
146         '
147         '   T:System.ArgumentNullException:
148         '     name is null.
149         '
150         '   T:System.Resources.MissingManifestResourceException:
151         '     No usable set of resources is found, and there are no default resources. For
152         '     information about how to handle this exception, see the "Handling MissingManifestResourceException
153         '     and MissingSatelliteAssemblyException Exceptions" section in the System.Resources.ResourceManager
154         '     class topic.
155         '
156         '   T:System.Resources.MissingSatelliteAssemblyException:
157         '     The default culture's resources reside in a satellite assembly that could not
158         '     be found. For information about how to handle this exception, see the "Handling
159         '     MissingManifestResourceException and MissingSatelliteAssemblyException Exceptions"
160         '     section in the System.Resources.ResourceManager class topic.
161
162         ''' <summary>
163         ''' Returns an unmanaged memory stream object from the specified resource.
164         ''' </summary>
165         ''' <param name="name">The name of a resource.</param>
166         ''' <returns>An unmanaged memory stream object that represents a resource .</returns>
167         ''' 
168         <MethodImpl(MethodImplOptions.AggressiveInlining)>
169         <ComVisible(False)>
170         Public Function GetStream(name As StringAs UnmanagedMemoryStream
171             Return Resources.GetStream(name)
172         End Function
173
174         ' Exceptions:
175         '   T:System.InvalidOperationException:
176         '     The value of the specified resource is not a System.IO.MemoryStream object.
177         '
178         '   T:System.ArgumentNullException:
179         '     name is null.
180         '
181         '   T:System.Resources.MissingManifestResourceException:
182         '     No usable set of resources is found, and there are no default resources. For
183         '     information about how to handle this exception, see the "Handling MissingManifestResourceException
184         '     and MissingSatelliteAssemblyException Exceptions" section in the System.Resources.ResourceManager
185         '     class topic.
186         '
187         '   T:System.Resources.MissingSatelliteAssemblyException:
188         '     The default culture's resources reside in a satellite assembly that could not
189         '     be found. For information about how to handle this exception, see the "Handling
190         '     MissingManifestResourceException and MissingSatelliteAssemblyException Exceptions"
191         '     section in the System.Resources.ResourceManager class topic.
192
193         ''' <summary>
194         ''' Returns an unmanaged memory stream object from the specified resource, using
195         ''' the specified culture.
196         ''' </summary>
197         ''' <param name="name">The name of a resource.</param>
198         ''' <param name="culture">An object that specifies the culture to use for the resource lookup. If culture
199         ''' is null, the culture for the current thread is used.</param>
200         ''' <returns>An unmanaged memory stream object that represents a resource.</returns>
201         ''' 
202         <MethodImpl(MethodImplOptions.AggressiveInlining)>
203         <ComVisible(False)>
204         Public Function GetStream(name As String, culture As CultureInfo) As UnmanagedMemoryStream
205             Return Resources.GetStream(name, culture)
206         End Function
207
208         <MethodImpl(MethodImplOptions.AggressiveInlining)>
209         Public Function GetString(name As String, encoding As Encodings) As String
210             Dim stream As New StreamReader(GetStream(name), encoding.CodePage)
211             Return stream.ReadToEnd
212         End Function
213
214         ' Exceptions:
215         '   T:System.ArgumentNullException:
216         '     The name parameter is null.
217         '
218         '   T:System.InvalidOperationException:
219         '     The value of the specified resource is not a string.
220         '
221         '   T:System.Resources.MissingManifestResourceException:
222         '     No usable set of resources has been found, and there are no resources for the
223         '     default culture. For information about how to handle this exception, see the
224         '     "Handling MissingManifestResourceException and MissingSatelliteAssemblyException
225         '     Exceptions" section in the System.Resources.ResourceManager class topic.
226         '
227         '   T:System.Resources.MissingSatelliteAssemblyException:
228         '     The default culture's resources reside in a satellite assembly that could not
229         '     be found. For information about how to handle this exception, see the "Handling
230         '     MissingManifestResourceException and MissingSatelliteAssemblyException Exceptions"
231         '     section in the System.Resources.ResourceManager class topic.
232
233         ''' <summary>
234         ''' Returns the value of the specified string resource.
235         ''' </summary>
236         ''' <param name="name">The name of the resource to retrieve.</param>
237         ''' <returns>The value of the resource localized for the caller's current UI culture, or null
238         ''' if name cannot be found in a resource set.</returns>
239         ''' 
240         <MethodImpl(MethodImplOptions.AggressiveInlining)>
241         Public Overridable Function GetString(name As StringAs String
242             Return Resources.GetString(name)
243         End Function
244
245         ' Exceptions:
246         '   T:System.ArgumentNullException:
247         '     The name parameter is null.
248         '
249         '   T:System.InvalidOperationException:
250         '     The value of the specified resource is not a string.
251         '
252         '   T:System.Resources.MissingManifestResourceException:
253         '     No usable set of resources has been found, and there are no resources for a default
254         '     culture. For information about how to handle this exception, see the "Handling
255         '     MissingManifestResourceException and MissingSatelliteAssemblyException Exceptions"
256         '     section in the System.Resources.ResourceManager class topic.
257         '
258         '   T:System.Resources.MissingSatelliteAssemblyException:
259         '     The default culture's resources reside in a satellite assembly that could not
260         '     be found. For information about how to handle this exception, see the "Handling
261         '     MissingManifestResourceException and MissingSatelliteAssemblyException Exceptions"
262         '     section in the System.Resources.ResourceManager class topic.
263
264         ''' <summary>
265         ''' Returns the value of the string resource localized for the specified culture.
266         ''' </summary>
267         ''' <param name="name">The name of the resource to retrieve.</param>
268         ''' <param name="culture">An object that represents the culture for which the resource is localized.</param>
269         ''' <returns>The value of the resource localized for the specified culture, or null if name
270         ''' cannot be found in a resource set.</returns>
271         ''' 
272         <MethodImpl(MethodImplOptions.AggressiveInlining)>
273         Public Overridable Function GetString(name As String, culture As CultureInfo) As String
274             Return Resources.GetString(name, culture)
275         End Function
276
277         Sub New()
278             Call Me.New(Assembly.GetExecutingAssembly)
279         End Sub
280
281         ''' <summary>
282         ''' Load external resource data from current module's satellite assembly.
283         ''' </summary>
284         ''' <param name="type"></param>
285         Sub New(type As Type)
286             Call Me.New(type.Assembly)
287         End Sub
288
289         ''' <summary>
290         ''' 默认是<see cref="App.HOME"/>/Resources/assmFile
291         ''' </summary>
292         ''' <param name="assm"></param>
293         Sub New(assm As Assembly)
294             Call Me.New(dll:=assm.Location.ParentPath & "/Resources/" & FileIO.FileSystem.GetFileInfo(assm.Location).Name)
295         End Sub
296
297         Sub New(dll As String)
298             FileName = FileIO.FileSystem.GetFileInfo(dll).FullName
299             Call __resParser()
300         End Sub
301
302         Private Sub __resParser()
303             Call __load(Assembly.LoadFile(FileName))
304         End Sub
305
306         Private Sub __load(assm As Assembly)
307 #If NET_40 = 0 Then
308             Dim resource As Type = GetType(ExportAttribute)
309             Dim resourceMgr As Type = LinqAPI.DefaultFirst(Of Type) _
310  _
311                 () <= From type As Type
312                       In assm.GetTypes
313                       Let exp As ExportAttribute = type.GetCustomAttribute(resource)
314                       Where Not exp Is Nothing AndAlso
315                           exp.ContractType.Equals(GetType(ResourceManager))
316                       Select type
317
318             If Not resourceMgr Is Nothing Then
319                 Dim container = LinqAPI.DefaultFirst(Of PropertyInfo) _
320  _
321                     () <= From prop As PropertyInfo
322                           In resourceMgr.GetProperties(BindingFlags.Public Or BindingFlags.Static)
323                           Let exp As ExportAttribute = prop.GetCustomAttribute(resource)
324                           Where prop.CanRead AndAlso
325                               Not exp Is Nothing AndAlso
326                               exp.ContractType.Equals(GetType(ResourceManager))
327                           Select prop
328
329                 If Not container Is Nothing Then
330                     Dim mgr = container.GetValue(Nothing, Nothing)
331                     _Resources = DirectCast(mgr, ResourceManager)
332                 End If
333             End If
334 #End If
335         End Sub
336
337         ''' <summary>
338         ''' 
339         ''' </summary>
340         ''' <param name="my">null</param>
341         ''' <param name="assm"></param>
342         Private Sub New(my As Type, assm As Assembly)
343             Call __load(assm)
344         End Sub
345
346         ''' <summary>
347         ''' 从自身的程序集之中加载数据
348         ''' </summary>
349         ''' <returns></returns>
350         Public Shared Function LoadMy() As ResourcesSatellite
351             Return New ResourcesSatellite(Nothing, Assembly.GetExecutingAssembly)
352         End Function
353
354         Public Shared Function DirectLoadFrom(assm As Assembly) As ResourcesSatellite
355             Return New ResourcesSatellite(Nothing, assm)
356         End Function
357
358         ''' <summary>
359         ''' Returns the cached ResourceManager instance used by this class.
360         ''' </summary>
361         ''' <returns></returns>
362         ''' 
363         <Export(GetType(ResourceManager))>
364         Public Shared ReadOnly Property MyResource As ResourceManager
365             Get
366                 Return My.Resources.ResourceManager
367             End Get
368         End Property
369     End Class
370 End Namespace