1 #Region "Microsoft.VisualBasic::3ecc7823d5528014644c89ff4154d18f, Microsoft.VisualBasic.Core\ApplicationServices\Tools\MMFProtocol\Pipeline\API.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     '     Module API
35     
36     
37     '         Enum Protocols
38     
39     
40     
41     
42     '  
43     
44     '     Properties: Protocol
45     
46     '     Function: Delete, IsRef, (+2 OverloadsTryGetValue, WriteData
47     
48     
49     ' /********************************************************************************/
50
51 #End Region
52
53 Imports System.Text.RegularExpressions
54 Imports Microsoft.VisualBasic.Net.Http
55 Imports Microsoft.VisualBasic.Net.Protocols
56 Imports Microsoft.VisualBasic.Net.Protocols.Reflection
57
58 Namespace MMFProtocol.Pipeline
59
60     Public Module API
61
62         Public Const PeplinePort As Integer = 5687
63
64         Enum Protocols As Long
65             Allocation = 4556122
66             Destroy = -345639845
67         End Enum
68
69         Public ReadOnly Property Protocol As Long =
70             New Protocol(GetType(API.Protocols)).EntryPoint
71
72         Public Function Delete(var As StringOptional port As Integer = API.PeplinePort) As Boolean
73             Dim invoke As New Net.AsynInvoke("127.0.0.1", port)
74             Dim action As New RequestStream(API.Protocol, Protocols.Destroy, var)
75             Dim resp As RequestStream = invoke.SendMessage(action)
76             Return resp.Protocol = HTTP_RFC.RFC_OK
77         End Function
78
79         ''' <summary>
80         ''' 生成的映射位置为:  &lt;var>:&lt;ChunkSize>
81         ''' </summary>
82         ''' <param name="var"></param>
83         ''' <param name="value"></param>
84         ''' <returns></returns>
85         Public Function WriteData(var As String, value As RawStream, Optional port As Integer = API.PeplinePort) As Boolean
86             Dim buf As Byte() = value.Serialize
87             Dim chunkSize As Long = buf.Length
88             Dim ref As String = $"{var}:{chunkSize}"
89             Dim invoke As New Net.AsynInvoke("127.0.0.1", port)
90             Dim action As New RequestStream(API.Protocol, Protocols.Allocation, ref)
91             Dim resp As RequestStream = invoke.SendMessage(action)
92             Dim writer As New MapStream.MSWriter(var, chunkSize)
93
94             Call writer.WriteStream(buf)
95
96             Return True
97         End Function
98
99         ''' <summary>
100         ''' 
101         ''' </summary>
102         ''' <param name="var">$var or var</param>
103         ''' <returns></returns>
104         Public Function TryGetValue(var As StringAs Byte()
105             If var.First = "$"Then
106                 var = Mid(var, 2)
107             End If
108
109             Dim tokens As String() = var.Split(":"c)
110             Dim size As Long = Scripting.CTypeDynamic(Of Long)(tokens(1))
111             Dim reader As New MapStream.MSIOReader(tokens(Scan0), Nothing, size)
112             Dim buf As Byte() = reader.Read.byteData
113             Return buf
114         End Function
115
116         ''' <summary>
117         ''' 不存在的话会返回空值
118         ''' </summary>
119         ''' <typeparam name="T"></typeparam>
120         ''' <param name="var"></param>
121         ''' <returns></returns>
122         Public Function TryGetValue(Of T As RawStream)(var As StringAs T
123             Dim raw As Byte() = API.TryGetValue(var)
124             If raw.IsNullOrEmpty Then
125                 Return Nothing
126             End If
127
128             Dim obj As Object = Activator.CreateInstance(GetType(T), {raw})
129             Dim x As T = DirectCast(obj, T)
130             Return x
131         End Function
132
133         ''' <summary>
134         ''' 
135         ''' </summary>
136         ''' <param name="addr">$var:size</param>
137         ''' <returns></returns>
138         Public Function IsRef(addr As StringAs Boolean
139             Dim s As String = Regex.Match(addr, "\$.+?:\d+").Value
140             Return String.Equals(addr, s)
141         End Function
142     End Module
143 End Namespace