certi-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

certi libCERTI/MessageBuffer.cc libCERTI/Messag...


From: certi-cvs
Subject: certi libCERTI/MessageBuffer.cc libCERTI/Messag...
Date: Fri, 15 Feb 2008 13:24:07 +0000

CVSROOT:        /sources/certi
Module name:    certi
Changes by:     Eric NOULARD <erk>      08/02/15 13:24:07

Modified files:
        libCERTI       : MessageBuffer.cc MessageBuffer.hh 
        test/utility   : CertiUtilTests.cc 

Log message:
        MessageBuffer update

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/MessageBuffer.cc?cvsroot=certi&r1=3.1&r2=3.2
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/MessageBuffer.hh?cvsroot=certi&r1=3.2&r2=3.3
http://cvs.savannah.gnu.org/viewcvs/certi/test/utility/CertiUtilTests.cc?cvsroot=certi&r1=1.3&r2=1.4

Patches:
Index: libCERTI/MessageBuffer.cc
===================================================================
RCS file: /sources/certi/certi/libCERTI/MessageBuffer.cc,v
retrieving revision 3.1
retrieving revision 3.2
diff -u -b -r3.1 -r3.2
--- libCERTI/MessageBuffer.cc   14 Feb 2008 15:29:58 -0000      3.1
+++ libCERTI/MessageBuffer.cc   15 Feb 2008 13:24:06 -0000      3.2
@@ -22,9 +22,40 @@
 #include "MessageBuffer.hh"
 #include <cassert>
 #include <sstream>
+#include <iomanip>
 
 namespace certi {
 
+const bool 
+MessageBuffer::HostIsBigEndian() {
+#ifdef HOST_IS_BIG_ENDIAN
+       return true;
+#else    
+       return false;
+#endif
+}
+
+const bool 
+MessageBuffer::HostIsLittleEndian() {
+#ifdef HOST_IS_BIG_ENDIAN
+       return false;
+#else    
+       return true;
+#endif
+}
+
+void
+MessageBuffer::show(const void* data, uint32_t n) {
+   uint32_t i;
+   const uint8_t* u8data = reinterpret_cast<const uint8_t*>(data);
+   for (i=0;i<n;++i) {
+          if ((0==(i%2))&&(i>0)) {
+                          printf(" ");
+          }
+          printf("%02X",u8data[i]);      
+   }   
+}
+
 void MessageBuffer::initialize() {
        buffer = NULL;
        bufferMaxSize = DEFAULT_MESSAGE_BUFFER_SIZE;
@@ -87,19 +118,11 @@
 }
 
 void MessageBuffer::assumeBufferIsBigEndian() {
-#ifdef HOST_IS_BIG_ENDIAN
-       this->bufferHasMyEndianness = true;
-#else    
-       this->bufferHasMyEndianness = false;
-#endif
+       this->bufferHasMyEndianness = HostIsBigEndian();
 } /* end of MessageBuffer::assumeBufferIsBigEndian() */
 
 void MessageBuffer::assumeBufferIsLittleEndian() {
-#ifdef HOST_IS_BIG_ENDIAN
-       this->bufferHasMyEndianness = false;
-#else    
-       this->bufferHasMyEndianness = true;
-#endif    
+       this->bufferHasMyEndianness = HostIsLittleEndian();    
 } /* end of MessageBuffer::assumeBufferIsLittleEndian() */
 
 void MessageBuffer::resetBuffer() {
@@ -258,9 +281,10 @@
        } else {
                buffer_uint32 = reinterpret_cast<uint32_t*>(buffer+writeOffset);
                data32 = reinterpret_cast<const uint32_t*>(data);
-               for (i=0; i<2*n; ++i) {
-                       buffer_uint32[i] = CERTI_UINT32_SWAP_BYTES(data32[i]);
-                       writeOffset += 4;
+               for (i=0; i<n; ++i) {
+                       buffer_uint32[i] = CERTI_UINT32_SWAP_BYTES(data32[i+1]);
+                       buffer_uint32[i+1] = CERTI_UINT32_SWAP_BYTES(data32[i]);
+                       writeOffset += 8;
                }
        }
        return (writeOffset-8*n);
@@ -287,9 +311,10 @@
        } else {
                buffer_uint32 = reinterpret_cast<uint32_t*>(buffer+readOffset);
                data32 = reinterpret_cast<uint32_t*>(data);
-               for (i=0; i<2*n; ++i) {
-                       data32[i] = CERTI_UINT32_SWAP_BYTES(buffer_uint32[i]);
-                       readOffset += 4;
+               for (i=0; i<n; ++i) {
+                       data32[i+1] = CERTI_UINT32_SWAP_BYTES(buffer_uint32[i]);
+                       data32[i] = CERTI_UINT32_SWAP_BYTES(buffer_uint32[i+1]);
+                       readOffset += 8;
                }
        }
        return (readOffset-8*n);
@@ -319,5 +344,37 @@
        return read_uint64s(data64,n);
 }
 
+int32_t
+MessageBuffer::write_string(const std::string& str) {
+   write_int32(str.length());
+   write_chars(str.c_str(),str.length());
+}
+  
+std::string 
+MessageBuffer::read_string() {
+ std::string retval;
+ int32_t len;
+ char* buf;
+ 
+ read_int32(&len);
+ buf = new char[len+1];
+ read_chars(buf,len);
+ /* terminate the string */
+ buf[len] = '\0';
+ /* build an std::string and retrun it */
+ retval = std::string(buf);
+ delete[] buf;
+ return retval;
+}
+
+MessageBuffer::operator const void*(){
+       return buffer;
+}
+
+MessageBuffer::operator void*() {
+       return buffer;
+}
+
+
 } // certi
 

