[Top][All Lists]
[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();