1 #Region "Microsoft.VisualBasic::491ce3a6c44c7e0df2d48eb84a7da931, Microsoft.VisualBasic.Core\ApplicationServices\Tools\MMFProtocol\MapStream\MSWriter.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 MSWriter
35     
36     '         Constructor: (+1 OverloadsSub New
37     
38     '         FunctionToString
39     
40     '         Sub: WriteStream
41     
42     '     Class MMFStream
43     
44     '         Properties: byteData, udtBadge
45     
46     '         Constructor: (+2 OverloadsSub New
47     '         Function: Serialize, ToString
48     
49     
50     ' /********************************************************************************/
51
52 #End Region
53
54 Imports System.IO
55 Imports System.Runtime.Serialization.Formatters.Binary
56 Imports Microsoft.VisualBasic.Net.Protocols
57
58 Namespace MMFProtocol.MapStream
59
60 #Region "Nested Type Definitions"
61
62     ''' <summary>
63     ''' 
64     ''' </summary>
65     ''' <remarks>
66     ''' mmfServer的主要功能是创建并维护一个内存映射文件
67     ''' </remarks>
68     Public Class MSWriter : Inherits IMapBase
69
70         ''' <summary>
71         ''' 
72         ''' </summary>
73         ''' <param name="uri"></param>
74         ''' <remarks>对象实例会首先尝试以服务器的角色建立连接,当不成功的时候会以客户端的形式建立连接</remarks>
75         Sub New(uri As String, chunkSize As Long)
76             Call MyBase.New(uri, chunkSize)
77
78             Try
79                 _mmfileStream =
80                     MemoryMappedFiles.MemoryMappedFile.CreateNew(
81                     uri, chunkSize)
82             Catch ex As Exception
83                 _mmfileStream =
84                     MemoryMappedFiles.MemoryMappedFile.CreateOrOpen(
85                     uri, chunkSize)
86             Finally
87             End Try
88         End Sub
89
90         Public Sub WriteStream(byteData As Byte())
91             If Not byteData.IsNullOrEmpty Then
92                 Call _mmfileStream.CreateViewStream.Write(
93                     byteData, Scan0, byteData.Length)
94             End If
95         End Sub
96
97         Public Overrides Function ToString() As String
98             Return URI
99         End Function
100     End Class
101
102     <Serializable> Public Class MMFStream : Inherits RawStream
103
104         ''' <summary>
105         ''' Stamp; Update Badge
106         ''' </summary>
107         Public Property udtBadge As Long
108
109         ''' <summary>
110         ''' 内存映射文件中所存储的将要进行进程间交换的数据
111         ''' </summary>
112         ''' <remarks></remarks>
113         Public Property byteData As Byte()
114
115         Sub New()
116         End Sub
117
118         Sub New(rawStream As Byte())
119             Dim bytTmp As Byte() = New Byte(INT64 - 1) {}
120             Call Array.ConstrainedCopy(rawStream, Scan0, bytTmp, Scan0, bytTmp.Length)
121             udtBadge = BitConverter.ToInt64(bytTmp, Scan0)
122             Dim bytLen As Integer = rawStream.Length - bytTmp.Length
123             bytTmp = New Byte(bytLen - 1) {}
124             Call Array.ConstrainedCopy(rawStream, INT64, bytTmp, Scan0, bytLen)
125             byteData = bytTmp
126         End Sub
127
128         Public Overrides Function ToString() As String
129             Return $"{NameOf(udtBadge)}:={udtBadge} // {NameOf(byteData)}:={byteData.Length} bytes...."
130         End Function
131
132         Public Overrides Function Serialize() As Byte()
133             Dim ChunkBuffer As Byte() = New Byte(INT64 + byteData.Length - 1) {}
134             Call Array.ConstrainedCopy(BitConverter.GetBytes(udtBadge), Scan0, ChunkBuffer, Scan0, INT64)
135             Call Array.ConstrainedCopy(byteData, Scan0, ChunkBuffer, INT64, byteData.Length)
136
137             Return ChunkBuffer
138         End Function
139     End Class
140 #End Region
141 End Namespace