@@ -55,10 +55,8 @@ public class Command
55
55
// - 2 bytes of channel number
56
56
// - 4 bytes of frame payload length
57
57
// - 1 byte of payload trailer FrameEnd byte
58
- public const int EmptyFrameSize = 8 ;
59
-
60
- public byte [ ] m_body0 ;
61
- public IList < byte [ ] > m_bodyN ;
58
+ private const int EmptyFrameSize = 8 ;
59
+ private readonly MemoryStream m_body ;
62
60
private static readonly byte [ ] m_emptyByteArray = new byte [ 0 ] ;
63
61
64
62
static Command ( )
@@ -68,18 +66,26 @@ static Command()
68
66
69
67
public Command ( ) : this ( null , null , null )
70
68
{
69
+ m_body = new MemoryStream ( ) ;
71
70
}
72
71
73
72
public Command ( MethodBase method ) : this ( method , null , null )
74
73
{
74
+ m_body = new MemoryStream ( ) ;
75
75
}
76
76
77
77
public Command ( MethodBase method , ContentHeaderBase header , byte [ ] body )
78
78
{
79
79
Method = method ;
80
80
Header = header ;
81
- m_body0 = body ;
82
- m_bodyN = null ;
81
+ if ( body != null )
82
+ {
83
+ m_body = new MemoryStream ( body ) ;
84
+ }
85
+ else
86
+ {
87
+ m_body = new MemoryStream ( ) ;
88
+ }
83
89
}
84
90
85
91
public byte [ ] Body
@@ -93,7 +99,7 @@ public byte[] Body
93
99
94
100
public static void CheckEmptyFrameSize ( )
95
101
{
96
- var f = new Frame ( Constants . FrameBody , 0 , m_emptyByteArray ) ;
102
+ var f = new EmptyWriteFrame ( ) ;
97
103
var stream = new MemoryStream ( ) ;
98
104
var writer = new NetworkBinaryWriter ( stream ) ;
99
105
f . WriteTo ( writer ) ;
@@ -111,50 +117,20 @@ public static void CheckEmptyFrameSize()
111
117
112
118
public void AppendBodyFragment ( byte [ ] fragment )
113
119
{
114
- if ( m_body0 = = null )
120
+ if ( fragment ! = null )
115
121
{
116
- m_body0 = fragment ;
117
- }
118
- else
119
- {
120
- if ( m_bodyN == null )
121
- {
122
- m_bodyN = new List < byte [ ] > ( ) ;
123
- }
124
- m_bodyN . Add ( fragment ) ;
122
+ m_body . Write ( fragment , 0 , fragment . Length ) ;
125
123
}
126
124
}
127
125
128
126
public byte [ ] ConsolidateBody ( )
129
127
{
130
- if ( m_bodyN == null )
131
- {
132
- return m_body0 ?? m_emptyByteArray ;
133
- }
134
- else
135
- {
136
- int totalSize = m_body0 . Length ;
137
- foreach ( byte [ ] fragment in m_bodyN )
138
- {
139
- totalSize += fragment . Length ;
140
- }
141
- var result = new byte [ totalSize ] ;
142
- Array . Copy ( m_body0 , 0 , result , 0 , m_body0 . Length ) ;
143
- int offset = m_body0 . Length ;
144
- foreach ( byte [ ] fragment in m_bodyN )
145
- {
146
- Array . Copy ( fragment , 0 , result , offset , fragment . Length ) ;
147
- offset += fragment . Length ;
148
- }
149
- m_body0 = result ;
150
- m_bodyN = null ;
151
- return m_body0 ;
152
- }
128
+ return m_body . Length == 0 ? m_emptyByteArray : m_body . ToArray ( ) ;
153
129
}
154
130
155
131
public void Transmit ( int channelNumber , Connection connection )
156
132
{
157
- if ( Method . HasContent )
133
+ if ( Method . HasContent )
158
134
{
159
135
TransmitAsFrameSet ( channelNumber , connection ) ;
160
136
}
@@ -166,52 +142,25 @@ public void Transmit(int channelNumber, Connection connection)
166
142
167
143
public void TransmitAsSingleFrame ( int channelNumber , Connection connection )
168
144
{
169
- var frame = new Frame ( Constants . FrameMethod , channelNumber ) ;
170
- NetworkBinaryWriter writer = frame . GetWriter ( ) ;
171
- writer . Write ( ( ushort ) Method . ProtocolClassId ) ;
172
- writer . Write ( ( ushort ) Method . ProtocolMethodId ) ;
173
- var argWriter = new MethodArgumentWriter ( writer ) ;
174
- Method . WriteArgumentsTo ( argWriter ) ;
175
- argWriter . Flush ( ) ;
176
- connection . WriteFrame ( frame ) ;
145
+ connection . WriteFrame ( new MethodWriteFrame ( channelNumber , Method ) ) ;
177
146
}
178
147
179
148
public void TransmitAsFrameSet ( int channelNumber , Connection connection )
180
149
{
181
- var frame = new Frame ( Constants . FrameMethod , channelNumber ) ;
182
- NetworkBinaryWriter writer = frame . GetWriter ( ) ;
183
- writer . Write ( ( ushort ) Method . ProtocolClassId ) ;
184
- writer . Write ( ( ushort ) Method . ProtocolMethodId ) ;
185
- var argWriter = new MethodArgumentWriter ( writer ) ;
186
- Method . WriteArgumentsTo ( argWriter ) ;
187
- argWriter . Flush ( ) ;
188
-
189
- var frames = new List < Frame > ( ) ;
190
- frames . Add ( frame ) ;
191
-
150
+ var frames = new List < WriteFrame > ( ) ;
151
+ frames . Add ( new MethodWriteFrame ( channelNumber , Method ) ) ;
192
152
if ( Method . HasContent )
193
153
{
194
- byte [ ] body = Body ;
195
-
196
- frame = new Frame ( Constants . FrameHeader , channelNumber ) ;
197
- writer = frame . GetWriter ( ) ;
198
- writer . Write ( ( ushort ) Header . ProtocolClassId ) ;
199
- Header . WriteTo ( writer , ( ulong ) body . Length ) ;
200
- frames . Add ( frame ) ;
154
+ var body = ConsolidateBody ( ) ; // Cache, since the property is compiled.
201
155
156
+ frames . Add ( new HeaderWriteFrame ( channelNumber , Header , body . Length ) ) ;
202
157
var frameMax = ( int ) Math . Min ( int . MaxValue , connection . FrameMax ) ;
203
- int bodyPayloadMax = ( frameMax == 0 )
204
- ? body . Length
205
- : frameMax - EmptyFrameSize ;
158
+ var bodyPayloadMax = ( frameMax == 0 ) ? body . Length : frameMax - EmptyFrameSize ;
206
159
for ( int offset = 0 ; offset < body . Length ; offset += bodyPayloadMax )
207
160
{
208
- int remaining = body . Length - offset ;
209
-
210
- frame = new Frame ( Constants . FrameBody , channelNumber ) ;
211
- writer = frame . GetWriter ( ) ;
212
- writer . Write ( body , offset ,
213
- ( remaining < bodyPayloadMax ) ? remaining : bodyPayloadMax ) ;
214
- frames . Add ( frame ) ;
161
+ var remaining = body . Length - offset ;
162
+ var count = ( remaining < bodyPayloadMax ) ? remaining : bodyPayloadMax ;
163
+ frames . Add ( new BodySegmentWriteFrame ( channelNumber , body , offset , count ) ) ;
215
164
}
216
165
}
217
166
0 commit comments