diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/BaseDataStreamMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/BaseDataStreamMarshaller.cs index 9b1e9ad23e..7beb349fd4 100755 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/BaseDataStreamMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/BaseDataStreamMarshaller.cs @@ -117,12 +117,12 @@ namespace ActiveMQ.OpenWire /* if (wireFormat.isCacheEnabled()) { if (bs.ReadBoolean()) { - short index = dataInReadShort(dataIn)Int16(); + short index = dataIndataIn.ReadInt16()Int16(); DataStructure value = wireFormat.UnmarshalNestedObject(dataIn, bs); wireFormat.setInUnmarshallCache(index, value); return value; } else { - short index = ReadShort(dataIn); + short index = dataIn.ReadInt16(); return wireFormat.getFromUnmarshallCache(index); } } else { @@ -165,10 +165,10 @@ namespace ActiveMQ.OpenWire if (wireFormat.isCacheEnabled()) { Short index = wireFormat.getMarshallCacheIndex(o); if (bs.ReadBoolean()) { - WriteShort(index.shortValue(), dataOut); + dataOut.Write(index.shortValue(), dataOut); wireFormat.Marshal2NestedObject(o, dataOut, bs); } else { - WriteShort(index.shortValue(), dataOut); + dataOut.Write(index.shortValue(), dataOut); } } else { wireFormat.Marshal2NestedObject(o, dataOut, bs); @@ -189,7 +189,7 @@ namespace ActiveMQ.OpenWire } else { - return ReadUTF8(dataIn); + return dataIn.ReadString(); } } else @@ -200,7 +200,7 @@ namespace ActiveMQ.OpenWire protected virtual String ReadAsciiString(BinaryReader dataIn) { - int size = ReadShort(dataIn); + int size = dataIn.ReadInt16(); byte[] data = new byte[size]; dataIn.Read(data, 0, size); char[] text = new char[size]; @@ -218,41 +218,34 @@ namespace ActiveMQ.OpenWire { int strlen = value.Length; - // TODO until we get UTF8 working, lets just force ASCII - bs.WriteBoolean(true); - return strlen + 2; - - - /* - int utflen = 0; - int c = 0; - bool isOnlyAscii = true; - char[] charr = value.ToCharArray(); - for (int i = 0; i < strlen; i++) - { - c = charr[i]; - if ((c >= 0x0001) && (c <= 0x007F)) - { - utflen++; - } - else if (c > 0x07FF) - { - utflen += 3; - isOnlyAscii = false; - } - else - { - isOnlyAscii = false; - utflen += 2; - } - } - - if (utflen >= Int16.MaxValue) - throw new IOException("Encountered a String value that is too long to encode."); - - bs.WriteBoolean(isOnlyAscii); - return utflen + 2; - */ + int utflen = 0; + int c = 0; + bool isOnlyAscii = true; + char[] charr = value.ToCharArray(); + for (int i = 0; i < strlen; i++) + { + c = charr[i]; + if ((c >= 0x0001) && (c <= 0x007F)) + { + utflen++; + } + else if (c > 0x07FF) + { + utflen += 3; + isOnlyAscii = false; + } + else + { + isOnlyAscii = false; + utflen += 2; + } + } + + if (utflen >= Int16.MaxValue) + throw new IOException("Encountered a String value that is too long to encode."); + + bs.WriteBoolean(isOnlyAscii); + return utflen + 2; } else { @@ -267,101 +260,21 @@ namespace ActiveMQ.OpenWire // If we verified it only holds ascii values if (bs.ReadBoolean()) { - WriteShort((short) value.Length, dataOut); + dataOut.Write((short) value.Length); // now lets write the bytes char[] chars = value.ToCharArray(); for (int i = 0; i < chars.Length; i++) { - WriteByte((byte) chars[i], dataOut); + dataOut.Write((byte)(chars[i]&0xFF00>>8)); } } else { - // TODO how should we properly write a String so that Java will grok it??? dataOut.Write(value); } } } - - public static byte ReadByte(BinaryReader dataIn) - { - return dataIn.ReadByte(); - } - - public static char ReadChar(BinaryReader dataIn) - { - return (char) ReadShort(dataIn); - } - - public static short ReadShort(BinaryReader dataIn) - { - return SwitchEndian(dataIn.ReadInt16()); - } - - public static int ReadInt(BinaryReader dataIn) - { - return SwitchEndian(dataIn.ReadInt32()); - } - - public static long ReadLong(BinaryReader dataIn) - { - return SwitchEndian(dataIn.ReadInt64()); - } - - public static void WriteByte(byte value, BinaryWriter dataOut) - { - dataOut.Write(value); - } - - public static void WriteChar(char value, BinaryWriter dataOut) - { - dataOut.Write(SwitchEndian((short) value)); - } - - public static void WriteShort(short value, BinaryWriter dataOut) - { - dataOut.Write(SwitchEndian(value)); - } - - public static void WriteInt(int value, BinaryWriter dataOut) - { - dataOut.Write(SwitchEndian(value)); - } - - public static void WriteLong(long value, BinaryWriter dataOut) - { - dataOut.Write(SwitchEndian(value)); - } - - - /// - /// Switches from one endian to the other - /// - public static int SwitchEndian(int x) - { - return ((x << 24) | ((x & 0xff00) << 8) | ((x & 0xff0000) >> 8) | (x >> 24)); - } - - public static short SwitchEndian(short x) - { - int low = x & 0xff; - int high = x & 0xff00; - return(short)(high >> 8 | low << 8); - } - - public static long SwitchEndian(long x) - { - long answer = 0; - for (int i = 0; i < 8; i++) - { - long lowest = x & 0xff; - x >>= 8; - answer <<= 8; - answer += lowest; - } - return answer; - } - + public virtual int TightMarshalLong1(OpenWireFormat wireFormat, long o, BooleanStream bs) { if (o == 0L) @@ -404,18 +317,18 @@ namespace ActiveMQ.OpenWire { if (bs.ReadBoolean()) { - WriteLong(o, dataOut); + dataOut.Write(o); } else { - WriteInt((int) o, dataOut); + dataOut.Write((int)o); } } else { if (bs.ReadBoolean()) { - WriteShort((short) o, dataOut); + dataOut.Write((short)o); } } } @@ -425,18 +338,18 @@ namespace ActiveMQ.OpenWire { if (bs.ReadBoolean()) { - return ReadLong(dataIn); + return dataIn.ReadInt64(); // dataIn.ReadInt64(); } else { - return ReadInt(dataIn); + return dataIn.ReadInt32(); } } else { if (bs.ReadBoolean()) { - return ReadShort(dataIn); + return dataIn.ReadInt16(); } else { @@ -475,7 +388,7 @@ namespace ActiveMQ.OpenWire { if (bs.ReadBoolean()) { - WriteShort((short) objects.Length, dataOut); + dataOut.Write((short) objects.Length); for (int i = 0; i < objects.Length; i++) { TightMarshalNestedObject2(wireFormat, objects[i], dataOut, bs); @@ -487,7 +400,7 @@ namespace ActiveMQ.OpenWire { if (flag) { - int size = ReadInt(dataIn); + int size = dataIn.ReadInt32(); return dataIn.ReadBytes(size); } else @@ -498,7 +411,7 @@ namespace ActiveMQ.OpenWire protected virtual byte[] ReadBytes(BinaryReader dataIn) { - int size = ReadInt(dataIn); + int size = dataIn.ReadInt32(); return dataIn.ReadBytes(size); } @@ -509,7 +422,7 @@ namespace ActiveMQ.OpenWire protected virtual void WriteBytes(byte[] command, BinaryWriter dataOut) { - WriteInt(command.Length, dataOut); + dataOut.Write(command.Length); dataOut.Write(command); } @@ -526,7 +439,7 @@ namespace ActiveMQ.OpenWire answer.Message = TightUnmarshalString(dataIn, bs); if (wireFormat.StackTraceEnabled) { - short length = ReadShort(dataIn); + short length = dataIn.ReadInt16(); StackTraceElement[] stackTrace = new StackTraceElement[length]; for (int i = 0; i < stackTrace.Length; i++) { @@ -534,7 +447,7 @@ namespace ActiveMQ.OpenWire element.ClassName = TightUnmarshalString(dataIn, bs); element.MethodName = TightUnmarshalString(dataIn, bs); element.FileName = TightUnmarshalString(dataIn, bs); - element.LineNumber = ReadInt(dataIn); + element.LineNumber = dataIn.ReadInt32(); stackTrace[i] = element; } answer.StackTraceElements = stackTrace; @@ -593,7 +506,7 @@ namespace ActiveMQ.OpenWire if (wireFormat.StackTraceEnabled) { StackTraceElement[] stackTrace = o.StackTraceElements; - WriteShort((short) stackTrace.Length, dataOut); + dataOut.Write((short) stackTrace.Length); for (int i = 0; i < stackTrace.Length; i++) { @@ -601,7 +514,7 @@ namespace ActiveMQ.OpenWire TightMarshalString2(element.ClassName, dataOut, bs); TightMarshalString2(element.MethodName, dataOut, bs); TightMarshalString2(element.FileName, dataOut, bs); - WriteInt(element.LineNumber, dataOut); + dataOut.Write(element.LineNumber); } TightMarshalBrokerError2(wireFormat, o.Cause, dataOut, bs); } @@ -620,7 +533,7 @@ namespace ActiveMQ.OpenWire else { MemoryStream memoryStream = new MemoryStream(); - MarshalPrimitiveMap(map, new BinaryWriter(memoryStream)); + MarshalPrimitiveMap(map, new OpenWireBinaryWriter(memoryStream)); return memoryStream.GetBuffer(); } } @@ -628,15 +541,15 @@ namespace ActiveMQ.OpenWire { if (map == null) { - WriteInt(-1, dataOut); + dataOut.Write((int)-1); } else { - WriteInt(map.Count, dataOut); + dataOut.Write(map.Count); foreach (DictionaryEntry entry in map) { String name = (String) entry.Key; - WriteUTF8(name, dataOut); + dataOut.Write(name); Object value = entry.Value; MarshalPrimitive(dataOut, value); } @@ -655,13 +568,13 @@ namespace ActiveMQ.OpenWire } else { - return UnmarshalPrimitiveMap(new BinaryReader(new MemoryStream(data))); + return UnmarshalPrimitiveMap(new OpenWireBinaryReader(new MemoryStream(data))); } } public static IDictionary UnmarshalPrimitiveMap(BinaryReader dataIn) { - int size = ReadInt(dataIn); + int size = dataIn.ReadInt32(); if (size < 0) { return null; @@ -671,7 +584,7 @@ namespace ActiveMQ.OpenWire IDictionary answer = new Hashtable(size); for (int i=0; i < size; i++) { - String name = ReadUTF8(dataIn); + String name = dataIn.ReadString(); answer[name] = UnmarshalPrimitive(dataIn); } return answer; @@ -683,59 +596,59 @@ namespace ActiveMQ.OpenWire { if (value == null) { - WriteByte(NULL, dataOut); + dataOut.Write(NULL); } else if (value is bool) { - WriteByte(BOOLEAN_TYPE, dataOut); - WriteBoolean((bool) value, dataOut); + dataOut.Write(BOOLEAN_TYPE); + dataOut.Write((bool) value); } else if (value is byte) { - WriteByte(BYTE_TYPE, dataOut); - WriteByte(((Byte)value), dataOut); + dataOut.Write(BYTE_TYPE); + dataOut.Write(((Byte)value)); } else if (value is char) { - WriteByte(CHAR_TYPE, dataOut); - WriteChar((char) value, dataOut); + dataOut.Write(CHAR_TYPE); + dataOut.Write((char) value); } else if (value is short) { - WriteByte(SHORT_TYPE, dataOut); - WriteShort((short) value, dataOut); + dataOut.Write(SHORT_TYPE); + dataOut.Write((short) value); } else if (value is int) { - WriteByte(INTEGER_TYPE, dataOut); - WriteInt((int) value, dataOut); + dataOut.Write(INTEGER_TYPE); + dataOut.Write((int) value); } else if (value is long) { - WriteByte(LONG_TYPE, dataOut); - WriteLong((long) value, dataOut); + dataOut.Write(LONG_TYPE); + dataOut.Write((long) value); } else if (value is float) { - WriteByte(FLOAT_TYPE, dataOut); - WriteFloat((float) value, dataOut); + dataOut.Write(FLOAT_TYPE); + dataOut.Write((float) value); } else if (value is double) { - WriteByte(DOUBLE_TYPE, dataOut); - WriteDouble((double) value, dataOut); + dataOut.Write(DOUBLE_TYPE); + dataOut.Write((double) value); } else if (value is byte[]) { byte[] data = (byte[]) value; - WriteByte(BYTE_ARRAY_TYPE, dataOut); - WriteInt(data.Length, dataOut); + dataOut.Write(BYTE_ARRAY_TYPE); + dataOut.Write(data.Length); dataOut.Write(data); } else if (value is string) { - WriteByte(STRING_TYPE, dataOut); - WriteUTF8((string) value, dataOut); + dataOut.Write(STRING_TYPE); + dataOut.Write((string) value); } else { @@ -746,25 +659,25 @@ namespace ActiveMQ.OpenWire public static Object UnmarshalPrimitive(BinaryReader dataIn) { Object value=null; - switch (ReadByte(dataIn)) + switch (dataIn.ReadByte()) { case BYTE_TYPE: - value = ReadByte(dataIn); + value = dataIn.ReadByte(); break; case BOOLEAN_TYPE: - value = ReadBoolean(dataIn); + value = dataIn.ReadBoolean(); break; case CHAR_TYPE: - value = ReadChar(dataIn); + value = dataIn.ReadChar(); break; case SHORT_TYPE: - value = ReadShort(dataIn); + value = dataIn.ReadInt16(); break; case INTEGER_TYPE: - value = ReadInt(dataIn); + value = dataIn.ReadInt32(); break; case LONG_TYPE: - value = ReadLong(dataIn); + value = dataIn.ReadInt64(); break; case FLOAT_TYPE: value = ReadFloat(dataIn); @@ -773,13 +686,13 @@ namespace ActiveMQ.OpenWire value = ReadDouble(dataIn); break; case BYTE_ARRAY_TYPE: - int size = ReadInt(dataIn); + int size = dataIn.ReadInt32(); byte[] data = new byte[size]; dataIn.Read(data, 0, size); value = data; break; case STRING_TYPE: - value = ReadUTF8(dataIn); + value = dataIn.ReadString(); break; } return value; @@ -824,152 +737,6 @@ namespace ActiveMQ.OpenWire dataOut.Write(value); } - - public static void WriteUTF8(String text, BinaryWriter dataOut) - { - if (text != null) - { - int strlen = text.Length; - int utflen = 0; - int c, count = 0; - - char[] charr = text.ToCharArray(); - - for (int i = 0; i < strlen; i++) - { - c = charr[i]; - if ((c >= 0x0001) && (c <= 0x007F)) - { - utflen++; - } - else if (c > 0x07FF) - { - utflen += 3; - } - else - { - utflen += 2; - } - } - - WriteInt(utflen, dataOut); - byte[] bytearr = new byte[utflen]; - /* - byte[] bytearr = new byte[utflen + 4]; - bytearr[count++] = (byte) ((utflen >>> 24) & 0xFF); - bytearr[count++] = (byte) ((utflen >>> 16) & 0xFF); - bytearr[count++] = (byte) ((utflen >>> 8) & 0xFF); - bytearr[count++] = (byte) ((utflen >>> 0) & 0xFF); - */ - for (int i = 0; i < strlen; i++) - { - c = charr[i]; - if ((c >= 0x0001) && (c <= 0x007F)) - { - bytearr[count++] = (byte) c; - } - else if (c > 0x07FF) - { - bytearr[count++] = (byte) (0xE0 | ((c >> 12) & 0x0F)); - bytearr[count++] = (byte) (0x80 | ((c >> 6) & 0x3F)); - bytearr[count++] = (byte) (0x80 | ((c >> 0) & 0x3F)); - } - else - { - bytearr[count++] = (byte) (0xC0 | ((c >> 6) & 0x1F)); - bytearr[count++] = (byte) (0x80 | ((c >> 0) & 0x3F)); - } - } - dataOut.Write(bytearr); - - } - else - { - WriteInt(-1, dataOut); - } - } - - public static String ReadUTF8(BinaryReader dataIn) - { - int utflen = ReadInt(dataIn); - if (utflen > -1) - { - StringBuilder str = new StringBuilder(utflen); - - byte[] bytearr = new byte[utflen]; - int c, char2, char3; - int count = 0; - - dataIn.Read(bytearr, 0, utflen); - - while (count < utflen) - { - c = bytearr[count] & 0xff; - switch (c >> 4) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - /* 0xxxxxxx */ - count++; - str.Append((char) c); - break; - case 12: - case 13: - /* 110x xxxx 10xx xxxx */ - count += 2; - if (count > utflen) - { - throw CreateDataFormatException(); - } - char2 = bytearr[count - 1]; - if ((char2 & 0xC0) != 0x80) - { - throw CreateDataFormatException(); - } - str.Append((char) (((c & 0x1F) << 6) | (char2 & 0x3F))); - break; - case 14: - /* 1110 xxxx 10xx xxxx 10xx xxxx */ - count += 3; - if (count > utflen) - { - throw CreateDataFormatException(); - } - char2 = bytearr[count - 2]; - char3 = bytearr[count - 1]; - if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80)) - { - throw CreateDataFormatException(); - } - str.Append((char) (((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0))); - break; - default : - /* 10xx xxxx, 1111 xxxx */ - throw CreateDataFormatException(); - } - } -// The number of chars produced may be less than utflen - return str.ToString(); - } - else - { - return null; - } - } - - private static Exception CreateDataFormatException() - { - // TODO: implement a better exception - return new Exception("Data format error!"); - } - - /// /// Converts the object to a String /// diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/BooleanStream.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/BooleanStream.cs index 0ae788341c..9b39b5bdbd 100755 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/BooleanStream.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/BooleanStream.cs @@ -79,7 +79,7 @@ namespace ActiveMQ.OpenWire dataOut.Write((byte)arrayLimit); } else { dataOut.Write((byte)0x80); - BaseDataStreamMarshaller.WriteShort(arrayLimit, dataOut); + dataOut.Write(arrayLimit); } dataOut.Write(data, 0, arrayLimit); Clear(); @@ -87,11 +87,11 @@ namespace ActiveMQ.OpenWire public void Unmarshal(BinaryReader dataIn) { - arrayLimit = (short)(BaseDataStreamMarshaller.ReadByte(dataIn) & 0xFF); + arrayLimit = (short)(dataIn.ReadByte() & 0xFF); if ( arrayLimit == 0xC0 ) { - arrayLimit = (short)(BaseDataStreamMarshaller.ReadByte(dataIn) & 0xFF); + arrayLimit = (short)(dataIn.ReadByte() & 0xFF); } else if( arrayLimit == 0x80 ) { - arrayLimit = BaseDataStreamMarshaller.ReadShort(dataIn); + arrayLimit = dataIn.ReadInt16(); } if( data.Length < arrayLimit ) { data = new byte[arrayLimit]; diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/EndianSupport.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/EndianSupport.cs new file mode 100644 index 0000000000..2e10b70ef7 --- /dev/null +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/EndianSupport.cs @@ -0,0 +1,95 @@ +/* + * Copyright 2006 The Apache Software Foundation or its licensors, as + * applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +using System.IO; + +namespace ActiveMQ.OpenWire +{ + /// + /// Support class that switches from one endian to the other. + /// + public class EndianSupport + { + + public static char SwitchEndian(char x) + { + return (char) ( + (((char)( (byte)(x) )) << 8 ) | + (((char)( (byte)(x >> 8) )) ) + ); + } + + public static short SwitchEndian(short x) + { + return (short) ( + (((short)( (byte)(x) )) << 8 ) | + (((short)( (byte)(x >> 8) )) ) + ); + } + + public static ushort SwitchEndian(ushort x) + { + return (ushort) ( + (((ushort)( (byte)(x) )) << 8 ) | + (((ushort)( (byte)(x >> 8) )) ) + ); + } + + public static int SwitchEndian(int x) + { + return + (((int)( (byte)(x) )) << 24 ) | + (((int)( (byte)(x >> 8) )) << 16 ) | + (((int)( (byte)(x >> 16) )) << 8 ) | + (((int)( (byte)(x >> 24) )) ); + } + + public static uint SwitchEndian(uint x) + { + return + (((uint)( (byte)(x ) )) << 24 ) | + (((uint)( (byte)(x >> 8) )) << 16 ) | + (((uint)( (byte)(x >> 16) )) << 8 ) | + (((uint)( (byte)(x >> 24) )) ); + } + + public static long SwitchEndian(long x) + { + return + (((long)( (byte)(x ) )) << 56 ) | + (((long)( (byte)(x >> 8) )) << 48 ) | + (((long)( (byte)(x >> 16) )) << 40 ) | + (((long)( (byte)(x >> 24) )) << 32 ) | + (((long)( (byte)(x >> 32) )) << 24 ) | + (((long)( (byte)(x >> 40) )) << 16 ) | + (((long)( (byte)(x >> 48) )) << 8 ) | + (((long)( (byte)(x >> 56) )) ); + } + + public static ulong SwitchEndian(ulong x) + { + return + (((ulong)( (byte)(x ) )) << 56 ) | + (((ulong)( (byte)(x >> 8) )) << 48 ) | + (((ulong)( (byte)(x >> 16) )) << 40 ) | + (((ulong)( (byte)(x >> 24) )) << 32 ) | + (((ulong)( (byte)(x >> 32) )) << 24 ) | + (((ulong)( (byte)(x >> 40) )) << 16 ) | + (((ulong)( (byte)(x >> 48) )) << 8 ) | + (((ulong)( (byte)(x >> 56) )) ); + } + } +} diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/OpenWireBinaryReader.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/OpenWireBinaryReader.cs new file mode 100644 index 0000000000..be3d968bca --- /dev/null +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/OpenWireBinaryReader.cs @@ -0,0 +1,218 @@ +/* + * Copyright 2006 The Apache Software Foundation or its licensors, as + * applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +using System; +using System.IO; +using System.Text; + +namespace ActiveMQ.OpenWire +{ + /// + /// A BinaryWriter that switches the endian orientation of the read opperations so that they + /// are compatible with marshalling used by OpenWire. + /// + public class OpenWireBinaryReader : BinaryReader + { + + public OpenWireBinaryReader(Stream input) : base(input) + { + } + + /// + /// Method Read + /// + /// An int + /// A char[] + /// An int + /// An int + public override int Read(char[] buffer, int index, int count) + { + int size = base.Read(buffer, index, count); + for( int i=0; i < size; i++ ) { + buffer[index+i] = EndianSupport.SwitchEndian(buffer[index+i]); + } + return size; + } + + /// + /// Method ReadChars + /// + /// A char[] + /// An int + public override char[] ReadChars(int count) + { + char[] rc = base.ReadChars(count); + if( rc!=null ) { + for( int i=0; i < rc.Length; i++ ) { + rc[i] = EndianSupport.SwitchEndian(rc[i]); + } + } + return rc; + } + + /// + /// Method ReadInt16 + /// + /// A short + public override short ReadInt16() + { + return EndianSupport.SwitchEndian(base.ReadInt16()); + } + + /// + /// Method ReadChar + /// + /// A char + public override char ReadChar() + { + return EndianSupport.SwitchEndian(base.ReadChar()); + } + + /// + /// Method ReadInt64 + /// + /// A long + public override long ReadInt64() + { + return EndianSupport.SwitchEndian(base.ReadInt64()); + } + + /// + /// Method ReadUInt64 + /// + /// An ulong + public override ulong ReadUInt64() + { + return EndianSupport.SwitchEndian(base.ReadUInt64()); + } + + /// + /// Method ReadUInt32 + /// + /// An uint + public override uint ReadUInt32() + { + return EndianSupport.SwitchEndian(base.ReadUInt32()); + } + + /// + /// Method ReadUInt16 + /// + /// An ushort + public override ushort ReadUInt16() + { + return EndianSupport.SwitchEndian(base.ReadUInt16()); + } + + /// + /// Method ReadInt32 + /// + /// An int + public override int ReadInt32() + { + int x = base.ReadInt32(); + int y = EndianSupport.SwitchEndian(x); + return y; + } + + /// + /// Method ReadString + /// + /// A string + public override String ReadString() + { + short utflen = ReadInt16(); + if (utflen > -1) + { + StringBuilder str = new StringBuilder(utflen); + + byte[] bytearr = new byte[utflen]; + int c, char2, char3; + int count = 0; + + Read(bytearr, 0, utflen); + + while (count < utflen) + { + c = bytearr[count] & 0xff; + switch (c >> 4) + { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + /* 0xxxxxxx */ + count++; + str.Append((char) c); + break; + case 12: + case 13: + /* 110x xxxx 10xx xxxx */ + count += 2; + if (count > utflen) + { + throw CreateDataFormatException(); + } + char2 = bytearr[count - 1]; + if ((char2 & 0xC0) != 0x80) + { + throw CreateDataFormatException(); + } + str.Append((char) (((c & 0x1F) << 6) | (char2 & 0x3F))); + break; + case 14: + /* 1110 xxxx 10xx xxxx 10xx xxxx */ + count += 3; + if (count > utflen) + { + throw CreateDataFormatException(); + } + char2 = bytearr[count - 2]; + char3 = bytearr[count - 1]; + if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80)) + { + throw CreateDataFormatException(); + } + str.Append((char) (((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0))); + break; + default : + /* 10xx xxxx, 1111 xxxx */ + throw CreateDataFormatException(); + } + } + // The number of chars produced may be less than utflen + return str.ToString(); + } + else + { + return null; + } + } + + private static Exception CreateDataFormatException() + { + // TODO: implement a better exception + return new IOException("Data format error!"); + } + + + } +} + diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/OpenWireBinaryWriter.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/OpenWireBinaryWriter.cs new file mode 100644 index 0000000000..4c1016e226 --- /dev/null +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/OpenWireBinaryWriter.cs @@ -0,0 +1,194 @@ +/* + * Copyright 2006 The Apache Software Foundation or its licensors, as + * applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +using ActiveMQ.Commands; +using System; +using System.Collections; +using System.IO; +using System.Text; + +namespace ActiveMQ.OpenWire +{ + /// + /// A BinaryWriter that switches the endian orientation of the write opperations so that they + /// are compatible with marshalling used by OpenWire. + /// + public class OpenWireBinaryWriter : BinaryWriter + { + + public OpenWireBinaryWriter(Stream output) : base(output) + { + } + + /// + /// Method Write + /// + /// A long + public override void Write(long value) + { + base.Write(EndianSupport.SwitchEndian(value)); + } + + /// + /// Method Write + /// + /// An ushort + public override void Write(ushort value) + { + base.Write(EndianSupport.SwitchEndian(value)); + } + + /// + /// Method Write + /// + /// An int + public override void Write(int value) + { + int x = EndianSupport.SwitchEndian(value); + base.Write(x); + } + + /// + /// Method Write + /// + /// A char[] + /// An int + /// An int + public override void Write(char[] chars, int index, int count) + { + char[] t = new char[count]; + for( int i=0; i < count; i++ ) { + t[index+i] = EndianSupport.SwitchEndian(t[index+i]); + } + base.Write(t); + } + + /// + /// Method Write + /// + /// A char[] + public override void Write(char[] chars) + { + Write(chars, 0, chars.Length); + } + + /// + /// Method Write + /// + /// An uint + public override void Write(uint value) + { + base.Write(EndianSupport.SwitchEndian(value)); + } + + + /// + /// Method Write + /// + /// A char + public override void Write(char ch) + { + base.Write(EndianSupport.SwitchEndian(ch)); + } + + /// + /// Method Write + /// + /// An ulong + public override void Write(ulong value) + { + base.Write(EndianSupport.SwitchEndian(value)); + } + + /// + /// Method Write + /// + /// A short + public override void Write(short value) + { + base.Write(EndianSupport.SwitchEndian(value)); + } + + + /// + /// Method Write + /// + /// A string + public override void Write(String text) + { + if (text != null) + { + if( text.Length > short.MaxValue ) { + throw new IOException("Cannot marshall string longer than: "+short.MaxValue+" characters, supplied steing was: "+text.Length+" characters"); + } + short strlen = (short)text.Length; + short utflen = 0; + int c, count = 0; + + char[] charr = text.ToCharArray(); + + for (int i = 0; i < strlen; i++) + { + c = charr[i]; + if ((c >= 0x0001) && (c <= 0x007F)) + { + utflen++; + } + else if (c > 0x07FF) + { + utflen += 3; + } + else + { + utflen += 2; + } + } + + Write(utflen); + byte[] bytearr = new byte[utflen]; + for (int i = 0; i < strlen; i++) + { + c = charr[i]; + if ((c >= 0x0001) && (c <= 0x007F)) + { + bytearr[count++] = (byte) c; + } + else if (c > 0x07FF) + { + bytearr[count++] = (byte) (0xE0 | ((c >> 12) & 0x0F)); + bytearr[count++] = (byte) (0x80 | ((c >> 6) & 0x3F)); + bytearr[count++] = (byte) (0x80 | ((c >> 0) & 0x3F)); + } + else + { + bytearr[count++] = (byte) (0xC0 | ((c >> 6) & 0x1F)); + bytearr[count++] = (byte) (0x80 | ((c >> 0) & 0x3F)); + } + } + + Write(bytearr); + + } + else + { + Write((short)-1); + } + } + } + + +} + diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/OpenWireFormat.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/OpenWireFormat.cs index 7b27c15447..ec5cfdad77 100755 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/OpenWireFormat.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/OpenWireFormat.cs @@ -72,7 +72,7 @@ namespace ActiveMQ.OpenWire { DataStructure c = (DataStructure) o; byte type = c.GetDataStructureType(); - BaseDataStreamMarshaller dsm = (BaseDataStreamMarshaller) dataMarshallers[type & 0xFF]; + BaseDataStreamMarshaller dsm = dataMarshallers[type & 0xFF]; if (dsm == null) throw new IOException("Unknown data type: " + type); @@ -80,28 +80,28 @@ namespace ActiveMQ.OpenWire size += dsm.TightMarshal1(this, c, bs); size += bs.MarshalledSize(); - BaseDataStreamMarshaller.WriteInt(size, ds); - BaseDataStreamMarshaller.WriteByte(type, ds); + ds.Write(size); + ds.Write(type); bs.Marshal(ds); dsm.TightMarshal2(this, c, ds, bs); } else { - BaseDataStreamMarshaller.WriteInt(size, ds); - BaseDataStreamMarshaller.WriteByte(NULL_TYPE, ds); + ds.Write(size); + ds.Write(NULL_TYPE); } } public Object Unmarshal(BinaryReader dis) { // lets ignore the size of the packet - BaseDataStreamMarshaller.ReadInt(dis); + dis.ReadInt32(); // first byte is the type of the packet - byte dataType = BaseDataStreamMarshaller.ReadByte(dis); + byte dataType = dis.ReadByte(); if (dataType != NULL_TYPE) { - BaseDataStreamMarshaller dsm = (BaseDataStreamMarshaller) dataMarshallers[dataType & 0xFF]; + BaseDataStreamMarshaller dsm = dataMarshallers[dataType & 0xFF]; if (dsm == null) throw new IOException("Unknown data type: " + dataType); //Console.WriteLine("Parsing type: " + dataType + " with: " + dsm); @@ -151,7 +151,7 @@ namespace ActiveMQ.OpenWire return ; byte type = o.GetDataStructureType(); - BaseDataStreamMarshaller.WriteByte(type, ds); + ds.Write(type); if (o.IsMarshallAware() && bs.ReadBoolean()) { @@ -174,7 +174,7 @@ namespace ActiveMQ.OpenWire if (bs.ReadBoolean()) { - byte dataType = BaseDataStreamMarshaller.ReadByte(dis); + byte dataType = dis.ReadByte(); BaseDataStreamMarshaller dsm = (BaseDataStreamMarshaller) dataMarshallers[dataType & 0xFF]; if (dsm == null) throw new IOException("Unknown data type: " + dataType); @@ -182,8 +182,8 @@ namespace ActiveMQ.OpenWire if (data.IsMarshallAware() && bs.ReadBoolean()) { - BaseDataStreamMarshaller.ReadInt(dis); - BaseDataStreamMarshaller.ReadByte(dis); + dis.ReadInt32(); + dis.ReadByte(); BooleanStream bs2 = new BooleanStream(); bs2.Unmarshal(dis); diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/BaseCommandMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/BaseCommandMarshaller.cs index 991dde65a7..ed32c3df80 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/BaseCommandMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/BaseCommandMarshaller.cs @@ -44,7 +44,7 @@ namespace ActiveMQ.OpenWire.V1 base.TightUnmarshal(wireFormat, o, dataIn, bs); BaseCommand info = (BaseCommand)o; - info.CommandId = BaseDataStreamMarshaller.ReadShort(dataIn); + info.CommandId = dataIn.ReadInt16(); info.ResponseRequired = bs.ReadBoolean(); } @@ -69,7 +69,7 @@ namespace ActiveMQ.OpenWire.V1 base.TightMarshal2(wireFormat, o, dataOut, bs); BaseCommand info = (BaseCommand)o; - BaseDataStreamMarshaller.WriteShort(info.CommandId, dataOut); + dataOut.Write(info.CommandId); bs.ReadBoolean(); } diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/BrokerInfoMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/BrokerInfoMarshaller.cs index 7e3665969a..ea983cff34 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/BrokerInfoMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/BrokerInfoMarshaller.cs @@ -59,7 +59,7 @@ namespace ActiveMQ.OpenWire.V1 info.BrokerURL = TightUnmarshalString(dataIn, bs); if (bs.ReadBoolean()) { - short size = BaseDataStreamMarshaller.ReadShort(dataIn); + short size = dataIn.ReadInt16(); BrokerInfo[] value = new BrokerInfo[size]; for( int i=0; i < size; i++ ) { value[i] = (BrokerInfo) TightUnmarshalNestedObject(wireFormat,dataIn, bs); diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ConnectionInfoMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ConnectionInfoMarshaller.cs index 9c086a772a..10f79d3856 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ConnectionInfoMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ConnectionInfoMarshaller.cs @@ -61,7 +61,7 @@ namespace ActiveMQ.OpenWire.V1 info.UserName = TightUnmarshalString(dataIn, bs); if (bs.ReadBoolean()) { - short size = BaseDataStreamMarshaller.ReadShort(dataIn); + short size = dataIn.ReadInt16(); BrokerId[] value = new BrokerId[size]; for( int i=0; i < size; i++ ) { value[i] = (BrokerId) TightUnmarshalNestedObject(wireFormat,dataIn, bs); diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ConsumerInfoMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ConsumerInfoMarshaller.cs index 8b8f9f9afb..44ad3f7b83 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ConsumerInfoMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ConsumerInfoMarshaller.cs @@ -58,18 +58,18 @@ namespace ActiveMQ.OpenWire.V1 info.ConsumerId = (ConsumerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs); info.Browser = bs.ReadBoolean(); info.Destination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs); - info.PrefetchSize = BaseDataStreamMarshaller.ReadInt(dataIn); - info.MaximumPendingMessageLimit = BaseDataStreamMarshaller.ReadInt(dataIn); + info.PrefetchSize = dataIn.ReadInt32(); + info.MaximumPendingMessageLimit = dataIn.ReadInt32(); info.DispatchAsync = bs.ReadBoolean(); info.Selector = TightUnmarshalString(dataIn, bs); info.SubcriptionName = TightUnmarshalString(dataIn, bs); info.NoLocal = bs.ReadBoolean(); info.Exclusive = bs.ReadBoolean(); info.Retroactive = bs.ReadBoolean(); - info.Priority = BaseDataStreamMarshaller.ReadByte(dataIn); + info.Priority = dataIn.ReadByte(); if (bs.ReadBoolean()) { - short size = BaseDataStreamMarshaller.ReadShort(dataIn); + short size = dataIn.ReadInt16(); BrokerId[] value = new BrokerId[size]; for( int i=0; i < size; i++ ) { value[i] = (BrokerId) TightUnmarshalNestedObject(wireFormat,dataIn, bs); @@ -116,15 +116,15 @@ namespace ActiveMQ.OpenWire.V1 TightMarshalCachedObject2(wireFormat, info.ConsumerId, dataOut, bs); bs.ReadBoolean(); TightMarshalCachedObject2(wireFormat, info.Destination, dataOut, bs); - BaseDataStreamMarshaller.WriteInt(info.PrefetchSize, dataOut); - BaseDataStreamMarshaller.WriteInt(info.MaximumPendingMessageLimit, dataOut); + dataOut.Write(info.PrefetchSize); + dataOut.Write(info.MaximumPendingMessageLimit); bs.ReadBoolean(); TightMarshalString2(info.Selector, dataOut, bs); TightMarshalString2(info.SubcriptionName, dataOut, bs); bs.ReadBoolean(); bs.ReadBoolean(); bs.ReadBoolean(); - BaseDataStreamMarshaller.WriteByte(info.Priority, dataOut); + dataOut.Write(info.Priority); TightMarshalObjectArray2(wireFormat, info.BrokerPath, dataOut, bs); bs.ReadBoolean(); diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/DataArrayResponseMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/DataArrayResponseMarshaller.cs index c9f760eb42..ca948ce041 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/DataArrayResponseMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/DataArrayResponseMarshaller.cs @@ -57,7 +57,7 @@ namespace ActiveMQ.OpenWire.V1 DataArrayResponse info = (DataArrayResponse)o; if (bs.ReadBoolean()) { - short size = BaseDataStreamMarshaller.ReadShort(dataIn); + short size = dataIn.ReadInt16(); DataStructure[] value = new DataStructure[size]; for( int i=0; i < size; i++ ) { value[i] = (DataStructure) TightUnmarshalNestedObject(wireFormat,dataIn, bs); diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/DestinationInfoMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/DestinationInfoMarshaller.cs index 1dbd71bfcd..eafeef0629 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/DestinationInfoMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/DestinationInfoMarshaller.cs @@ -57,11 +57,11 @@ namespace ActiveMQ.OpenWire.V1 DestinationInfo info = (DestinationInfo)o; info.ConnectionId = (ConnectionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs); info.Destination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs); - info.OperationType = BaseDataStreamMarshaller.ReadByte(dataIn); + info.OperationType = dataIn.ReadByte(); info.Timeout = TightUnmarshalLong(wireFormat, dataIn, bs); if (bs.ReadBoolean()) { - short size = BaseDataStreamMarshaller.ReadShort(dataIn); + short size = dataIn.ReadInt16(); BrokerId[] value = new BrokerId[size]; for( int i=0; i < size; i++ ) { value[i] = (BrokerId) TightUnmarshalNestedObject(wireFormat,dataIn, bs); @@ -99,7 +99,7 @@ namespace ActiveMQ.OpenWire.V1 DestinationInfo info = (DestinationInfo)o; TightMarshalCachedObject2(wireFormat, info.ConnectionId, dataOut, bs); TightMarshalCachedObject2(wireFormat, info.Destination, dataOut, bs); - BaseDataStreamMarshaller.WriteByte(info.OperationType, dataOut); + dataOut.Write(info.OperationType); TightMarshalLong2(wireFormat, info.Timeout, dataOut, bs); TightMarshalObjectArray2(wireFormat, info.BrokerPath, dataOut, bs); diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/IntegerResponseMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/IntegerResponseMarshaller.cs index f8f63f0fb9..0cc3571581 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/IntegerResponseMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/IntegerResponseMarshaller.cs @@ -55,7 +55,7 @@ namespace ActiveMQ.OpenWire.V1 base.TightUnmarshal(wireFormat, o, dataIn, bs); IntegerResponse info = (IntegerResponse)o; - info.Result = BaseDataStreamMarshaller.ReadInt(dataIn); + info.Result = dataIn.ReadInt32(); } @@ -78,7 +78,7 @@ namespace ActiveMQ.OpenWire.V1 base.TightMarshal2(wireFormat, o, dataOut, bs); IntegerResponse info = (IntegerResponse)o; - BaseDataStreamMarshaller.WriteInt(info.Result, dataOut); + dataOut.Write(info.Result); } } diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/JournalTransactionMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/JournalTransactionMarshaller.cs index 9a954acdf7..b993022807 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/JournalTransactionMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/JournalTransactionMarshaller.cs @@ -56,7 +56,7 @@ namespace ActiveMQ.OpenWire.V1 JournalTransaction info = (JournalTransaction)o; info.TransactionId = (TransactionId) TightUnmarshalNestedObject(wireFormat, dataIn, bs); - info.Type = BaseDataStreamMarshaller.ReadByte(dataIn); + info.Type = dataIn.ReadByte(); info.WasPrepared = bs.ReadBoolean(); } @@ -83,7 +83,7 @@ namespace ActiveMQ.OpenWire.V1 JournalTransaction info = (JournalTransaction)o; TightMarshalNestedObject2(wireFormat, info.TransactionId, dataOut, bs); - BaseDataStreamMarshaller.WriteByte(info.Type, dataOut); + dataOut.Write(info.Type); bs.ReadBoolean(); } diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/MessageAckMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/MessageAckMarshaller.cs index ceb99ca65c..439ef4ece7 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/MessageAckMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/MessageAckMarshaller.cs @@ -58,10 +58,10 @@ namespace ActiveMQ.OpenWire.V1 info.Destination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs); info.TransactionId = (TransactionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs); info.ConsumerId = (ConsumerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs); - info.AckType = BaseDataStreamMarshaller.ReadByte(dataIn); + info.AckType = dataIn.ReadByte(); info.FirstMessageId = (MessageId) TightUnmarshalNestedObject(wireFormat, dataIn, bs); info.LastMessageId = (MessageId) TightUnmarshalNestedObject(wireFormat, dataIn, bs); - info.MessageCount = BaseDataStreamMarshaller.ReadInt(dataIn); + info.MessageCount = dataIn.ReadInt32(); } @@ -92,10 +92,10 @@ namespace ActiveMQ.OpenWire.V1 TightMarshalCachedObject2(wireFormat, info.Destination, dataOut, bs); TightMarshalCachedObject2(wireFormat, info.TransactionId, dataOut, bs); TightMarshalCachedObject2(wireFormat, info.ConsumerId, dataOut, bs); - BaseDataStreamMarshaller.WriteByte(info.AckType, dataOut); + dataOut.Write(info.AckType); TightMarshalNestedObject2(wireFormat, info.FirstMessageId, dataOut, bs); TightMarshalNestedObject2(wireFormat, info.LastMessageId, dataOut, bs); - BaseDataStreamMarshaller.WriteInt(info.MessageCount, dataOut); + dataOut.Write(info.MessageCount); } } diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/MessageDispatchMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/MessageDispatchMarshaller.cs index 60999b1e21..ccc2c9bb42 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/MessageDispatchMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/MessageDispatchMarshaller.cs @@ -58,7 +58,7 @@ namespace ActiveMQ.OpenWire.V1 info.ConsumerId = (ConsumerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs); info.Destination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs); info.Message = (Message) TightUnmarshalNestedObject(wireFormat, dataIn, bs); - info.RedeliveryCounter = BaseDataStreamMarshaller.ReadInt(dataIn); + info.RedeliveryCounter = dataIn.ReadInt32(); } @@ -87,7 +87,7 @@ namespace ActiveMQ.OpenWire.V1 TightMarshalCachedObject2(wireFormat, info.ConsumerId, dataOut, bs); TightMarshalCachedObject2(wireFormat, info.Destination, dataOut, bs); TightMarshalNestedObject2(wireFormat, info.Message, dataOut, bs); - BaseDataStreamMarshaller.WriteInt(info.RedeliveryCounter, dataOut); + dataOut.Write(info.RedeliveryCounter); } } diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/MessageMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/MessageMarshaller.cs index 1010e9ae2e..63d3312032 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/MessageMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/MessageMarshaller.cs @@ -51,11 +51,11 @@ namespace ActiveMQ.OpenWire.V1 info.MessageId = (MessageId) TightUnmarshalNestedObject(wireFormat, dataIn, bs); info.OriginalTransactionId = (TransactionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs); info.GroupID = TightUnmarshalString(dataIn, bs); - info.GroupSequence = BaseDataStreamMarshaller.ReadInt(dataIn); + info.GroupSequence = dataIn.ReadInt32(); info.CorrelationId = TightUnmarshalString(dataIn, bs); info.Persistent = bs.ReadBoolean(); info.Expiration = TightUnmarshalLong(wireFormat, dataIn, bs); - info.Priority = BaseDataStreamMarshaller.ReadByte(dataIn); + info.Priority = dataIn.ReadByte(); info.ReplyTo = (ActiveMQDestination) TightUnmarshalNestedObject(wireFormat, dataIn, bs); info.Timestamp = TightUnmarshalLong(wireFormat, dataIn, bs); info.Type = TightUnmarshalString(dataIn, bs); @@ -64,10 +64,10 @@ namespace ActiveMQ.OpenWire.V1 info.DataStructure = (DataStructure) TightUnmarshalNestedObject(wireFormat, dataIn, bs); info.TargetConsumerId = (ConsumerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs); info.Compressed = bs.ReadBoolean(); - info.RedeliveryCounter = BaseDataStreamMarshaller.ReadInt(dataIn); + info.RedeliveryCounter = dataIn.ReadInt32(); if (bs.ReadBoolean()) { - short size = BaseDataStreamMarshaller.ReadShort(dataIn); + short size = dataIn.ReadInt16(); BrokerId[] value = new BrokerId[size]; for( int i=0; i < size; i++ ) { value[i] = (BrokerId) TightUnmarshalNestedObject(wireFormat,dataIn, bs); @@ -133,26 +133,26 @@ namespace ActiveMQ.OpenWire.V1 TightMarshalNestedObject2(wireFormat, info.MessageId, dataOut, bs); TightMarshalCachedObject2(wireFormat, info.OriginalTransactionId, dataOut, bs); TightMarshalString2(info.GroupID, dataOut, bs); - BaseDataStreamMarshaller.WriteInt(info.GroupSequence, dataOut); + dataOut.Write(info.GroupSequence); TightMarshalString2(info.CorrelationId, dataOut, bs); bs.ReadBoolean(); TightMarshalLong2(wireFormat, info.Expiration, dataOut, bs); - BaseDataStreamMarshaller.WriteByte(info.Priority, dataOut); + dataOut.Write(info.Priority); TightMarshalNestedObject2(wireFormat, info.ReplyTo, dataOut, bs); TightMarshalLong2(wireFormat, info.Timestamp, dataOut, bs); TightMarshalString2(info.Type, dataOut, bs); if(bs.ReadBoolean()) { - BaseDataStreamMarshaller.WriteInt(info.Content.Length, dataOut); + dataOut.Write(info.Content.Length); dataOut.Write(info.Content); } if(bs.ReadBoolean()) { - BaseDataStreamMarshaller.WriteInt(info.MarshalledProperties.Length, dataOut); + dataOut.Write(info.MarshalledProperties.Length); dataOut.Write(info.MarshalledProperties); } TightMarshalNestedObject2(wireFormat, info.DataStructure, dataOut, bs); TightMarshalCachedObject2(wireFormat, info.TargetConsumerId, dataOut, bs); bs.ReadBoolean(); - BaseDataStreamMarshaller.WriteInt(info.RedeliveryCounter, dataOut); + dataOut.Write(info.RedeliveryCounter); TightMarshalObjectArray2(wireFormat, info.BrokerPath, dataOut, bs); TightMarshalLong2(wireFormat, info.Arrival, dataOut, bs); TightMarshalString2(info.UserID, dataOut, bs); diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ProducerInfoMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ProducerInfoMarshaller.cs index 50490bc727..05191e5c15 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ProducerInfoMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ProducerInfoMarshaller.cs @@ -59,7 +59,7 @@ namespace ActiveMQ.OpenWire.V1 info.Destination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs); if (bs.ReadBoolean()) { - short size = BaseDataStreamMarshaller.ReadShort(dataIn); + short size = dataIn.ReadInt16(); BrokerId[] value = new BrokerId[size]; for( int i=0; i < size; i++ ) { value[i] = (BrokerId) TightUnmarshalNestedObject(wireFormat,dataIn, bs); diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ResponseMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ResponseMarshaller.cs index 095db8929c..c1764d5d60 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ResponseMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/ResponseMarshaller.cs @@ -55,7 +55,7 @@ namespace ActiveMQ.OpenWire.V1 base.TightUnmarshal(wireFormat, o, dataIn, bs); Response info = (Response)o; - info.CorrelationId = BaseDataStreamMarshaller.ReadShort(dataIn); + info.CorrelationId = dataIn.ReadInt16(); } @@ -78,7 +78,7 @@ namespace ActiveMQ.OpenWire.V1 base.TightMarshal2(wireFormat, o, dataOut, bs); Response info = (Response)o; - BaseDataStreamMarshaller.WriteShort(info.CorrelationId, dataOut); + dataOut.Write(info.CorrelationId); } } diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/TransactionInfoMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/TransactionInfoMarshaller.cs index 4861a41784..c51f3facc2 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/TransactionInfoMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/TransactionInfoMarshaller.cs @@ -57,7 +57,7 @@ namespace ActiveMQ.OpenWire.V1 TransactionInfo info = (TransactionInfo)o; info.ConnectionId = (ConnectionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs); info.TransactionId = (TransactionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs); - info.Type = BaseDataStreamMarshaller.ReadByte(dataIn); + info.Type = dataIn.ReadByte(); } @@ -84,7 +84,7 @@ namespace ActiveMQ.OpenWire.V1 TransactionInfo info = (TransactionInfo)o; TightMarshalCachedObject2(wireFormat, info.ConnectionId, dataOut, bs); TightMarshalCachedObject2(wireFormat, info.TransactionId, dataOut, bs); - BaseDataStreamMarshaller.WriteByte(info.Type, dataOut); + dataOut.Write(info.Type); } } diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/WireFormatInfoMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/WireFormatInfoMarshaller.cs index 94b55721a3..cb783006cd 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/WireFormatInfoMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/WireFormatInfoMarshaller.cs @@ -56,7 +56,7 @@ namespace ActiveMQ.OpenWire.V1 WireFormatInfo info = (WireFormatInfo)o; info.Magic = ReadBytes(dataIn, 8); - info.Version = BaseDataStreamMarshaller.ReadInt(dataIn); + info.Version = dataIn.ReadInt32(); info.CacheEnabled = bs.ReadBoolean(); info.StackTraceEnabled = bs.ReadBoolean(); info.TcpNoDelayEnabled = bs.ReadBoolean(); @@ -90,7 +90,7 @@ namespace ActiveMQ.OpenWire.V1 WireFormatInfo info = (WireFormatInfo)o; dataOut.Write(info.Magic, 0, 8); - BaseDataStreamMarshaller.WriteInt(info.Version, dataOut); + dataOut.Write(info.Version); bs.ReadBoolean(); bs.ReadBoolean(); bs.ReadBoolean(); diff --git a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/XATransactionIdMarshaller.cs b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/XATransactionIdMarshaller.cs index 9332521464..24de74080b 100644 --- a/openwire-dotnet/src/ActiveMQ/OpenWire/V1/XATransactionIdMarshaller.cs +++ b/openwire-dotnet/src/ActiveMQ/OpenWire/V1/XATransactionIdMarshaller.cs @@ -55,7 +55,7 @@ namespace ActiveMQ.OpenWire.V1 base.TightUnmarshal(wireFormat, o, dataIn, bs); XATransactionId info = (XATransactionId)o; - info.FormatId = BaseDataStreamMarshaller.ReadInt(dataIn); + info.FormatId = dataIn.ReadInt32(); info.GlobalTransactionId = ReadBytes(dataIn, bs.ReadBoolean()); info.BranchQualifier = ReadBytes(dataIn, bs.ReadBoolean()); @@ -84,13 +84,13 @@ namespace ActiveMQ.OpenWire.V1 base.TightMarshal2(wireFormat, o, dataOut, bs); XATransactionId info = (XATransactionId)o; - BaseDataStreamMarshaller.WriteInt(info.FormatId, dataOut); + dataOut.Write(info.FormatId); if(bs.ReadBoolean()) { - BaseDataStreamMarshaller.WriteInt(info.GlobalTransactionId.Length, dataOut); + dataOut.Write(info.GlobalTransactionId.Length); dataOut.Write(info.GlobalTransactionId); } if(bs.ReadBoolean()) { - BaseDataStreamMarshaller.WriteInt(info.BranchQualifier.Length, dataOut); + dataOut.Write(info.BranchQualifier.Length); dataOut.Write(info.BranchQualifier); } diff --git a/openwire-dotnet/src/ActiveMQ/Transport/Tcp/TcpTransport.cs b/openwire-dotnet/src/ActiveMQ/Transport/Tcp/TcpTransport.cs index a121745905..dbcb491cb9 100644 --- a/openwire-dotnet/src/ActiveMQ/Transport/Tcp/TcpTransport.cs +++ b/openwire-dotnet/src/ActiveMQ/Transport/Tcp/TcpTransport.cs @@ -41,7 +41,7 @@ namespace ActiveMQ.Transport.Tcp private bool started; volatile private bool closed; - private CommandHandler commandHandlerHandlerHandlerHandlerHandler; + private CommandHandler commandHandler; private ExceptionHandler exceptionHandler; public TcpTransport(Socket socket) @@ -56,7 +56,7 @@ namespace ActiveMQ.Transport.Tcp { if (!started) { - if( commandHandlerHandlerHandlerHandlerHandler == null ) + if( commandHandler == null ) throw new InvalidOperationException ("command cannot be null when Start is called."); if( exceptionHandler == null ) throw new InvalidOperationException ("exception cannot be null when Start is called."); @@ -64,8 +64,8 @@ namespace ActiveMQ.Transport.Tcp started = true; NetworkStream networkStream = new NetworkStream(socket); - socketWriter = new BinaryWriter(networkStream); - socketReader = new BinaryReader(networkStream); + socketWriter = new OpenWireBinaryWriter(networkStream); + socketReader = new OpenWireBinaryReader(networkStream); // now lets create the background read thread readThread = new Thread(new ThreadStart(ReadLoop)); @@ -108,37 +108,29 @@ namespace ActiveMQ.Transport.Tcp try { Command command = (Command) wireformat.Unmarshal(socketReader); - this.commandHandlerHandlerHandlerHandlerHandler(this, command); + this.commandHandler(this, command); } catch (ObjectDisposedException) { break; } - catch ( IOException e) { + catch ( Exception e) { if( e.GetBaseException() is ObjectDisposedException ) { break; } if( !closed ) { this.exceptionHandler(this,e); } + break; } - catch (Exception e) - { - if( !closed ) { - this.exceptionHandler(this,e); - } - } } } - - - - + // Implementation methods public CommandHandler Command { - get { return commandHandlerHandlerHandlerHandlerHandler; } - set { this.commandHandlerHandlerHandlerHandlerHandler = value; } + get { return commandHandler; } + set { this.commandHandler = value; } } public ExceptionHandler Exception { diff --git a/openwire-dotnet/src/ActiveMQ/Transport/Tcp/TcpTransportFactory.cs b/openwire-dotnet/src/ActiveMQ/Transport/Tcp/TcpTransportFactory.cs index 082962a9e6..7edff7097e 100644 --- a/openwire-dotnet/src/ActiveMQ/Transport/Tcp/TcpTransportFactory.cs +++ b/openwire-dotnet/src/ActiveMQ/Transport/Tcp/TcpTransportFactory.cs @@ -30,7 +30,7 @@ namespace ActiveMQ.Transport.Tcp Socket socket = Connect(location.Host, location.Port); ITransport rc = new TcpTransport(socket); // TODO: use URI query string to enable the LoggingTransport - // rc = new LoggingTransport(rc); + rc = new LoggingTransport(rc); rc = new ResponseCorrelator(rc); rc = new MutexTransport(rc); return rc; diff --git a/openwire-dotnet/src/src.csproj b/openwire-dotnet/src/src.csproj index 3fe9200bd6..cc136d2c89 100644 --- a/openwire-dotnet/src/src.csproj +++ b/openwire-dotnet/src/src.csproj @@ -103,7 +103,10 @@ + + + diff --git a/openwire-dotnet/tests/ActiveMQ/OpenWire/BooleanStreamTest.cs b/openwire-dotnet/tests/ActiveMQ/OpenWire/BooleanStreamTest.cs index d806651d7b..4dec47c67d 100644 --- a/openwire-dotnet/tests/ActiveMQ/OpenWire/BooleanStreamTest.cs +++ b/openwire-dotnet/tests/ActiveMQ/OpenWire/BooleanStreamTest.cs @@ -24,7 +24,6 @@ namespace ActiveMQ.OpenWire [TestFixture] public class BooleanStreamTest { - protected OpenWireFormat openWireformat; protected int endOfStreamMarker = 0x12345678; int numberOfBytes = 8 * 200; @@ -72,7 +71,7 @@ namespace ActiveMQ.OpenWire protected void TestBooleanStream(int numberOfBytes, GetBooleanValueDelegate valueDelegate) { - for (int i = 0; i < numberOfBytes; i++) + for (int i = 1017; i < numberOfBytes; i++) { AssertMarshalBooleans(i, valueDelegate); } @@ -86,14 +85,14 @@ namespace ActiveMQ.OpenWire bs.WriteBoolean(valueDelegate(i, count)); } MemoryStream buffer = new MemoryStream(); - BinaryWriter ds = new BinaryWriter(buffer); + BinaryWriter ds = new OpenWireBinaryWriter(buffer); bs.Marshal(ds); - BaseDataStreamMarshaller.WriteInt(endOfStreamMarker, ds); + ds.Write(endOfStreamMarker); // now lets read from the stream MemoryStream ins = new MemoryStream(buffer.ToArray()); - BinaryReader dis = new BinaryReader(ins); + BinaryReader dis = new OpenWireBinaryReader(ins); bs = new BooleanStream(); bs.Unmarshal(dis); @@ -111,7 +110,7 @@ namespace ActiveMQ.OpenWire Assert.Fail("Failed to parse bool: " + i + " out of: " + count + " due to: " + e); } } - int marker = BaseDataStreamMarshaller.ReadInt(dis); + int marker = dis.ReadInt32(); Assert.AreEqual(endOfStreamMarker, marker, "did not match: "+endOfStreamMarker+" and "+marker); // lets try read and we should get an exception @@ -125,20 +124,6 @@ namespace ActiveMQ.OpenWire } } - [SetUp] - protected void SetUp() - { - openWireformat = createOpenWireFormat(); - } - - protected OpenWireFormat createOpenWireFormat() - { - OpenWireFormat wf = new OpenWireFormat(); -// wf.setCacheEnabled(true); -// wf.setStackTraceEnabled(false); -// wf.setVersion(1); - return wf; - } } } diff --git a/openwire-dotnet/tests/ActiveMQ/OpenWire/EndianTest.cs b/openwire-dotnet/tests/ActiveMQ/OpenWire/EndianTest.cs index d19c9686eb..d4aa5e1a2f 100644 --- a/openwire-dotnet/tests/ActiveMQ/OpenWire/EndianTest.cs +++ b/openwire-dotnet/tests/ActiveMQ/OpenWire/EndianTest.cs @@ -17,7 +17,7 @@ using ActiveMQ.OpenWire; using NUnit.Framework; using System; - +using System.IO; namespace ActiveMQ.OpenWire { @@ -29,15 +29,10 @@ namespace ActiveMQ.OpenWire public void TestLongEndian() { long value = 0x0102030405060708L; - - long newValue = BaseDataStreamMarshaller.SwitchEndian(value); - + long newValue = EndianSupport.SwitchEndian(value); Console.WriteLine("New value: " + newValue); - Assert.AreEqual(0x0807060504030201L, newValue); - - long actual = BaseDataStreamMarshaller.SwitchEndian(newValue); - + long actual = EndianSupport.SwitchEndian(newValue); Assert.AreEqual(value, actual); } @@ -45,32 +40,91 @@ namespace ActiveMQ.OpenWire public void TestIntEndian() { int value = 0x12345678; - - int newValue = BaseDataStreamMarshaller.SwitchEndian(value); - + int newValue = EndianSupport.SwitchEndian(value); Console.WriteLine("New value: " + newValue); - Assert.AreEqual(0x78563412, newValue); - - int actual = BaseDataStreamMarshaller.SwitchEndian(newValue); - + int actual = EndianSupport.SwitchEndian(newValue); Assert.AreEqual(value, actual); } + [Test] public void TestShortEndian() { short value = 0x1234; - - short newValue = BaseDataStreamMarshaller.SwitchEndian(value); - + short newValue = EndianSupport.SwitchEndian(value); Console.WriteLine("New value: " + newValue); - Assert.AreEqual(0x3412, newValue); - - short actual = BaseDataStreamMarshaller.SwitchEndian(newValue); - + short actual = EndianSupport.SwitchEndian(newValue); Assert.AreEqual(value, actual); } + + [Test] + public void TestNegativeLongEndian() + { + long value = -0x0102030405060708L; + long newValue = EndianSupport.SwitchEndian(value); + Console.WriteLine("New value: " + newValue); + long actual = EndianSupport.SwitchEndian(newValue); + Assert.AreEqual(value, actual); + } + + [Test] + public void TestNegativeIntEndian() + { + int value = -0x12345678; + int newValue = EndianSupport.SwitchEndian(value); + Console.WriteLine("New value: " + newValue); + int actual = EndianSupport.SwitchEndian(newValue); + Assert.AreEqual(value, actual); + } + + [Test] + public void TestNegativeShortEndian() + { + short value = -0x1234; + short newValue = EndianSupport.SwitchEndian(value); + Console.WriteLine("New value: " + newValue); + short actual = EndianSupport.SwitchEndian(newValue); + Assert.AreEqual(value, actual); + } + + [Test] + public void TestFloatDontNeedEndianSwitch() + { + float value = -1.223F; + Console.WriteLine("value: " + value); + + // Convert to int so we can compare to Java version. + MemoryStream ms = new MemoryStream(4); + BinaryWriter bw = new BinaryWriter(ms); + bw.Write(value); + bw.Close(); + ms = new MemoryStream(ms.ToArray()); + BinaryReader br = new BinaryReader(ms); + + // System.out.println(Integer.toString(Float.floatToIntBits(-1.223F), 16)); + Assert.AreEqual(-0x406374bc, br.ReadInt32()); + + } + + [Test] + public void TestDoublDontNeedEndianSwitch() + { + double value = -1.223D; + Console.WriteLine("New value: " + value); + + // Convert to int so we can compare to Java version. + MemoryStream ms = new MemoryStream(4); + BinaryWriter bw = new BinaryWriter(ms); + bw.Write(value); + bw.Close(); + ms = new MemoryStream(ms.ToArray()); + BinaryReader br = new BinaryReader(ms); + long longVersion = br.ReadInt64(); + + // System.out.println(Long.toString(Double.doubleToLongBits(-1.223D), 16)); + Assert.AreEqual(-0x400c6e978d4fdf3b, longVersion); + } } } diff --git a/openwire-dotnet/tests/JMS/ConsumerTest.cs b/openwire-dotnet/tests/JMS/ConsumerTest.cs index 6961704f73..74b3cda10f 100755 --- a/openwire-dotnet/tests/JMS/ConsumerTest.cs +++ b/openwire-dotnet/tests/JMS/ConsumerTest.cs @@ -48,8 +48,8 @@ namespace JMS } + //[Ignore("Not fully implemented yet.")] [Test] - [Ignore("Not fully implemented yet.")] public void testDurableConsumerSelectorChange() { @@ -59,10 +59,10 @@ namespace JMS // Send the messages ITextMessage message = session.CreateTextMessage("1st"); - //message.SetStringProperty("color", "red"); + message.Properties["color"] = "red"; producer.Send(message); - IMessage m = consumer.Receive(1000); + IMessage m = consumer.Receive(receiveTimeout ); Assert.IsNotNull(m); Assert.AreEqual("1st", ((ITextMessage)m).Text); @@ -71,10 +71,10 @@ namespace JMS consumer = session.CreateDurableConsumer((ITopic)Destination, "test", "color='blue'", false); message = session.CreateTextMessage("2nd"); - // message.setStringProperty("color", "red"); + message.Properties["color"] = "red"; producer.Send(message); message = session.CreateTextMessage("3rd"); - // message.setStringProperty("color", "blue"); + message.Properties["color"] = "blue"; producer.Send(message); // Selector should skip the 2nd message. diff --git a/openwire-dotnet/tests/JMS/MapMessageTest.cs b/openwire-dotnet/tests/JMS/MapMessageTest.cs index 81c3248ee4..a0a9e52856 100644 --- a/openwire-dotnet/tests/JMS/MapMessageTest.cs +++ b/openwire-dotnet/tests/JMS/MapMessageTest.cs @@ -31,6 +31,11 @@ namespace JMS int e = 0x12345678; long f = 0x1234567812345678; string g = "Hello World!"; + bool h = false; + byte i = 0xFF; + short j = -0x1234; + int k = -0x12345678; + long l = -0x1234567812345678; [SetUp] override public void SetUp() @@ -61,6 +66,11 @@ namespace JMS message.Body["e"] = e; message.Body["f"] = f; message.Body["g"] = g; + message.Body["h"] = h; + message.Body["i"] = i; + message.Body["j"] = j; + message.Body["k"] = k; + message.Body["l"] = l; return message; } @@ -83,6 +93,11 @@ namespace JMS Assert.AreEqual(e, mapMessage.Body["e"], "generic map entry: e"); Assert.AreEqual(f, mapMessage.Body["f"], "generic map entry: f"); Assert.AreEqual(g, mapMessage.Body["g"], "generic map entry: g"); + Assert.AreEqual(h, mapMessage.Body["h"], "generic map entry: h"); + Assert.AreEqual(i, mapMessage.Body["i"], "generic map entry: i"); + Assert.AreEqual(j, mapMessage.Body["j"], "generic map entry: j"); + Assert.AreEqual(k, mapMessage.Body["k"], "generic map entry: k"); + Assert.AreEqual(l, mapMessage.Body["l"], "generic map entry: l"); // use type safe APIs Assert.AreEqual(a, mapMessage.Body.GetBool("a"), "map entry: a"); @@ -92,8 +107,12 @@ namespace JMS Assert.AreEqual(e, mapMessage.Body.GetInt("e"), "map entry: e"); Assert.AreEqual(f, mapMessage.Body.GetLong("f"), "map entry: f"); Assert.AreEqual(g, mapMessage.Body.GetString("g"), "map entry: g"); - - + Assert.AreEqual(h, mapMessage.Body.GetBool("h"), "map entry: h"); + Assert.AreEqual(i, mapMessage.Body.GetByte("i"), "map entry: i"); + Assert.AreEqual(j, mapMessage.Body.GetShort("j"), "map entry: j"); + Assert.AreEqual(k, mapMessage.Body.GetInt("k"), "map entry: k"); + Assert.AreEqual(l, mapMessage.Body.GetLong("l"), "map entry: l"); + } protected string ToHex(long value) diff --git a/openwire-dotnet/tests/JMS/MessageTest.cs b/openwire-dotnet/tests/JMS/MessageTest.cs new file mode 100644 index 0000000000..ad2600a1d2 --- /dev/null +++ b/openwire-dotnet/tests/JMS/MessageTest.cs @@ -0,0 +1,120 @@ +/* + * Copyright 2006 The Apache Software Foundation or its licensors, as + * applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +using JMS; +using NUnit.Framework; +using System; + +namespace tests +{ + [ TestFixture ] + public class MessageTest : JMSTestSupport + { + bool a = true; + byte b = 123; + char c = 'c'; + short d = 0x1234; + int e = 0x12345678; + long f = 0x1234567812345678; + string g = "Hello World!"; + bool h = false; + byte i = 0xFF; + short j = -0x1234; + int k = -0x12345678; + long l = -0x1234567812345678; + + [SetUp] + override public void SetUp() + { + base.SetUp(); + } + + [TearDown] + override public void TearDown() + { + base.TearDown(); + } + + [ Test ] + public override void SendAndSyncReceive() + { + base.SendAndSyncReceive(); + } + + protected override IMessage CreateMessage() + { + IMessage message = session.CreateMessage(); + + message.Properties["a"] = a; + message.Properties["b"] = b; + message.Properties["c"] = c; + message.Properties["d"] = d; + message.Properties["e"] = e; + message.Properties["f"] = f; + message.Properties["g"] = g; + message.Properties["h"] = h; + message.Properties["i"] = i; + message.Properties["j"] = j; + message.Properties["k"] = k; + message.Properties["l"] = l; + + return message; + } + + protected override void AssertValidMessage(IMessage message) + { + Console.WriteLine("Received message: " + message); + Console.WriteLine("Received Count: " + message.Properties.Count); + + Assert.AreEqual(ToHex(f), ToHex(message.Properties.GetLong("f")), "map entry: f as hex"); + + // use generic API to access entries + Assert.AreEqual(a, message.Properties["a"], "generic map entry: a"); + Assert.AreEqual(b, message.Properties["b"], "generic map entry: b"); + Assert.AreEqual(c, message.Properties["c"], "generic map entry: c"); + Assert.AreEqual(d, message.Properties["d"], "generic map entry: d"); + Assert.AreEqual(e, message.Properties["e"], "generic map entry: e"); + Assert.AreEqual(f, message.Properties["f"], "generic map entry: f"); + Assert.AreEqual(g, message.Properties["g"], "generic map entry: g"); + Assert.AreEqual(h, message.Properties["h"], "generic map entry: h"); + Assert.AreEqual(i, message.Properties["i"], "generic map entry: i"); + Assert.AreEqual(j, message.Properties["j"], "generic map entry: j"); + Assert.AreEqual(k, message.Properties["k"], "generic map entry: k"); + Assert.AreEqual(l, message.Properties["l"], "generic map entry: l"); + + // use type safe APIs + Assert.AreEqual(a, message.Properties.GetBool("a"), "map entry: a"); + Assert.AreEqual(b, message.Properties.GetByte("b"), "map entry: b"); + Assert.AreEqual(c, message.Properties.GetChar("c"), "map entry: c"); + Assert.AreEqual(d, message.Properties.GetShort("d"), "map entry: d"); + Assert.AreEqual(e, message.Properties.GetInt("e"), "map entry: e"); + Assert.AreEqual(f, message.Properties.GetLong("f"), "map entry: f"); + Assert.AreEqual(g, message.Properties.GetString("g"), "map entry: g"); + Assert.AreEqual(h, message.Properties.GetBool("h"), "map entry: h"); + Assert.AreEqual(i, message.Properties.GetByte("i"), "map entry: i"); + Assert.AreEqual(j, message.Properties.GetShort("j"), "map entry: j"); + Assert.AreEqual(k, message.Properties.GetInt("k"), "map entry: k"); + Assert.AreEqual(l, message.Properties.GetLong("l"), "map entry: l"); + + } + + protected string ToHex(long value) + { + return String.Format("{0:x}", value); + } + + } +} diff --git a/openwire-dotnet/tests/tests.csproj b/openwire-dotnet/tests/tests.csproj index b7123cc091..8b3a017ff5 100644 --- a/openwire-dotnet/tests/tests.csproj +++ b/openwire-dotnet/tests/tests.csproj @@ -52,6 +52,7 @@ +