You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2007/01/10 16:18:16 UTC
svn commit: r494846 - in
/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/io:
DataInputStream.cpp DataOutputStream.cpp
Author: tabish
Date: Wed Jan 10 07:18:16 2007
New Revision: 494846
URL: http://svn.apache.org/viewvc?view=rev&rev=494846
Log:
http://issues.apache.org/activemq/browse/AMQCPP-25
Rewrote most of the methods to more safely handle data on various platforms, and do its own byte swapping as needed.
Modified:
incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/io/DataInputStream.cpp
incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/io/DataOutputStream.cpp
Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/io/DataInputStream.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/io/DataInputStream.cpp?view=diff&rev=494846&r1=494845&r2=494846
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/io/DataInputStream.cpp (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/io/DataInputStream.cpp Wed Jan 10 07:18:16 2007
@@ -135,17 +135,19 @@
try {
unsigned short value = 0;
- //unsigned char byte1 = this->readByte();
- //unsigned char byte2 = this->readByte();
- //
- //value |= (byte2 << 8 | byte1 << 0);
+ unsigned char byte1 = this->readByte();
+ unsigned char byte2 = this->readByte();
+
+ value |= (byte1 << 8 | byte2 << 0);
+
+ return value;
//char* temp = (char*)&value;
//
//return (short)Endian::byteSwap( value );
- this->readFully( ( unsigned char* )&value, 0, sizeof( unsigned short ) );
- return Endian::byteSwap( value );
+ //this->readFully( ( unsigned char* )&value, 0, sizeof( unsigned short ) );
+ //return Endian::byteSwap( value );
}
AMQ_CATCH_RETHROW( IOException )
AMQ_CATCHALL_THROW( IOException )
@@ -155,9 +157,19 @@
unsigned short DataInputStream::readUnsignedShort()
throw ( io::IOException, io::EOFException ) {
try {
- unsigned short value;
- this->readFully( ( unsigned char* )&value, 0, sizeof( unsigned short ) );
- return Endian::byteSwap( value );
+
+ unsigned short value = 0;
+
+ unsigned char byte1 = this->readByte();
+ unsigned char byte2 = this->readByte();
+
+ value |= (byte1 << 8 | byte2 << 0);
+
+ return value;
+
+// unsigned short value;
+// this->readFully( ( unsigned char* )&value, 0, sizeof( unsigned short ) );
+// return Endian::byteSwap( value );
}
AMQ_CATCH_RETHROW( IOException )
AMQ_CATCHALL_THROW( IOException )
@@ -166,9 +178,21 @@
////////////////////////////////////////////////////////////////////////////////
int DataInputStream::readInt() throw ( io::IOException, io::EOFException ) {
try {
- unsigned int value;
- this->readFully( ( unsigned char* )&value, 0, sizeof( unsigned int ) );
- return (int)Endian::byteSwap( value );
+
+ unsigned int value = 0;
+
+ unsigned char byte1 = this->readByte();
+ unsigned char byte2 = this->readByte();
+ unsigned char byte3 = this->readByte();
+ unsigned char byte4 = this->readByte();
+
+ value |= (byte1 << 24 | byte2 << 16 | byte3 << 8 | byte4 << 0);
+
+ return value;
+
+// unsigned int value;
+// this->readFully( ( unsigned char* )&value, 0, sizeof( unsigned int ) );
+// return (int)Endian::byteSwap( value );
}
AMQ_CATCH_RETHROW( IOException )
AMQ_CATCHALL_THROW( IOException )
@@ -177,9 +201,14 @@
////////////////////////////////////////////////////////////////////////////////
double DataInputStream::readDouble() throw ( io::IOException, io::EOFException ) {
try {
- double value;
- this->readFully( ( unsigned char* )&value, 0, sizeof( double ) );
- return Endian::byteSwap( value );
+
+ unsigned long long value = this->readLong();
+
+ return *((double*)&value);
+
+// double value;
+// this->readFully( ( unsigned char* )&value, 0, sizeof( double ) );
+// return Endian::byteSwap( value );
}
AMQ_CATCH_RETHROW( IOException )
AMQ_CATCHALL_THROW( IOException )
@@ -188,9 +217,21 @@
////////////////////////////////////////////////////////////////////////////////
float DataInputStream::readFloat() throw ( io::IOException, io::EOFException ) {
try {
- float value;
- this->readFully( ( unsigned char* )&value, 0, sizeof( float ) );
- return Endian::byteSwap( value );
+
+ unsigned int value = 0;
+
+ unsigned char byte1 = this->readByte();
+ unsigned char byte2 = this->readByte();
+ unsigned char byte3 = this->readByte();
+ unsigned char byte4 = this->readByte();
+
+ value |= (byte1 << 24 | byte2 << 16 | byte3 << 8 | byte4 << 0);
+
+ return *((float*)&value);
+
+// float value;
+// this->readFully( ( unsigned char* )&value, 0, sizeof( float ) );
+// return Endian::byteSwap( value );
}
AMQ_CATCH_RETHROW( IOException )
AMQ_CATCHALL_THROW( IOException )
@@ -200,9 +241,26 @@
long long DataInputStream::readLong()
throw ( io::IOException, io::EOFException ) {
try {
- unsigned long long value;
- this->readFully( ( unsigned char* )&value, 0, sizeof( unsigned long long ) );
- return (long long)Endian::byteSwap( value );
+
+ unsigned long long value = 0;
+
+ unsigned long long byte1 = this->readByte() & 0x00000000000000FFULL;
+ unsigned long long byte2 = this->readByte() & 0x00000000000000FFULL;
+ unsigned long long byte3 = this->readByte() & 0x00000000000000FFULL;
+ unsigned long long byte4 = this->readByte() & 0x00000000000000FFULL;
+ unsigned long long byte5 = this->readByte() & 0x00000000000000FFULL;
+ unsigned long long byte6 = this->readByte() & 0x00000000000000FFULL;
+ unsigned long long byte7 = this->readByte() & 0x00000000000000FFULL;
+ unsigned long long byte8 = this->readByte() & 0x00000000000000FFULL;
+
+ value = ( byte1 << 56 | byte2 << 48 | byte3 << 40 | byte4 << 32 |
+ byte5 << 24 | byte6 << 16 | byte7 << 8 | byte8 << 0 );
+
+ return value;
+
+// unsigned long long value;
+// this->readFully( ( unsigned char* )&value, 0, sizeof( unsigned long long ) );
+// return (long long)Endian::byteSwap( value );
}
AMQ_CATCH_RETHROW( IOException )
AMQ_CATCHALL_THROW( IOException )
Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/io/DataOutputStream.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/io/DataOutputStream.cpp?view=diff&rev=494846&r1=494845&r2=494846
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/io/DataOutputStream.cpp (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/io/DataOutputStream.cpp Wed Jan 10 07:18:16 2007
@@ -89,8 +89,8 @@
try {
unsigned char ivalue = 0;
value == true ? ivalue = 1 : ivalue = 0;
- ivalue = Endian::byteSwap( ivalue );
- write( ( unsigned char* )&ivalue, sizeof( ivalue ) );
+
+ write( ivalue );
}
AMQ_CATCH_RETHROW( IOException )
AMQ_CATCHALL_THROW( IOException )
@@ -99,8 +99,7 @@
////////////////////////////////////////////////////////////////////////////////
void DataOutputStream::writeByte( unsigned char value ) throw ( IOException ) {
try {
- value = Endian::byteSwap( value );
- write( ( unsigned char* )&value, sizeof( value ) );
+ write( value );
}
AMQ_CATCH_RETHROW( IOException )
AMQ_CATCHALL_THROW( IOException )
@@ -108,14 +107,18 @@
////////////////////////////////////////////////////////////////////////////////
void DataOutputStream::writeShort( short value ) throw ( IOException ) {
- writeUnsignedShort( (unsigned short)value );
+ try {
+ writeUnsignedShort( (unsigned short)value );
+ }
+ AMQ_CATCH_RETHROW( IOException )
+ AMQ_CATCHALL_THROW( IOException )
}
////////////////////////////////////////////////////////////////////////////////
void DataOutputStream::writeUnsignedShort( unsigned short value ) throw ( IOException ) {
try {
- value = Endian::byteSwap( value );
- write( ( unsigned char* )&value, sizeof( value ) );
+ write( (unsigned char)( (value & 0xFF00) >> 8 ) );
+ write( (unsigned char)( (value & 0x00FF) >> 0 ) );
}
AMQ_CATCH_RETHROW( IOException )
AMQ_CATCHALL_THROW( IOException )
@@ -124,8 +127,7 @@
////////////////////////////////////////////////////////////////////////////////
void DataOutputStream::writeChar( char value ) throw ( IOException ) {
try {
- value = Endian::byteSwap( ( unsigned char )value );
- write( ( unsigned char* )&value, sizeof( value ) );
+ write( value );
}
AMQ_CATCH_RETHROW( IOException )
AMQ_CATCHALL_THROW( IOException )
@@ -134,8 +136,10 @@
////////////////////////////////////////////////////////////////////////////////
void DataOutputStream::writeInt( int value ) throw ( IOException ) {
try {
- value = Endian::byteSwap( ( unsigned int )value );
- write( ( unsigned char* )&value, sizeof( value ) );
+ write( (unsigned char)( (value & 0xFF000000) >> 24 ) );
+ write( (unsigned char)( (value & 0x00FF0000) >> 16 ) );
+ write( (unsigned char)( (value & 0x0000FF00) >> 8 ) );
+ write( (unsigned char)( (value & 0x000000FF) >> 0 ) );
}
AMQ_CATCH_RETHROW( IOException )
AMQ_CATCHALL_THROW( IOException )
@@ -144,8 +148,14 @@
////////////////////////////////////////////////////////////////////////////////
void DataOutputStream::writeLong( long long value ) throw ( IOException ) {
try {
- value = Endian::byteSwap( ( unsigned long long )value );
- write( ( unsigned char* )&value, sizeof( value ) );
+ write( (unsigned char)( (value & 0xFF00000000000000ULL) >> 56 ) );
+ write( (unsigned char)( (value & 0x00FF000000000000ULL) >> 48 ) );
+ write( (unsigned char)( (value & 0x0000FF0000000000ULL) >> 40 ) );
+ write( (unsigned char)( (value & 0x000000FF00000000ULL) >> 32 ) );
+ write( (unsigned char)( (value & 0x00000000FF000000ULL) >> 24 ) );
+ write( (unsigned char)( (value & 0x0000000000FF0000ULL) >> 16 ) );
+ write( (unsigned char)( (value & 0x000000000000FF00ULL) >> 8 ) );
+ write( (unsigned char)( (value & 0x00000000000000FFULL) >> 0 ) );
}
AMQ_CATCH_RETHROW( IOException )
AMQ_CATCHALL_THROW( IOException )
@@ -154,8 +164,7 @@
////////////////////////////////////////////////////////////////////////////////
void DataOutputStream::writeFloat( float value ) throw ( IOException ) {
try {
- value = Endian::byteSwap( value );
- write( ( unsigned char* )&value, sizeof( value ) );
+ this->writeInt( *((unsigned int*)&value) );
}
AMQ_CATCH_RETHROW( IOException )
AMQ_CATCHALL_THROW( IOException )
@@ -164,8 +173,7 @@
////////////////////////////////////////////////////////////////////////////////
void DataOutputStream::writeDouble( double value ) throw ( IOException ) {
try {
- value = Endian::byteSwap( value );
- write( ( unsigned char* )&value, sizeof( value ) );
+ writeLong( *((unsigned long long*)&value) );
}
AMQ_CATCH_RETHROW( IOException )
AMQ_CATCHALL_THROW( IOException )