From 4a276d04cb87d3be6f8a2733a62d8ac699032cac Mon Sep 17 00:00:00 2001 From: David Rose Date: Wed, 1 Oct 2003 23:28:51 +0000 Subject: [PATCH] add string32 (for dc blob32 field) --- panda/src/express/datagram.I | 15 +++++++++++++++ panda/src/express/datagram.h | 1 + panda/src/express/datagramIterator.cxx | 22 ++++++++++++++++++++++ panda/src/express/datagramIterator.h | 1 + panda/src/express/streamReader.cxx | 21 +++++++++++++++++++++ panda/src/express/streamReader.h | 1 + panda/src/express/streamWriter.I | 15 +++++++++++++++ panda/src/express/streamWriter.h | 1 + 8 files changed, 77 insertions(+) diff --git a/panda/src/express/datagram.I b/panda/src/express/datagram.I index 575ef1247e..f473bcd844 100644 --- a/panda/src/express/datagram.I +++ b/panda/src/express/datagram.I @@ -311,6 +311,21 @@ add_string(const string &str) { append_data(str); } +//////////////////////////////////////////////////////////////////// +// Function: Datagram::add_string32 +// Access: Public +// Description: Adds a variable-length string to the datagram, using +// a 32-bit length field to allow very long strings. +//////////////////////////////////////////////////////////////////// +INLINE void Datagram:: +add_string32(const string &str) { + // Strings always are preceded by their length + add_uint32(str.length()); + + // Add the string + append_data(str); +} + //////////////////////////////////////////////////////////////////// // Function: Datagram::add_z_string // Access: Public diff --git a/panda/src/express/datagram.h b/panda/src/express/datagram.h index d5ae2b7848..31faa43adf 100644 --- a/panda/src/express/datagram.h +++ b/panda/src/express/datagram.h @@ -82,6 +82,7 @@ PUBLISHED: INLINE void add_be_float64(PN_float64 value); INLINE void add_string(const string &str); + INLINE void add_string32(const string &str); INLINE void add_z_string(string str); INLINE void add_fixed_string(const string &str, size_t size); diff --git a/panda/src/express/datagramIterator.cxx b/panda/src/express/datagramIterator.cxx index 65538532f4..c17ac057c5 100644 --- a/panda/src/express/datagramIterator.cxx +++ b/panda/src/express/datagramIterator.cxx @@ -41,6 +41,28 @@ get_string() { return string(ptr + last_index, s_len); } +//////////////////////////////////////////////////////////////////// +// Function: DatagramIterator::get_string32 +// Access: Public +// Description: Extracts a variable-length string with a 32-bit +// length field. +//////////////////////////////////////////////////////////////////// +string DatagramIterator:: +get_string32() { + // First, get the length of the string + PN_uint32 s_len = get_uint32(); + + nassertr(_datagram != (const Datagram *)NULL && + _current_index + s_len <= _datagram->get_length(), ""); + + const char *ptr = (const char *)_datagram->get_data(); + int last_index = _current_index; + + _current_index += s_len; + + return string(ptr + last_index, s_len); +} + //////////////////////////////////////////////////////////////////// // Function: DatagramIterator::get_z_string // Access: Public diff --git a/panda/src/express/datagramIterator.h b/panda/src/express/datagramIterator.h index eaab323b23..37b0d6d84c 100644 --- a/panda/src/express/datagramIterator.h +++ b/panda/src/express/datagramIterator.h @@ -62,6 +62,7 @@ PUBLISHED: INLINE PN_float64 get_be_float64(); string get_string(); + string get_string32(); string get_z_string(); string get_fixed_string(size_t size); diff --git a/panda/src/express/streamReader.cxx b/panda/src/express/streamReader.cxx index 8d82d6b74f..a1f0498a65 100644 --- a/panda/src/express/streamReader.cxx +++ b/panda/src/express/streamReader.cxx @@ -39,6 +39,27 @@ get_string() { return result; } +//////////////////////////////////////////////////////////////////// +// Function: StreamReader::get_string32 +// Access: Published +// Description: Extracts a variable-length string with a 32-bit +// length field. +//////////////////////////////////////////////////////////////////// +string StreamReader:: +get_string32() { + nassertr(!_in->eof() && !_in->fail(), string()); + + // First, get the length of the string + size_t s_len = get_uint32(); + + string result; + result.reserve(s_len); + for (size_t p = 0; !_in->eof() && !_in->fail() && p < s_len; p++) { + result += _in->get(); + } + return result; +} + //////////////////////////////////////////////////////////////////// // Function: StreamReader::get_z_string // Access: Published diff --git a/panda/src/express/streamReader.h b/panda/src/express/streamReader.h index f02d3aa4da..6423f6231d 100644 --- a/panda/src/express/streamReader.h +++ b/panda/src/express/streamReader.h @@ -65,6 +65,7 @@ PUBLISHED: INLINE PN_float64 get_be_float64(); string get_string(); + string get_string32(); string get_z_string(); string get_fixed_string(size_t size); diff --git a/panda/src/express/streamWriter.I b/panda/src/express/streamWriter.I index 975010d832..60ee3df44a 100644 --- a/panda/src/express/streamWriter.I +++ b/panda/src/express/streamWriter.I @@ -324,6 +324,21 @@ add_string(const string &str) { append_data(str); } +//////////////////////////////////////////////////////////////////// +// Function: StreamWriter::add_string32 +// Access: Public +// Description: Adds a variable-length string to the stream, using a +// 32-bit length field. +//////////////////////////////////////////////////////////////////// +INLINE void StreamWriter:: +add_string32(const string &str) { + // Strings always are preceded by their length + add_uint32(str.length()); + + // Add the string + append_data(str); +} + //////////////////////////////////////////////////////////////////// // Function: StreamWriter::add_z_string // Access: Public diff --git a/panda/src/express/streamWriter.h b/panda/src/express/streamWriter.h index 1584a0ab33..edee0a549b 100644 --- a/panda/src/express/streamWriter.h +++ b/panda/src/express/streamWriter.h @@ -70,6 +70,7 @@ PUBLISHED: INLINE void add_be_float64(PN_float64 value); INLINE void add_string(const string &str); + INLINE void add_string32(const string &str); INLINE void add_z_string(string str); INLINE void add_fixed_string(const string &str, size_t size);