@@ -56,98 +56,103 @@ 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 ) ;
72
+
73
+ nw . Write ( header . ProtocolClassId ) ;
74
+ header . WriteTo ( nw , ( ulong ) bodyLength ) ;
62
75
63
- writer . Write ( header . ProtocolClassId ) ;
64
- header . WriteTo ( writer , ( ulong ) bodyLength ) ;
76
+ var bufferSegment = ms . GetBufferSegment ( ) ;
77
+ writer . Write ( ( uint ) bufferSegment . Count ) ;
78
+ writer . Write ( bufferSegment . Array , bufferSegment . Offset , bufferSegment . Count ) ;
65
79
}
66
80
}
67
81
68
82
public class BodySegmentOutboundFrame : OutboundFrame
69
83
{
84
+ private readonly byte [ ] body ;
85
+ private readonly int offset ;
86
+ private readonly int count ;
87
+
70
88
public BodySegmentOutboundFrame ( int channel , byte [ ] body , int offset , int count ) : base ( FrameType . FrameBody , channel )
71
89
{
72
- NetworkBinaryWriter writer = base . GetWriter ( ) ;
90
+ this . body = body ;
91
+ this . offset = offset ;
92
+ this . count = count ;
93
+ }
73
94
95
+ public override void WritePayload ( NetworkBinaryWriter writer )
96
+ {
97
+ writer . Write ( ( uint ) count ) ;
74
98
writer . Write ( body , offset , count ) ;
75
99
}
76
100
}
77
101
78
102
public class MethodOutboundFrame : OutboundFrame
79
103
{
104
+ private readonly MethodBase method ;
105
+
80
106
public MethodOutboundFrame ( int channel , MethodBase method ) : base ( FrameType . FrameMethod , channel )
81
107
{
82
- NetworkBinaryWriter writer = base . GetWriter ( ) ;
108
+ this . method = method ;
109
+ }
83
110
84
- writer . Write ( method . ProtocolClassId ) ;
85
- writer . Write ( method . ProtocolMethodId ) ;
111
+ public override void WritePayload ( NetworkBinaryWriter writer )
112
+ {
113
+ var ms = new MemoryStream ( ) ;
114
+ var nw = new NetworkBinaryWriter ( ms ) ;
86
115
87
- var argWriter = new MethodArgumentWriter ( writer ) ;
116
+ nw . Write ( method . ProtocolClassId ) ;
117
+ nw . Write ( method . ProtocolMethodId ) ;
88
118
119
+ var argWriter = new MethodArgumentWriter ( nw ) ;
89
120
method . WriteArgumentsTo ( argWriter ) ;
90
-
91
121
argWriter . Flush ( ) ;
122
+
123
+ var bufferSegment = ms . GetBufferSegment ( ) ;
124
+ writer . Write ( ( uint ) bufferSegment . Count ) ;
125
+ writer . Write ( bufferSegment . Array , bufferSegment . Offset , bufferSegment . Count ) ;
92
126
}
93
127
}
94
128
95
129
public class EmptyOutboundFrame : OutboundFrame
96
130
{
97
- private static readonly byte [ ] m_emptyByteArray = new byte [ 0 ] ;
98
-
99
131
public EmptyOutboundFrame ( ) : base ( FrameType . FrameHeartbeat , 0 )
100
132
{
101
- base . GetWriter ( ) . Write ( m_emptyByteArray ) ;
102
133
}
103
134
104
- public override string ToString ( )
135
+ public override void WritePayload ( NetworkBinaryWriter writer )
105
136
{
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 ( ) ) ;
137
+ writer . Write ( ( uint ) 0 ) ;
112
138
}
113
139
}
114
140
115
- public class OutboundFrame : Frame
141
+ public abstract class OutboundFrame : Frame
116
142
{
117
- private readonly MemoryStream m_accumulator ;
118
- private readonly NetworkBinaryWriter writer ;
119
-
120
143
public OutboundFrame ( FrameType type , int channel ) : base ( type , channel )
121
144
{
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
145
}
140
146
141
147
public void WriteTo ( NetworkBinaryWriter writer )
142
148
{
143
- var payload = m_accumulator . ToArray ( ) ;
144
-
145
149
writer . Write ( ( byte ) Type ) ;
146
150
writer . Write ( ( ushort ) Channel ) ;
147
- writer . Write ( ( uint ) payload . Length ) ;
148
- writer . Write ( payload ) ;
151
+ WritePayload ( writer ) ;
149
152
writer . Write ( ( byte ) Constants . FrameEnd ) ;
150
153
}
154
+
155
+ public abstract void WritePayload ( NetworkBinaryWriter writer ) ;
151
156
}
152
157
153
158
public class InboundFrame : Frame
@@ -252,16 +257,6 @@ public NetworkBinaryReader GetReader()
252
257
{
253
258
return new NetworkBinaryReader ( new MemoryStream ( base . Payload ) ) ;
254
259
}
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
260
}
266
261
267
262
public class Frame
@@ -288,7 +283,7 @@ public Frame(FrameType type, int channel, byte[] payload)
288
283
289
284
public override string ToString ( )
290
285
{
291
- return base . ToString ( ) + string . Format ( "(type={0}, channel={1}, {2} bytes of payload)" ,
286
+ return string . Format ( "(type={0}, channel={1}, {2} bytes of payload)" ,
292
287
Type ,
293
288
Channel ,
294
289
Payload == null
0 commit comments