1 #Region "Microsoft.VisualBasic::2216b94294077ebc4cafff613ec82cb8, Microsoft.VisualBasic.Core\CommandLine\InteropService\Abstract.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 InteropService
35     
36     '         Properties: Path
37     
38     '         Constructor: (+2 OverloadsSub New
39     '         FunctionGetLastCLRException, GetLastError, RunDotNetApp, RunProgram, ToString
40     
41     '     Class NullOrDefault
42     
43     '         Properties: value
44     
45     '         Constructor: (+1 OverloadsSub New
46     '         FunctionToString
47     
48     '     Class CLIBuilder
49     
50     '         FunctionToString
51     
52     
53     ' /********************************************************************************/
54
55 #End Region
56
57 Imports System.Runtime.CompilerServices
58 Imports System.Text.RegularExpressions
59 Imports Microsoft.VisualBasic.ApplicationServices.Debugging.Diagnostics
60 Imports Microsoft.VisualBasic.Language
61 Imports Microsoft.VisualBasic.Text
62
63 Namespace CommandLine.InteropService
64
65     ''' <summary>
66     ''' The class object which can interact with the target commandline program.
67     ''' (与目标命令行程序进行命令行交互的编程接口,本类型的对象的作用主要是生成命令行参数)
68     ''' </summary>
69     ''' <remarks></remarks>
70     Public Class InteropService : Inherits CLIBuilder
71
72         ''' <summary>
73         ''' App path
74         ''' </summary>
75         ''' <returns></returns>
76         Public ReadOnly Property Path As String
77             Get
78                 Return _executableAssembly
79             End Get
80         End Property
81
82         Sub New()
83         End Sub
84
85         ''' <summary>
86         ''' 通过应用程序的可执行文件路径来构建命令行的交互对象
87         ''' </summary>
88         ''' <param name="app"></param>
89         Sub New(app As String)
90             _executableAssembly = app
91         End Sub
92
93         ''' <summary>
94         ''' Assembly path for the target invoked program.
95         ''' </summary>
96         ''' <remarks></remarks>
97         Protected Friend _executableAssembly As String
98
99         Dim lastProc As IIORedirectAbstract
100
101         Public Function RunDotNetApp(args$) As IIORedirectAbstract
102             lastProc = App.Shell(_executableAssembly, args, CLR:=True)
103             Return lastProc
104         End Function
105
106         ''' <summary>
107         ''' 线程不安全
108         ''' </summary>
109         ''' <returns></returns>
110         <MethodImpl(MethodImplOptions.AggressiveInlining)>
111         Public Function GetLastCLRException() As ExceptionData
112             Return GetLastError(lastProc)
113         End Function
114
115         Public Shared Function GetLastError(proc As IIORedirectAbstract) As ExceptionData
116             Dim out$ = proc?.StandardOutput Or EmptyString
117             Dim err$ = out _
118                 .Match("^\[INFOM .+?\] \[Log\].+$", RegexOptions.Multiline) _
119                 .StringReplace("\[.+?\] \[Log\]\s+""") _
120                 .Trim(" "c, ASCII.TAB, ASCII.CR, ASCII.LF)
121             Dim logs As List(Of String()) = err _
122                 .ReadAllText(throwEx:=False, suppress:=True) _
123                 .LineTokens _
124                 .FlagSplit(Function(s) s.IsPattern("[=]+")) _
125                 .AsList
126
127             If logs.IsNullOrEmpty Then
128                 Return Nothing
129             End If
130
131             Dim typeINF = logs(-3).Where(Function(s) Not s.StringEmpty).First.Trim(":"c)
132             Dim message = logs(-2).Where(Function(s) Not s.StringEmpty).Select(Function(s) Mid(s, 9).Trim).ToArray
133             Dim tracess = logs(-1).Where(Function(s) Not s.StringEmpty).Select(Function(s) Mid(s, 6).Trim).ToArray
134
135             Return ExceptionData.CreateInstance(message, tracess, typeINF)
136         End Function
137
138         ''' <summary>
139         ''' 运行非.NET应用程序
140         ''' 请注意,这个函数只是生成了具体的进程调用对象,还需要手动调用
141         ''' <see cref="IIORedirectAbstract.Run()"/>或者
142         ''' <see cref="IIORedirectAbstract.Start(Boolean)"/>
143         ''' 方法才会启动目标进程
144         ''' </summary>
145         ''' <param name="args$"></param>
146         ''' <returns></returns>
147         ''' 
148         <MethodImpl(MethodImplOptions.AggressiveInlining)>
149         Public Function RunProgram(args$, Optional stdin$ = NothingAs IIORedirectAbstract
150             Return App.Shell(_executableAssembly, args, CLR:=False, stdin:=stdin)
151         End Function
152
153         Public Overrides Function ToString() As String
154             If String.IsNullOrEmpty(_executableAssembly) Then
155                 Return MyBase.ToString()
156             Else
157                 Return _executableAssembly
158             End If
159         End Function
160     End Class
161
162     ''' <summary>
163     ''' Default value
164     ''' </summary>
165     <AttributeUsage(AttributeTargets.Field, AllowMultiple:=False, Inherited:=True)>
166     Public Class NullOrDefault : Inherits Attribute
167
168         Public ReadOnly Property value As String
169
170         Sub New(Optional default$ = "")
171             value = [default]
172         End Sub
173
174         Public Overrides Function ToString() As String
175             Return value
176         End Function
177     End Class
178
179     Public MustInherit Class CLIBuilder
180
181         Public Overrides Function ToString() As String
182             Return Me.GetCLI
183         End Function
184     End Class
185 End Namespace