1 #Region "Microsoft.VisualBasic::ed294d7ec41fb74dbe7ebb5064701169, Microsoft.VisualBasic.Core\ApplicationServices\Tools\MMFProtocol\Pipeline\Pipeline.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 Pipeline
35     
36     '         Constructor: (+1 OverloadsSub New
37     '         Function: __allocated, __destroy, GetValue
38     
39     
40     ' /********************************************************************************/
41
42 #End Region
43
44 Imports Microsoft.VisualBasic.Net.Http
45 Imports Microsoft.VisualBasic.Net.Protocols
46 Imports Microsoft.VisualBasic.Net.Protocols.Reflection
47
48 Namespace MMFProtocol.Pipeline
49
50     ''' <summary>
51     ''' exec cmd /var $&lt;piplineName>, this can be using in the CLI programming for passing the variables between the program more efficient
52     ''' </summary>
53     ''' 
54     <Protocol(GetType(API.Protocols))>
55     Public Class Pipeline
56
57         ReadOnly _sockets As SortedDictionary(Of String, MapStream.MSWriter) =
58             New SortedDictionary(Of String, MapStream.MSWriter)
59         ReadOnly _netSocket As Net.TcpSynchronizationServicesSocket
60         ReadOnly _protocols As Net.Abstract.IProtocolHandler
61
62         Sub New(Optional port As Integer = API.PeplinePort)
63             _protocols = New ProtocolHandler(Me)
64             _netSocket = New Net.TcpSynchronizationServicesSocket(port)
65             _netSocket.Responsehandler = AddressOf _protocols.HandleRequest
66
67             Call Parallel.RunTask(AddressOf _netSocket.Run)
68         End Sub
69
70         ''' <summary>
71         ''' 假若变量不存在,则返回空值
72         ''' </summary>
73         ''' <typeparam name="T"></typeparam>
74         ''' <param name="var"></param>
75         ''' <returns></returns>
76         Public Function GetValue(Of T As RawStream)(var As StringAs T
77             If Not _sockets.ContainsKey(var) Then
78                 Return Nothing
79             End If
80
81             Dim data As MapStream.MSWriter = _sockets(var)
82             Dim buf As Byte() = data.Read.byteData
83             Dim raw As Object = Activator.CreateInstance(GetType(T), {buf})
84             Dim x As T = DirectCast(raw, T)
85             Return x
86         End Function
87
88         ''' <summary>
89         ''' 在写数据之前需要先使用这个方法进行内存区块的创建
90         ''' </summary>
91         ''' <returns></returns>
92         <Protocol(API.Protocols.Allocation)>
93         Private Function __allocated(CA As Long, request As RequestStream, remote As System.Net.IPEndPoint) As RequestStream
94             Dim s As String = request.GetUTF8String
95             If Not API.IsRef(s) Then
96                 Return NetResponse.RFC_TOKEN_INVALID
97             End If
98
99             Dim tokens As String() = s.Split(":"c)
100             Dim var As String = tokens(Scan0)
101             Dim size As Long = Scripting.CTypeDynamic(Of Long)(tokens(1))
102
103             If _sockets.ContainsKey(var) Then
104                 Call _sockets.Remove(var)
105             End If
106             Call _sockets.Add(var, New MapStream.MSWriter(var, size))
107
108             Return NetResponse.RFC_OK
109         End Function
110
111         <Protocol(API.Protocols.Destroy)>
112         Private Function __destroy(CA As Long, request As RequestStream, remote As System.Net.IPEndPoint) As RequestStream
113             Dim var As String = request.GetUTF8String
114
115             If _sockets.ContainsKey(var) Then
116                 Dim x = _sockets(var)
117
118                 Call _sockets.Remove(var)
119                 Call x.Free
120
121                 Return NetResponse.RFC_OK
122             Else
123                 Return NetResponse.RFC_TOKEN_INVALID
124             End If
125         End Function
126     End Class
127 End Namespace