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, 29 Feb 2008 11:54:54 +0000

CVSROOT:        /sources/certi
Module name:    certi
Changes by:     Eric NOULARD <erk>      08/02/29 11:54:54

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

Log message:
        Add one value retval API MessageBuffer 
        Update CertiUtilTest accordingly

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/MessageBuffer.cc?cvsroot=certi&r1=3.5&r2=3.6
http://cvs.savannah.gnu.org/viewcvs/certi/libCERTI/MessageBuffer.hh?cvsroot=certi&r1=3.4&r2=3.5
http://cvs.savannah.gnu.org/viewcvs/certi/test/utility/CertiUtilTests.cc?cvsroot=certi&r1=1.6&r2=1.7

Patches:
Index: libCERTI/MessageBuffer.cc
===================================================================
RCS file: /sources/certi/certi/libCERTI/MessageBuffer.cc,v
retrieving revision 3.5
retrieving revision 3.6
diff -u -b -r3.5 -r3.6
--- libCERTI/MessageBuffer.cc   26 Feb 2008 09:58:34 -0000      3.5
+++ libCERTI/MessageBuffer.cc   29 Feb 2008 11:54:54 -0000      3.6
@@ -60,8 +60,8 @@
        buffer = NULL;
        bufferMaxSize = DEFAULT_MESSAGE_BUFFER_SIZE;
        bufferHasMyEndianness = true;
-       writeOffset = 0;
-       readOffset = 0;
+       writeOffset  = reservedBytes;
+       readOffset   = reservedBytes;
 } /* end of MessageBuffer::initialize() */
 
 MessageBuffer::MessageBuffer() {
@@ -101,6 +101,14 @@
                        oldbuf = NULL;
                }
        }
+       
+       /* set up buffer endianess */
+       if ((HostIsBigEndian() && bufferHasMyEndianness) ||
+           (HostIsLittleEndian())) {
+          buffer[0] = 0x01;       
+       } else {
+          buffer[0] = 0x00;
+       }
 } /* end of MessageBuffer::MessageBuffer(uint32_t) */
 
 MessageBuffer::~MessageBuffer() {
@@ -119,23 +127,26 @@
 
 void MessageBuffer::assumeBufferIsBigEndian() {
        this->bufferHasMyEndianness = HostIsBigEndian();
+       buffer[0] = 0x01;
 } /* end of MessageBuffer::assumeBufferIsBigEndian() */
 
 void MessageBuffer::assumeBufferIsLittleEndian() {
        this->bufferHasMyEndianness = HostIsLittleEndian();    
+       buffer[0] = 0x00;
 } /* end of MessageBuffer::assumeBufferIsLittleEndian() */
 
-void MessageBuffer::resetBuffer() {
+void MessageBuffer::reset() {
        bufferHasMyEndianness = true;
-       writeOffset           = 0;
-       readOffset            = 0;
+       writeOffset           = reservedBytes;
+       readOffset            = reservedBytes;
 } /* MessageBuffer::resetBuffer() */
 
 uint32_t MessageBuffer::resize(uint32_t newSize) {
        reallocate(newSize);
 }
+
 void MessageBuffer::assumeSize(uint32_t size) {
-       /* this is done in order to overflow 
+       /* This is done in order to overflow 
         * buffer max size but this may well be
         * an error (FIXME should throw an exception ?) 
         */
@@ -144,9 +155,21 @@
        } else {
            writeOffset       = bufferMaxSize;
        }
-       readOffset            = 0;
 }
 
+void MessageBuffer::assumeSizeFromReservedBytes() {
+       /* verify endianity from reserved byte 0 */
+       if (buffer[0]==0x01) {
+               assumeBufferIsBigEndian();
+       } else {
+               assumeBufferIsLittleEndian();   
+       }
+       /* read size from reserved bytes 1..4 */
+       readOffset = 1;
+       assumeSize(this->read_uint32());
+}
+
+
 int32_t MessageBuffer::write_uint8s(const uint8_t* data, uint32_t n) {
 
        if (n >= (bufferMaxSize - writeOffset)) {
@@ -396,13 +419,18 @@
  return retval;
 }
 
-MessageBuffer::operator const void*(){
-       return buffer;
+void*
+MessageBuffer::operator ()(uint32_t offset) {  
+       return buffer+offset;
 }
 
-MessageBuffer::operator void*() {
-       return buffer;
-}
+//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.4
retrieving revision 3.5
diff -u -b -r3.4 -r3.5
--- libCERTI/MessageBuffer.hh   26 Feb 2008 09:58:34 -0000      3.4
+++ libCERTI/MessageBuffer.hh   29 Feb 2008 11:54:54 -0000      3.5
@@ -47,16 +47,26 @@
         * 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. 
+        * Show n bytes of data content in hexa on stdout. 
         */
        static void show(const void* data, uint32_t n);
 
+       /* 
+        * We reserve 5 bytes at the beginning of the buffer
+        * The first byte is a bitset which is used to 
+        * to tell if the buffer is big or little endian
+        * The 4 following bytes is for an uint32_t which
+        * may be used to store the buffer size
+        */ 
+       static const uint8_t reservedBytes = 5;
+
        /**
         * Default message buffer constructor.
         * The default message buffer size is DEFAULT_MESSAGE_BUFFER_SIZE.
@@ -108,7 +118,13 @@
         * to re-use a buffer in order to avoid reallocation.
         */
        void
-       resetBuffer();
+       reset();
+
+       /**
+        * Seek buffer in order to write at specified place
+        * Will set the write pointer to the seeked offset.
+        */
+       void seek_write(uint32_t offset);
        
        /**
         * Resize the current maximum buffer size (in bytes).
@@ -128,27 +144,36 @@
         */
        void assumeSize(uint32_t size);
 
+       void assumeSizeFromReservedBytes();
+
 #define DECLARE_SIGNED(type)                           \
   int32_t                                              \
   write_##type##s(const type##_t* data, uint32_t n) {          \
     return write_u##type##s(reinterpret_cast<const u##type##_t*>(data),n);     
\
-  }                                                    \
-                                                       \
-  int32_t                                              \
-  read_##type##s(type##_t* data, uint32_t n) {         \
+}                                                      \
+\
+int32_t                                                \
+read_##type##s(type##_t* data, uint32_t n) {           \
     return read_u##type##s(reinterpret_cast<u##type##_t*>(data),n);    \
-  }                                                    \
+}                                                      \
     
 #define DECLARE_SINGLE_READ_WRITE(type,suffix)     \
   int32_t                                              \
   write_##type(const type##suffix data) {              \
     return write_##type##s(&data,1);   \
