Encapsulated the encode, decode, read and write methods within the IcmpMessagePayload...
authorGuilherme Maciel Ferreira <guilherme.maciel.ferreira@intra2net.com>
Tue, 12 Apr 2011 08:43:25 +0000 (10:43 +0200)
committerGuilherme Maciel Ferreira <guilherme.maciel.ferreira@intra2net.com>
Tue, 12 Apr 2011 08:43:25 +0000 (10:43 +0200)
- simplify the message classes

src/CMakeLists.txt
src/icmp/icmpdestinationunreachablemessage.cpp
src/icmp/icmpdestinationunreachablemessage.h
src/icmp/icmpechoreplymessage.cpp
src/icmp/icmpechoreplymessage.h
src/icmp/icmpechorequestmessage.cpp
src/icmp/icmpechorequestmessage.h
src/icmp/icmpmessagepayload.cpp [new file with mode: 0644]
src/icmp/icmpmessagepayload.h [new file with mode: 0644]

index c062424..13ee4d3 100644 (file)
@@ -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
index 3c1fd98..1946453 100644 (file)
@@ -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<char *> ( Payload ),
-            IcmpDestinationUnreachableMessage::MessageSizeInBytes
-    );
+    return Payload.read( is );
 }
 
 std::ostream& IcmpDestinationUnreachableMessage::write(
         std::ostream &os
 ) const
 {
-    return os.write(
-            reinterpret_cast<const char *> ( 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<uint8_t> ( value >> 8 );
-    Payload[ right_byte ] = static_cast<uint8_t> ( value & 0xFF );
+    return Payload.write( os );
 }
index e61ab71..cc7ef09 100644 (file)
@@ -7,6 +7,7 @@
 #include <ostream>
 
 #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;
 
 };
 
index 55a8059..a65d645 100644 (file)
@@ -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<char *> ( Payload ),
-            IcmpEchoReplyMessage::MessageSizeInBytes
-    );
+    return Payload.read( is );
 }
 
 std::ostream& IcmpEchoReplyMessage::write( std::ostream &os ) const
 {
-    return os.write(
-            reinterpret_cast<const char *> ( 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<uint8_t> ( value >> 8 );
-    Payload[ right_byte ] = static_cast<uint8_t> ( value & 0xFF );
+    return Payload.write( os );
 }
index 5e2b47f..d136de9 100644 (file)
@@ -7,6 +7,7 @@
 #include <ostream>
 
 #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;
 
 };
 
index 4067e71..254031b 100644 (file)
@@ -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<char *> ( Payload ),
-            IcmpEchoRequestMessage::MessageSizeInBytes
-    );
+    return Payload.read( is );
 }
 
 std::ostream& IcmpEchoRequestMessage::write( std::ostream &os ) const
 {
-    return os.write(
-            reinterpret_cast<const char *> ( 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<uint8_t> ( value >> 8 );
-    Payload[ right_byte ] = static_cast<uint8_t> ( value & 0xFF );
+    return Payload.write( os );
 }
index 0eb1d2e..4e96fe9 100644 (file)
@@ -7,6 +7,7 @@
 #include <ostream>
 
 #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 (file)
index 0000000..e6e8391
--- /dev/null
@@ -0,0 +1,67 @@
+#include "icmp/icmpmessagepayload.h"
+
+#include <boost/assert.hpp>
+
+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<uint8_t> ( value >> 8 );
+    Payload[ right_byte ] = static_cast<uint8_t> ( value & 0xFF );
+}
+
+istream& IcmpMessagePayload::read( istream &is )
+{
+    char *data_array = reinterpret_cast<char *> ( 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<const char *> ( Payload.get() );
+    return os.write( data_array, PayloadSizeInBytes );
+}
diff --git a/src/icmp/icmpmessagepayload.h b/src/icmp/icmpmessagepayload.h
new file mode 100644 (file)
index 0000000..2ba14e6
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef ICMPMESSAGEPAYLOAD_H
+#define ICMPMESSAGEPAYLOAD_H
+
+#include <stdint.h>
+
+#include <istream>
+#include <ostream>
+
+#include <boost/scoped_array.hpp>
+
+//-----------------------------------------------------------------------------
+// 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<uint8_t> Payload;
+
+};
+
+#endif /* ICMPMESSAGEPAYLOAD_H */