@@ -56,98 +56,115 @@ namespace RabbitMQ.Client.Impl
56
56
{
57
57
public class HeaderOutboundFrame : OutboundFrame
58
58
{
59
+ private readonly ContentHeaderBase header ;
60
+ private readonly int bodyLength ;
61
+
59
62
public HeaderOutboundFrame ( int channel , ContentHeaderBase header , int bodyLength ) : base ( FrameType . FrameHeader , channel )
60
63
{
61
- NetworkBinaryWriter writer = base . GetWriter ( ) ;
64
+ this . header = header ;
65
+ this . bodyLength = bodyLength ;
66
+ }
67
+
68
+ public override void WritePayload ( NetworkBinaryWriter writer )
69
+ {
70
+ var ms = new MemoryStream ( ) ;
71
+ var nw = new NetworkBinaryWriter ( ms ) ;
62
72
63
- writer . Write ( header . ProtocolClassId ) ;
64
- header . WriteTo ( writer , ( ulong ) bodyLength ) ;
73
+ nw . Write ( header . ProtocolClassId ) ;
74
+ header . WriteTo ( nw , ( ulong ) bodyLength ) ;
75
+
76
+ #if CORECLR15
77
+ var payload = ms . ToArray ( ) ;
78
+ writer . Write ( ( uint ) payload . Length ) ;
79
+ writer . Write ( payload ) ;
80
+ #else
81
+ var buffer = ms . GetBuffer ( ) ;
82
+ writer . Write ( ( uint ) ms . Position ) ;
83
+ writer . Write ( buffer , 0 , ( int ) ms . Position ) ;
84
+ #endif
65
85
}
66
86
}
67
87
68
88
public class BodySegmentOutboundFrame : OutboundFrame
69
89
{
90
+ private readonly byte [ ] body ;
91
+ private readonly int offset ;
92
+ private readonly int count ;
93
+
70
94
public BodySegmentOutboundFrame ( int channel , byte [ ] body , int offset , int count ) : base ( FrameType . FrameBody , channel )
71
95
{
72
- NetworkBinaryWriter writer = base . GetWriter ( ) ;
96
+ this . body = body ;
97
+ this . offset = offset ;
98
+ this . count = count ;
99
+ }
73
100
101
+ public override void WritePayload ( NetworkBinaryWriter writer )
102
+ {
103
+ writer . Write ( ( uint ) count ) ;
74
104
writer . Write ( body , offset , count ) ;
75
105
}
76
106
}
77
107
78
108
public class MethodOutboundFrame : OutboundFrame
79
109
{
110
+ private readonly MethodBase method ;
111
+
80
112
public MethodOutboundFrame ( int channel , MethodBase method ) : base ( FrameType . FrameMethod , channel )
81
113
{
82
- NetworkBinaryWriter writer = base . GetWriter ( ) ;
114
+ this . method = method ;
115
+ }
83
116
84
- writer . Write ( method . ProtocolClassId ) ;
85
- writer . Write ( method . ProtocolMethodId ) ;
117
+ public override void WritePayload ( NetworkBinaryWriter writer )
118
+ {
119
+ var ms = new MemoryStream ( ) ;
120
+ var nw = new NetworkBinaryWriter ( ms ) ;
86
121
87
- var argWriter = new MethodArgumentWriter ( writer ) ;
122
+ nw . Write ( method . ProtocolClassId ) ;
123
+ nw . Write ( method . ProtocolMethodId ) ;
88
124
125
+ var argWriter = new MethodArgumentWriter ( nw ) ;
89
126
method . WriteArgumentsTo ( argWriter ) ;
90
-
91
127
argWriter . Flush ( ) ;
128
+
129
+ #if CORECLR15
130
+ var payload = ms . ToArray ( ) ;
131
+ writer . Write ( ( uint ) payload . Length ) ;
132
+ writer . Write ( payload ) ;
133
+ #else
134
+ var buffer = ms . GetBuffer ( ) ;
135
+ writer . Write ( ( uint ) ms . Position ) ;
136
+ writer . Write ( buffer , 0 , ( int ) ms . Position ) ;
137
+ #endif
92
138
}
93
139
}
94
140
95
141
public class EmptyOutboundFrame : OutboundFrame
96
142
{
97
- private static readonly byte [ ] m_emptyByteArray = new byte [ 0 ] ;
98
-
99
143
public EmptyOutboundFrame ( ) : base ( FrameType . FrameHeartbeat , 0 )
100
144
{
101
- base . GetWriter ( ) . Write ( m_emptyByteArray ) ;
102
145
}
103
146
104
- public override string ToString ( )
147
+ public override void WritePayload ( NetworkBinaryWriter writer )
105
148
{
106
- return base . ToString ( ) + string . Format ( "(type={0}, channel={1}, {2} bytes of payload)" ,
107
- Type ,
108
- Channel ,
109
- Payload == null
110
- ? "(null)"
111
- : Payload . Length . ToString ( ) ) ;
149
+ writer . Write ( ( uint ) 0 ) ;
112
150
}
113
151
}
114
152
115
- public class OutboundFrame : Frame
153
+ public abstract class OutboundFrame : Frame
116
154
{
117
- private readonly MemoryStream m_accumulator ;
118
- private readonly NetworkBinaryWriter writer ;
119
-
120
155
public OutboundFrame ( FrameType type , int channel ) : base ( type , channel )
121
156
{
122
- m_accumulator = new MemoryStream ( ) ;
123
- writer = new NetworkBinaryWriter ( m_accumulator ) ;
124
- }
125
-
126
- public NetworkBinaryWriter GetWriter ( )
127
- {
128
- return writer ;
129
- }
130
-
131
- public override string ToString ( )
132
- {
133
- return base . ToString ( ) + string . Format ( "(type={0}, channel={1}, {2} bytes of payload)" ,
134
- Type ,
135
- Channel ,
136
- Payload == null
137
- ? "(null)"
138
- : Payload . Length . ToString ( ) ) ;
139
157
}
140
158
141
159
public void WriteTo ( NetworkBinaryWriter writer )
142
160
{
143
- var payload = m_accumulator . ToArray ( ) ;
144
-
145
161
writer . Write ( ( byte ) Type ) ;
146
162
writer . Write ( ( ushort ) Channel ) ;
147
- writer . Write ( ( uint ) payload . Length ) ;
148
- writer . Write ( payload ) ;
163
+ WritePayload ( writer ) ;
149
164
writer . Write ( ( byte ) Constants . FrameEnd ) ;
150
165
}
166
+
167
+ public abstract void WritePayload ( NetworkBinaryWriter writer ) ;
151
168
}
152
169
153
170
public class InboundFrame : Frame
@@ -252,16 +269,6 @@ public NetworkBinaryReader GetReader()
252
269
{
253
270
return new NetworkBinaryReader ( new MemoryStream ( base . Payload ) ) ;
254
271
}
255
-
256
- public override string ToString ( )
257
- {
258
- return base . ToString ( ) + string . Format ( "(type={0}, channel={1}, {2} bytes of payload)" ,
259
- base . Type ,
260
- base . Channel ,
261
- base . Payload == null
262
- ? "(null)"
263
- : base . Payload . Length . ToString ( ) ) ;
264
- }
265
272
}
266
273
267
274
public class Frame
@@ -288,7 +295,7 @@ public Frame(FrameType type, int channel, byte[] payload)
288
295
289
296
public override string ToString ( )
290
297
{
291
- return base . ToString ( ) + string . Format ( "(type={0}, channel={1}, {2} bytes of payload)" ,
298
+ return string . Format ( "(type={0}, channel={1}, {2} bytes of payload)" ,
292
299
Type ,
293
300
Channel ,
294
301
Payload == null
0 commit comments