-  }                                                    \
-                                                       \
-  int32_t                                              \
-  read_##type(type##suffix* data) {            \
+}                                                      \
+\
+int32_t                                                \
+read_##type(type##suffix* data) {              \
     return read_##type##s(data,1);     \
-  }        
+}                                    \
+\
+type##suffix read_##type() {\
+       type##suffix retval;     \
+       read_##type##s(&retval,1);\
+       return retval; \
+} 
+
 
        int32_t
        write_uint8s(const uint8_t* data, uint32_t n);
@@ -229,20 +254,15 @@
                return *this;
        }
 
-       /**
-        * Cast operator to const void*
-        * to be used (for example) in send system call.
+       /*
+        * Pseudo index operator.
+        * This will be used in send/receive socket call.
+        * @return address of the underlying buffer + offset.
         */
-
-       operator const void *();
-
-       /**
-        * Cast operator to void*
-        * To be used (for example) in recv system call.
-        */
-       operator void *();
+       void* operator ()(uint32_t offset);
 
 private:
+
        /** The buffer itself */
        uint8_t* buffer;
        /** The provisioned buffer size */
@@ -254,6 +274,7 @@
         * where the next write operation will write to.
         */
        uint32_t writeOffset;
+
        /** 
         * The read offset is the offset of the buffer
         * where the next read operation will read from.

Index: test/utility/CertiUtilTests.cc
===================================================================
RCS file: /sources/certi/certi/test/utility/CertiUtilTests.cc,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- test/utility/CertiUtilTests.cc      26 Feb 2008 09:58:34 -0000      1.6
+++ test/utility/CertiUtilTests.cc      29 Feb 2008 11:54:54 -0000      1.7
@@ -115,7 +115,32 @@
        cout << "    std::string = " << vstdstr << endl;
        cout << "    All encoded/decoded values are equal." << endl;
        cout << "    Now reset buffer." << endl;
-       MsgBuf.resetBuffer();
+       MsgBuf.reset();
+       cout << "    Re-write on buffer..." << endl;
+       MsgBuf.write_uint8(u8);
+       MsgBuf.write_uint16(u16);
+       MsgBuf.write_uint32(u32);
+       MsgBuf.write_uint64(u64);
+       MsgBuf.write_int8(i8);
+       MsgBuf.write_int16(i16);
+       MsgBuf.write_int32(i32);
+       MsgBuf.write_int64(i64);
+       MsgBuf.write_float(f32);
+       MsgBuf.write_double(d64);
+       cout << "   Read using alternative method..." <<endl;
+       vu8  = MsgBuf.read_uint8(); assert(vu8==u8);
+       vu16 = MsgBuf.read_uint16(); assert(vu16==u16); 
+       vu32 = MsgBuf.read_uint32(); assert(vu32==u32);
+       vu64 = MsgBuf.read_uint64(); assert(vu64==u64);
+       vi8  = MsgBuf.read_int8(); assert(vi8==i8);
+       vi16 = MsgBuf.read_int16(); assert(vi16==i16);
+       vi32 = MsgBuf.read_int32(); assert(vi32==i32);
+       vi64 = MsgBuf.read_int64(); assert(vi64==i64);
+       vf32 = MsgBuf.read_float(); assert(vf32==f32);
+       vd64 = MsgBuf.read_double(); assert(vd64==d64);
+       cout << "    All encoded/decoded values are equal." << endl;
+       cout << "    Now reset buffer." << endl;
+       MsgBuf.reset();
        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;
@@ -153,7 +178,7 @@
        
        cout << "    Trying to overload the buffer..." <<endl;
        cout << "    Current (Default) MessageBuffer MaxSize               = 
"<< MsgBuf.maxSize() <<endl;
-       MsgBuf.resetBuffer();
+       MsgBuf.reset();
        u32 = MsgBuf.maxSize()*2;
        vstr = new char[u32+1];
        vstr[u32]='\0';
@@ -170,7 +195,7 @@
        MsgBuf.resize(MsgBuf.maxSize()*2);
        cout << "    Current           MessageBuffer MaxSize               = 
"<< MsgBuf.maxSize() <<endl;
     cout << "    Now reset buffer and assume size is                   = "<< 
u32 << endl;      
-       MsgBuf.resetBuffer();
+       MsgBuf.reset();
        MsgBuf.assumeSize(u32);
        vstdstr = "";
        vstdstr = MsgBuf.read_string();




reply via email to

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