Index: libCERTI/MessageBuffer.hh
===================================================================
RCS file: /sources/certi/certi/libCERTI/MessageBuffer.hh,v
retrieving revision 3.2
retrieving revision 3.3
diff -u -b -r3.2 -r3.3
--- libCERTI/MessageBuffer.hh   14 Feb 2008 15:49:40 -0000      3.2
+++ libCERTI/MessageBuffer.hh   15 Feb 2008 13:24:07 -0000      3.3
@@ -42,6 +42,21 @@
 class CERTI_EXPORT MessageBuffer
 {
 public:
+
+  /**
+   * Return true if the host is BidEndian
+   */
+  static const bool HostIsBigEndian();
+  /**
+        * Return true if the host is LittleEndian
+        */
+  static const bool HostIsLittleEndian();
+  
+  /**
+   * Show n bytes of data content in hexa on ostream. 
+   */
+  static void show(const void* data, uint32_t n);
+  
   /**
    * Default message buffer constructor.
    * The default message buffer size is DEFAULT_MESSAGE_BUFFER_SIZE.
@@ -185,11 +200,30 @@
   
   DECLARE_SINGLE_READ_WRITE(double,)    
   
-  MessageBuffer& operator<<(uint8_t data) {
+  int32_t
+  write_string(const std::string& str);
+  
+  std::string 
+  read_string();
+  
+  MessageBuffer& operator<<(const uint8_t data) {
          this->write_uint8(data);
          return *this;
   }
 
+  /**
+   * Cast operator to const void*
+   * to be used (for example) in send system call.
+   */
+  
+  operator const void *();
+  
+  /**
+   * Cast operator to void*
+   * To be used (for example) in recv system call.
+   */
+  operator void *();
+
 private: 
   /** The buffer itself */
   uint8_t*         buffer;  

Index: test/utility/CertiUtilTests.cc
===================================================================
RCS file: /sources/certi/certi/test/utility/CertiUtilTests.cc,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- test/utility/CertiUtilTests.cc      14 Feb 2008 15:29:58 -0000      1.3
+++ test/utility/CertiUtilTests.cc      15 Feb 2008 13:24:07 -0000      1.4
@@ -30,6 +30,7 @@
 #include "PrettyDebug.hh"
 #include "MessageBuffer.hh"
 #include <cassert>
+#include <string>
 
 #include "Clock.hh"
 void clockTests(certi::Clock& aClock) {
@@ -52,6 +53,7 @@
 #endif
 
 void messageBufferTests(certi::MessageBuffer& MsgBuf) {
+       std::string    stdstr = "a std:string";
        const char*   str = "bouhlala";
        uint8_t  u8   =  232;
        int8_t   i8   = -125;
@@ -64,6 +66,7 @@
        float    f32  = 3.1415927;
        double   d64  = 2.7182818;
        char*    vstr = NULL;   
+       std::string  vstdstr;
        uint8_t  vu8   = 0;
        int8_t   vi8   = 0;
        uint16_t vu16  = 0;
@@ -75,8 +78,8 @@
        float    vf32  = 0.0;
        double   vd64  = 0.0;   
        cout << "Testing MessageBuffer class BEGIN..."<<endl;
-       cout << "    Default MessageBuffer MaxSize               ="<< 
MsgBuf.maxSize() <<endl;
-       cout << "    Current (initially void) MessageBuffer size ="<< 
MsgBuf.size()<<endl;
+       cout << "    Default MessageBuffer MaxSize               = "<< 
MsgBuf.maxSize() <<endl;
+       cout << "    Current (initially void) MessageBuffer size = "<< 
MsgBuf.size()<<endl;
        cout << "    Encoding to buffer..." <<endl;
        cout << "    bytes string = " << str << endl;
        MsgBuf.write_uint32(strlen(str)+1);
@@ -91,6 +94,8 @@
        MsgBuf.write_int64(i64);
        MsgBuf.write_float(f32);
        MsgBuf.write_double(d64);
+       cout << "    std::string = " << stdstr << endl;
+       MsgBuf.write_string(stdstr);
        cout << "    Current MessageBuffer size                  = "<< 
MsgBuf.size()<<endl;
        cout << "    Decoding from buffer..." <<endl;
        MsgBuf.read_uint32(&vu32);
@@ -108,12 +113,48 @@
        MsgBuf.read_int64(&vi64); assert(vi64==i64);
        MsgBuf.read_float(&vf32); assert(vf32==f32);
        MsgBuf.read_double(&vd64); assert(vd64==d64);
+       vstdstr  = MsgBuf.read_string(); assert(vstdstr==stdstr);
+       cout << "    std::string = " << vstdstr << endl;
     cout << "    All encoded/decoded values are equal." << endl;
+       cout << "    Now reset buffer." << endl;
+       MsgBuf.resetBuffer();
+       cout << "    Re-write on buffer..." << endl;
+       MsgBuf.write_uint8(u8);  cout << "        Written <"; 
certi::MessageBuffer::show(&u8,1); cout << ">" << endl;
+       MsgBuf.write_uint16(u16);cout << "        Written <"; 
certi::MessageBuffer::show(&u16,2); cout << ">" << endl;
+       MsgBuf.write_uint32(u32);cout << "        Written <"; 
certi::MessageBuffer::show(&u32,4); cout << ">" << endl;
+       MsgBuf.write_uint64(u64);cout << "        Written <"; 
certi::MessageBuffer::show(&u64,8); cout << ">" << endl;
+       MsgBuf.write_int8(i8);cout << "        Written <"; 
certi::MessageBuffer::show(&i8,1); cout << ">" << endl;
+       MsgBuf.write_int16(i16);cout << "        Written <"; 
certi::MessageBuffer::show(&i16,2); cout << ">" << endl;
+       MsgBuf.write_int32(i32);cout << "        Written <"; 
certi::MessageBuffer::show(&i32,4); cout << ">" << endl;
+       MsgBuf.write_int64(i64);cout << "        Written <"; 
certi::MessageBuffer::show(&i64,8); cout << ">" << endl;
+       MsgBuf.write_float(f32);cout << "        Written <"; 
certi::MessageBuffer::show(&f32,4); cout << ">" << endl;
+       MsgBuf.write_double(d64);cout << "        Written <"; 
certi::MessageBuffer::show(&d64,8); cout << ">" << endl;
+
+       cout << "    ...and assume it is ";    
+       if (certi::MessageBuffer::HostIsBigEndian()) {
+               cout << "Little Endian";
+               MsgBuf.assumeBufferIsLittleEndian();
+               cout << " whereas the host was big" << endl;
+       }
+       if (certi::MessageBuffer::HostIsLittleEndian()) {
+               cout << "Big Endian";
+               MsgBuf.assumeBufferIsBigEndian();
+               cout << " whereas the host was little" << endl;
+       }
+       MsgBuf.read_uint8(&vu8);  cout << "        Read  <"; 
certi::MessageBuffer::show(&vu8,1); cout << ">" << endl;
+       MsgBuf.read_uint16(&vu16);cout << "        Read <"; 
certi::MessageBuffer::show(&vu16,2); cout << ">" << endl;
+       MsgBuf.read_uint32(&vu32);cout << "        Read <"; 
certi::MessageBuffer::show(&vu32,4); cout << ">" << endl;
+       MsgBuf.read_uint64(&vu64);cout << "        Read <"; 
certi::MessageBuffer::show(&vu64,8); cout << ">" << endl;
+       MsgBuf.read_int8(&vi8);cout << "        Read <"; 
certi::MessageBuffer::show(&vi8,1); cout << ">" << endl;
+       MsgBuf.read_int16(&vi16);cout << "        Read <"; 
certi::MessageBuffer::show(&vi16,2); cout << ">" << endl;
+       MsgBuf.read_int32(&vi32);cout << "        Read <"; 
certi::MessageBuffer::show(&vi32,4); cout << ">" << endl;
+       MsgBuf.read_int64(&vi64);cout << "        Read <"; 
certi::MessageBuffer::show(&vi64,8); cout << ">" << endl;
+       MsgBuf.read_float(&vf32);cout << "        Read <"; 
certi::MessageBuffer::show(&vf32,4); cout << ">" << endl;
+       MsgBuf.read_double(&vd64);cout << "        Read <"; 
certi::MessageBuffer::show(&vd64,8); cout << ">" << endl;
     
        cout << "Testing MessageBuffer class END."<<endl;
 } /* end of messageBufferTests */
 
-
 int
 main(int argc, char **argv)
 {      
@@ -127,13 +168,14 @@
 
     cout << "CERTI Utility Tests->BEGIN..."<< endl ;
 
-       cout << "    Host is " << 
-#ifdef HOST_IS_BIG_ENDIAN
-         "Big Endian"
-#else
-         "Little Endian"
-#endif
-            << endl;   
+       cout << "    Host is ";
+       if (certi::MessageBuffer::HostIsBigEndian()) {
+               cout << "Big Endian";
+       }
+       if (certi::MessageBuffer::HostIsLittleEndian()) {
+               cout << "Little Endian";
+       }
+       cout << endl;   
     messageBufferTests(MsgBuf);
 #ifdef HAVE_TSC_CLOCK
     clockTests(tscClk);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]