From 103d0380d3b46311775e2c85439d7a9d406f44f7 Mon Sep 17 00:00:00 2001 From: Guilherme Maciel Ferreira Date: Tue, 12 Apr 2011 10:43:25 +0200 Subject: [PATCH] Encapsulated the encode, decode, read and write methods within the IcmpMessagePayload class - simplify the message classes --- src/CMakeLists.txt | 1 + src/icmp/icmpdestinationunreachablemessage.cpp | 39 ++++---------- src/icmp/icmpdestinationunreachablemessage.h | 8 +-- src/icmp/icmpechoreplymessage.cpp | 39 ++++---------- src/icmp/icmpechoreplymessage.h | 8 +-- src/icmp/icmpechorequestmessage.cpp | 39 ++++---------- src/icmp/icmpechorequestmessage.h | 8 +-- src/icmp/icmpmessagepayload.cpp | 67 ++++++++++++++++++++++++ src/icmp/icmpmessagepayload.h | 43 +++++++++++++++ 9 files changed, 150 insertions(+), 102 deletions(-) create mode 100644 src/icmp/icmpmessagepayload.cpp create mode 100644 src/icmp/icmpmessagepayload.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c062424..13ee4d3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -29,6 +29,7 @@ set(SOURCES icmp/icmpechorequestmessage.cpp icmp/icmpgenericmessage.cpp icmp/icmpmessage.cpp + icmp/icmpmessagepayload.cpp icmp/icmpheader.cpp icmp/icmppacket.cpp icmp/ipv4header.cpp diff --git a/src/icmp/icmpdestinationunreachablemessage.cpp b/src/icmp/icmpdestinationunreachablemessage.cpp index 3c1fd98..1946453 100644 --- a/src/icmp/icmpdestinationunreachablemessage.cpp +++ b/src/icmp/icmpdestinationunreachablemessage.cpp @@ -6,11 +6,11 @@ using namespace std; // IcmpDestinationUnreachableMessage //----------------------------------------------------------------------------- -const int IcmpDestinationUnreachableMessage::MessageSizeInBytes = 44; +static const int MessageSizeInBytes = 44; -IcmpDestinationUnreachableMessage::IcmpDestinationUnreachableMessage() +IcmpDestinationUnreachableMessage::IcmpDestinationUnreachableMessage() : + Payload( MessageSizeInBytes ) { - fill( Payload, Payload + sizeof(Payload), 0 ); } IcmpDestinationUnreachableMessage::~IcmpDestinationUnreachableMessage() @@ -43,63 +43,46 @@ void IcmpDestinationUnreachableMessage::set_code( uint8_t code ) uint16_t IcmpDestinationUnreachableMessage::get_checksum() const { - return decode( 2, 3 ); + return Payload.decode( 2, 3 ); } void IcmpDestinationUnreachableMessage::set_checksum( uint16_t checksum ) { - encode( 2, 3, checksum ); + Payload.encode( 2, 3, checksum ); } uint16_t IcmpDestinationUnreachableMessage::get_identifier() const { - return decode( 32, 33 ); + return Payload.decode( 32, 33 ); } void IcmpDestinationUnreachableMessage::set_identifier( const uint16_t identifier ) { - encode( 32, 33, identifier ); + Payload.encode( 32, 33, identifier ); } uint16_t IcmpDestinationUnreachableMessage::get_sequence_number() const { - return decode( 34, 35 ); + return Payload.decode( 34, 35 ); } void IcmpDestinationUnreachableMessage::set_sequence_number( const uint16_t sequence_number ) { - encode( 34, 35, sequence_number ); + Payload.encode( 34, 35, sequence_number ); } std::istream& IcmpDestinationUnreachableMessage::read( std::istream &is ) { - return is.read( - reinterpret_cast ( Payload ), - IcmpDestinationUnreachableMessage::MessageSizeInBytes - ); + return Payload.read( is ); } std::ostream& IcmpDestinationUnreachableMessage::write( std::ostream &os ) const { - return os.write( - reinterpret_cast ( Payload ), - IcmpDestinationUnreachableMessage::MessageSizeInBytes - ); -} - -uint16_t IcmpDestinationUnreachableMessage::decode( int left_byte, int right_byte ) const -{ - return ( Payload[ left_byte ] << 8 ) + Payload[ right_byte ]; -} - -void IcmpDestinationUnreachableMessage::encode( int left_byte, int right_byte, uint16_t value ) -{ - Payload[ left_byte ] = static_cast ( value >> 8 ); - Payload[ right_byte ] = static_cast ( value & 0xFF ); + return Payload.write( os ); } diff --git a/src/icmp/icmpdestinationunreachablemessage.h b/src/icmp/icmpdestinationunreachablemessage.h index e61ab71..cc7ef09 100644 --- a/src/icmp/icmpdestinationunreachablemessage.h +++ b/src/icmp/icmpdestinationunreachablemessage.h @@ -7,6 +7,7 @@ #include #include "icmp/icmpmessage.h" +#include "icmp/icmpmessagepayload.h" //----------------------------------------------------------------------------- // IcmpDestinationUnreachableMessage @@ -60,12 +61,7 @@ public: std::ostream& write( std::ostream &os ) const; private: - uint16_t decode( int left_byte, int right_byte ) const; - void encode( int left_byte, int right_byte, uint16_t value ); - -private: - static const int MessageSizeInBytes; - uint8_t Payload[ 44 ]; + IcmpMessagePayload Payload; }; diff --git a/src/icmp/icmpechoreplymessage.cpp b/src/icmp/icmpechoreplymessage.cpp index 55a8059..a65d645 100644 --- a/src/icmp/icmpechoreplymessage.cpp +++ b/src/icmp/icmpechoreplymessage.cpp @@ -6,11 +6,11 @@ using namespace std; // IcmpEchoReplyMessage //----------------------------------------------------------------------------- -const int IcmpEchoReplyMessage::MessageSizeInBytes = 8; +static const int MessageSizeInBytes = 8; -IcmpEchoReplyMessage::IcmpEchoReplyMessage() +IcmpEchoReplyMessage::IcmpEchoReplyMessage() : + Payload( MessageSizeInBytes ) { - fill( Payload, Payload + sizeof(Payload), 0 ); } IcmpEchoReplyMessage::~IcmpEchoReplyMessage() @@ -43,61 +43,44 @@ void IcmpEchoReplyMessage::set_code( uint8_t code ) uint16_t IcmpEchoReplyMessage::get_checksum() const { - return decode( 2, 3 ); + return Payload.decode( 2, 3 ); } void IcmpEchoReplyMessage::set_checksum( uint16_t checksum ) { - encode( 2, 3, checksum ); + Payload.encode( 2, 3, checksum ); } uint16_t IcmpEchoReplyMessage::get_identifier() const { - return decode( 4, 5 ); + return Payload.decode( 4, 5 ); } void IcmpEchoReplyMessage::set_identifier( const uint16_t identifier ) { - encode( 4, 5, identifier ); + Payload.encode( 4, 5, identifier ); } uint16_t IcmpEchoReplyMessage::get_sequence_number() const { - return decode( 6, 7 ); + return Payload.decode( 6, 7 ); } void IcmpEchoReplyMessage::set_sequence_number( const uint16_t sequence_number ) { - encode( 6, 7, sequence_number ); + Payload.encode( 6, 7, sequence_number ); } std::istream& IcmpEchoReplyMessage::read( std::istream &is ) { - return is.read( - reinterpret_cast ( Payload ), - IcmpEchoReplyMessage::MessageSizeInBytes - ); + return Payload.read( is ); } std::ostream& IcmpEchoReplyMessage::write( std::ostream &os ) const { - return os.write( - reinterpret_cast ( Payload ), - IcmpEchoReplyMessage::MessageSizeInBytes - ); -} - -uint16_t IcmpEchoReplyMessage::decode( int left_byte, int right_byte ) const -{ - return ( Payload[ left_byte ] << 8 ) + Payload[ right_byte ]; -} - -void IcmpEchoReplyMessage::encode( int left_byte, int right_byte, uint16_t value ) -{ - Payload[ left_byte ] = static_cast ( value >> 8 ); - Payload[ right_byte ] = static_cast ( value & 0xFF ); + return Payload.write( os ); } diff --git a/src/icmp/icmpechoreplymessage.h b/src/icmp/icmpechoreplymessage.h index 5e2b47f..d136de9 100644 --- a/src/icmp/icmpechoreplymessage.h +++ b/src/icmp/icmpechoreplymessage.h @@ -7,6 +7,7 @@ #include #include "icmp/icmpmessage.h" +#include "icmp/icmpmessagepayload.h" //----------------------------------------------------------------------------- // IcmpEchoReplyMessage @@ -56,12 +57,7 @@ public: std::ostream& write( std::ostream &os ) const; private: - uint16_t decode( int left_byte, int right_byte ) const; - void encode( int left_byte, int right_byte, uint16_t value ); - -private: - static const int MessageSizeInBytes; - uint8_t Payload[ 8 ]; + IcmpMessagePayload Payload; }; diff --git a/src/icmp/icmpechorequestmessage.cpp b/src/icmp/icmpechorequestmessage.cpp index 4067e71..254031b 100644 --- a/src/icmp/icmpechorequestmessage.cpp +++ b/src/icmp/icmpechorequestmessage.cpp @@ -6,11 +6,11 @@ using namespace std; // IcmpEchoRequestMessage //----------------------------------------------------------------------------- -const int IcmpEchoRequestMessage::MessageSizeInBytes = 8; +static const int MessageSizeInBytes = 8; -IcmpEchoRequestMessage::IcmpEchoRequestMessage() +IcmpEchoRequestMessage::IcmpEchoRequestMessage() : + Payload( MessageSizeInBytes ) { - fill( Payload, Payload + sizeof(Payload), 0 ); } IcmpEchoRequestMessage::~IcmpEchoRequestMessage() @@ -43,61 +43,44 @@ void IcmpEchoRequestMessage::set_code( uint8_t code ) uint16_t IcmpEchoRequestMessage::get_checksum() const { - return decode( 2, 3 ); + return Payload.decode( 2, 3 ); } void IcmpEchoRequestMessage::set_checksum( uint16_t checksum ) { - encode( 2, 3, checksum ); + Payload.encode( 2, 3, checksum ); } uint16_t IcmpEchoRequestMessage::get_identifier() const { - return decode( 4, 5 ); + return Payload.decode( 4, 5 ); } void IcmpEchoRequestMessage::set_identifier( const uint16_t identifier ) { - encode( 4, 5, identifier ); + Payload.encode( 4, 5, identifier ); } uint16_t IcmpEchoRequestMessage::get_sequence_number() const { - return decode( 6, 7 ); + return Payload.decode( 6, 7 ); } void IcmpEchoRequestMessage::set_sequence_number( const uint16_t sequence_number ) { - encode( 6, 7, sequence_number ); + Payload.encode( 6, 7, sequence_number ); } std::istream& IcmpEchoRequestMessage::read( std::istream &is ) { - return is.read( - reinterpret_cast ( Payload ), - IcmpEchoRequestMessage::MessageSizeInBytes - ); + return Payload.read( is ); } std::ostream& IcmpEchoRequestMessage::write( std::ostream &os ) const { - return os.write( - reinterpret_cast ( Payload ), - IcmpEchoRequestMessage::MessageSizeInBytes - ); -} - -uint16_t IcmpEchoRequestMessage::decode( int left_byte, int right_byte ) const -{ - return ( Payload[ left_byte ] << 8 ) + Payload[ right_byte ]; -} - -void IcmpEchoRequestMessage::encode( int left_byte, int right_byte, uint16_t value ) -{ - Payload[ left_byte ] = static_cast ( value >> 8 ); - Payload[ right_byte ] = static_cast ( value & 0xFF ); + return Payload.write( os ); } diff --git a/src/icmp/icmpechorequestmessage.h b/src/icmp/icmpechorequestmessage.h index 0eb1d2e..4e96fe9 100644 --- a/src/icmp/icmpechorequestmessage.h +++ b/src/icmp/icmpechorequestmessage.h @@ -7,6 +7,7 @@ #include #include "icmp/icmpmessage.h" +#include "icmp/icmpmessagepayload.h" //----------------------------------------------------------------------------- // IcmpEchoRequestMessage @@ -56,12 +57,7 @@ public: std::ostream& write( std::ostream &os ) const; private: - uint16_t decode( int left_byte, int right_byte ) const; - void encode( int left_byte, int right_byte, uint16_t value ); - -private: - static const int MessageSizeInBytes; - uint8_t Payload[ 8 ]; + IcmpMessagePayload Payload; }; diff --git a/src/icmp/icmpmessagepayload.cpp b/src/icmp/icmpmessagepayload.cpp new file mode 100644 index 0000000..e6e8391 --- /dev/null +++ b/src/icmp/icmpmessagepayload.cpp @@ -0,0 +1,67 @@ +#include "icmp/icmpmessagepayload.h" + +#include + +using namespace std; +using boost::scoped_array; + +//----------------------------------------------------------------------------- +// IcmpMessagePayload +//----------------------------------------------------------------------------- + +IcmpMessagePayload::IcmpMessagePayload( + size_t payload_size_in_bytes +) : + PayloadSizeInBytes( payload_size_in_bytes ), + Payload( new uint8_t[ payload_size_in_bytes ] ) +{ + fill( Payload.get(), Payload.get() + PayloadSizeInBytes, 0 ); +} + +IcmpMessagePayload::~IcmpMessagePayload() +{ +} + +const uint8_t& IcmpMessagePayload::operator[]( size_t offset ) const +{ + return Payload[ offset ]; +} + +uint8_t& IcmpMessagePayload::operator[]( size_t offset ) +{ + return Payload[ offset ]; +} + +uint16_t IcmpMessagePayload::decode( + const int left_byte, + const int right_byte +) const +{ + return ( Payload[ left_byte ] << 8 ) + Payload[ right_byte ]; +} + +void IcmpMessagePayload::encode( + const int left_byte, + const int right_byte, + const uint16_t value +) +{ + Payload[ left_byte ] = static_cast ( value >> 8 ); + Payload[ right_byte ] = static_cast ( value & 0xFF ); +} + +istream& IcmpMessagePayload::read( istream &is ) +{ + char *data_array = reinterpret_cast ( Payload.get() ); + is.read( data_array, PayloadSizeInBytes ); + + BOOST_ASSERT( is.gcount() == PayloadSizeInBytes ); + + return is; +} + +ostream& IcmpMessagePayload::write( ostream &os ) const +{ + const char *data_array = reinterpret_cast ( Payload.get() ); + return os.write( data_array, PayloadSizeInBytes ); +} diff --git a/src/icmp/icmpmessagepayload.h b/src/icmp/icmpmessagepayload.h new file mode 100644 index 0000000..2ba14e6 --- /dev/null +++ b/src/icmp/icmpmessagepayload.h @@ -0,0 +1,43 @@ +#ifndef ICMPMESSAGEPAYLOAD_H +#define ICMPMESSAGEPAYLOAD_H + +#include + +#include +#include + +#include + +//----------------------------------------------------------------------------- +// IcmpMessagePayload +//----------------------------------------------------------------------------- + +class IcmpMessagePayload +{ +public: + IcmpMessagePayload( std::size_t payload_size_in_bytes ); + ~IcmpMessagePayload(); + + const uint8_t& operator[]( std::size_t offset ) const; + uint8_t& operator[]( std::size_t offset ); + + uint16_t decode( + const int left_byte, + const int right_byte + ) const; + void encode( + const int left_byte, + const int right_byte, + const uint16_t value + ); + + std::istream& read( std::istream &is ); + std::ostream& write( std::ostream &os ) const; + +private: + const int PayloadSizeInBytes; + boost::scoped_array Payload; + +}; + +#endif /* ICMPMESSAGEPAYLOAD_H */ -- 1.7.1