Skip to content

Commit 41c6b51

Browse files
Add byte conversion support for arguments
1 parent 63d20f5 commit 41c6b51

File tree

1 file changed

+95
-101
lines changed

1 file changed

+95
-101
lines changed

projects/client/RabbitMQ.Client/src/client/impl/WireFormatting.cs

Lines changed: 95 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,17 @@ public static decimal AmqpToDecimal(byte scale, uint unsignedMantissa)
5757
throw new SyntaxError("Unrepresentable AMQP decimal table field: " +
5858
"scale=" + scale);
5959
}
60-
return new decimal((int)(unsignedMantissa & 0x7FFFFFFF),
61-
0,
62-
0,
63-
((unsignedMantissa & 0x80000000) == 0) ? false : true,
64-
scale);
60+
61+
return new decimal(
62+
// The low 32 bits of a 96-bit integer
63+
lo: (int)(unsignedMantissa & 0x7FFFFFFF),
64+
// The middle 32 bits of a 96-bit integer.
65+
mid: 0,
66+
// The high 32 bits of a 96-bit integer.
67+
hi: 0,
68+
isNegative: (unsignedMantissa & 0x80000000) != 0,
69+
// A power of 10 ranging from 0 to 28.
70+
scale: scale);
6571
}
6672

6773
public static void DecimalToAmqp(decimal value, out byte scale, out int mantissa)
@@ -91,7 +97,7 @@ public static IList ReadArray(NetworkBinaryReader reader)
9197
{
9298
IList array = new List<object>();
9399
long arrayLength = reader.ReadUInt32();
94-
Stream backingStream = reader.BaseStream;
100+
var backingStream = reader.BaseStream;
95101
long startPosition = backingStream.Position;
96102
while ((backingStream.Position - startPosition) < arrayLength)
97103
{
@@ -129,7 +135,6 @@ public static object ReadFieldValue(NetworkBinaryReader reader)
129135
case 'F':
130136
value = ReadTable(reader);
131137
break;
132-
133138
case 'A':
134139
value = ReadArray(reader);
135140
break;
@@ -215,7 +220,7 @@ public static IDictionary<string, object> ReadTable(NetworkBinaryReader reader)
215220
IDictionary<string, object> table = new Dictionary<string, object>();
216221
long tableLength = reader.ReadUInt32();
217222

218-
Stream backingStream = reader.BaseStream;
223+
var backingStream = reader.BaseStream;
219224
long startPosition = backingStream.Position;
220225
while ((backingStream.Position - startPosition) < tableLength)
221226
{
@@ -247,7 +252,7 @@ public static void WriteArray(NetworkBinaryWriter writer, IList val)
247252
}
248253
else
249254
{
250-
Stream backingStream = writer.BaseStream;
255+
var backingStream = writer.BaseStream;
251256
long patchPosition = backingStream.Position;
252257
writer.Write((uint)0); // length of table - will be backpatched
253258
foreach (object entry in val)
@@ -264,93 +269,82 @@ public static void WriteArray(NetworkBinaryWriter writer, IList val)
264269

265270
public static void WriteDecimal(NetworkBinaryWriter writer, decimal value)
266271
{
267-
byte scale;
268-
int mantissa;
269-
DecimalToAmqp(value, out scale, out mantissa);
272+
DecimalToAmqp(value, out var scale, out var mantissa);
270273
WriteOctet(writer, scale);
271274
WriteLong(writer, (uint)mantissa);
272275
}
273276

274277
public static void WriteFieldValue(NetworkBinaryWriter writer, object value)
275278
{
276-
if (value == null)
277-
{
278-
WriteOctet(writer, (byte)'V');
279-
}
280-
else if (value is string)
281-
{
282-
WriteOctet(writer, (byte)'S');
283-
WriteLongstr(writer, Encoding.UTF8.GetBytes((string)value));
284-
}
285-
else if (value is byte[])
286-
{
287-
WriteOctet(writer, (byte)'S');
288-
WriteLongstr(writer, (byte[])value);
289-
}
290-
else if (value is int)
291-
{
292-
WriteOctet(writer, (byte)'I');
293-
writer.Write((int)value);
294-
}
295-
else if (value is decimal)
296-
{
297-
WriteOctet(writer, (byte)'D');
298-
WriteDecimal(writer, (decimal)value);
299-
}
300-
else if (value is AmqpTimestamp)
301-
{
302-
WriteOctet(writer, (byte)'T');
303-
WriteTimestamp(writer, (AmqpTimestamp)value);
304-
}
305-
else if (value is IDictionary)
306-
{
307-
WriteOctet(writer, (byte)'F');
308-
WriteTable(writer, (IDictionary)value);
309-
}
310-
else if (value is IList)
311-
{
312-
WriteOctet(writer, (byte)'A');
313-
WriteArray(writer, (IList)value);
314-
}
315-
else if (value is sbyte)
316-
{
317-
WriteOctet(writer, (byte)'b');
318-
writer.Write((sbyte)value);
319-
}
320-
else if (value is double)
321-
{
322-
WriteOctet(writer, (byte)'d');
323-
writer.Write((double)value);
324-
}
325-
else if (value is float)
326-
{
327-
WriteOctet(writer, (byte)'f');
328-
writer.Write((float)value);
329-
}
330-
else if (value is long)
331-
{
332-
WriteOctet(writer, (byte)'l');
333-
writer.Write((long)value);
334-
}
335-
else if (value is short)
279+
switch (value)
336280
{
337-
WriteOctet(writer, (byte)'s');
338-
writer.Write((short)value);
339-
}
340-
else if (value is bool)
341-
{
342-
WriteOctet(writer, (byte)'t');
343-
WriteOctet(writer, (byte)(((bool)value) ? 1 : 0));
344-
}
345-
else if (value is BinaryTableValue)
346-
{
347-
WriteOctet(writer, (byte)'x');
348-
WriteLongstr(writer, ((BinaryTableValue)value).Bytes);
349-
}
350-
else
351-
{
352-
throw new WireFormattingException("Value cannot appear as table value",
353-
value);
281+
case null:
282+
WriteOctet(writer, (byte)'V');
283+
break;
284+
case string val:
285+
WriteOctet(writer, (byte)'S');
286+
WriteLongstr(writer, Encoding.UTF8.GetBytes(val));
287+
break;
288+
case byte[] val:
289+
WriteOctet(writer, (byte)'S');
290+
WriteLongstr(writer, val);
291+
break;
292+
case int val:
293+
WriteOctet(writer, (byte)'I');
294+
writer.Write(val);
295+
break;
296+
case decimal val:
297+
WriteOctet(writer, (byte)'D');
298+
WriteDecimal(writer, val);
299+
break;
300+
case AmqpTimestamp val:
301+
WriteOctet(writer, (byte)'T');
302+
WriteTimestamp(writer, val);
303+
break;
304+
case IDictionary val:
305+
WriteOctet(writer, (byte)'F');
306+
WriteTable(writer, val);
307+
break;
308+
case IList val:
309+
WriteOctet(writer, (byte)'A');
310+
WriteArray(writer, val);
311+
break;
312+
case byte val:
313+
WriteOctet(writer, (byte)'b');
314+
writer.Write(val);
315+
break;
316+
case sbyte val:
317+
WriteOctet(writer, (byte)'b');
318+
writer.Write(val);
319+
break;
320+
case double val:
321+
WriteOctet(writer, (byte)'d');
322+
writer.Write(val);
323+
break;
324+
case float val:
325+
WriteOctet(writer, (byte)'f');
326+
writer.Write(val);
327+
break;
328+
case long val:
329+
WriteOctet(writer, (byte)'l');
330+
writer.Write(val);
331+
break;
332+
case short val:
333+
WriteOctet(writer, (byte)'s');
334+
writer.Write(val);
335+
break;
336+
case bool val:
337+
WriteOctet(writer, (byte)'t');
338+
WriteOctet(writer, (byte)(val ? 1 : 0));
339+
break;
340+
case BinaryTableValue val:
341+
WriteOctet(writer, (byte)'x');
342+
WriteLongstr(writer, val.Bytes);
343+
break;
344+
default:
345+
throw new WireFormattingException(
346+
$"Value of type '{value.GetType().Name}' cannot appear as table value",
347+
value);
354348
}
355349
}
356350

@@ -382,14 +376,16 @@ public static void WriteShort(NetworkBinaryWriter writer, ushort val)
382376

383377
public static void WriteShortstr(NetworkBinaryWriter writer, string val)
384378
{
385-
byte[] bytes = Encoding.UTF8.GetBytes(val);
386-
int len = bytes.Length;
387-
if (len > 255)
379+
var bytes = Encoding.UTF8.GetBytes(val);
380+
var length = bytes.Length;
381+
382+
if (length > 255)
388383
{
389384
throw new WireFormattingException("Short string too long; " +
390-
"UTF-8 encoded length=" + len + ", max=255");
385+
"UTF-8 encoded length=" + length + ", max=255");
391386
}
392-
writer.Write((byte)len);
387+
388+
writer.Write((byte)length);
393389
writer.Write(bytes);
394390
}
395391

@@ -415,15 +411,14 @@ public static void WriteTable(NetworkBinaryWriter writer, IDictionary val)
415411
}
416412
else
417413
{
418-
Stream backingStream = writer.BaseStream;
414+
var backingStream = writer.BaseStream;
419415
long patchPosition = backingStream.Position;
420416
writer.Write((uint)0); // length of table - will be backpatched
421417

422418
foreach (DictionaryEntry entry in val)
423419
{
424420
WriteShortstr(writer, entry.Key.ToString());
425-
object value = entry.Value;
426-
WriteFieldValue(writer, value);
421+
WriteFieldValue(writer, entry.Value);
427422
}
428423

429424
// Now, backpatch the table length.
@@ -457,15 +452,14 @@ public static void WriteTable(NetworkBinaryWriter writer, IDictionary<string, ob
457452
}
458453
else
459454
{
460-
Stream backingStream = writer.BaseStream;
455+
var backingStream = writer.BaseStream;
461456
long patchPosition = backingStream.Position;
462457
writer.Write((uint)0); // length of table - will be backpatched
463458

464-
foreach (KeyValuePair<string, object> entry in val)
459+
foreach (var entry in val)
465460
{
466461
WriteShortstr(writer, entry.Key);
467-
object value = entry.Value;
468-
WriteFieldValue(writer, value);
462+
WriteFieldValue(writer, entry.Value);
469463
}
470464

471465
// Now, backpatch the table length.

0 commit comments

Comments
 (0)