From 215d97d75ff9e49afde14c5f27e8c62eda71e443 Mon Sep 17 00:00:00 2001 From: David Rose Date: Tue, 24 Aug 2004 00:19:02 +0000 Subject: [PATCH] add pack_required_field(datagram, ...) --- direct/src/dcparser/dcClass.cxx | 28 ++++++++++++++++++++++++++++ direct/src/dcparser/dcClass.h | 2 ++ direct/src/dcparser/dcField.cxx | 3 +-- direct/src/dcparser/dcPacker.cxx | 4 ++-- 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/direct/src/dcparser/dcClass.cxx b/direct/src/dcparser/dcClass.cxx index 2fdfe485f4..fa4706a222 100644 --- a/direct/src/dcparser/dcClass.cxx +++ b/direct/src/dcparser/dcClass.cxx @@ -459,6 +459,34 @@ direct_update(PyObject *distobj, const string &field_name, } #endif // HAVE_PYTHON +//////////////////////////////////////////////////////////////////// +// Function: DCClass::pack_required_field +// Access: Published +// Description: Looks up the current value of the indicated field by +// calling the appropriate get*() function, then packs +// that value into the datagram. This field is +// presumably either a required field or a specified +// optional field, and we are building up a datagram for +// the generate-with-required message. +// +// Returns true on success, false on failure. +//////////////////////////////////////////////////////////////////// +bool DCClass:: +pack_required_field(Datagram &datagram, PyObject *distobj, + const DCField *field) const { + DCPacker packer; + packer.begin_pack(field); + if (!pack_required_field(packer, distobj, field)) { + return false; + } + if (!packer.end_pack()) { + return false; + } + + datagram.append_data(packer.get_data(), packer.get_length()); + return true; +} + #ifdef HAVE_PYTHON //////////////////////////////////////////////////////////////////// // Function: DCClass::pack_required_field diff --git a/direct/src/dcparser/dcClass.h b/direct/src/dcparser/dcClass.h index 378a2929af..fcef1870e7 100644 --- a/direct/src/dcparser/dcClass.h +++ b/direct/src/dcparser/dcClass.h @@ -74,6 +74,8 @@ PUBLISHED: const string &value_blob); void direct_update(PyObject *distobj, const string &field_name, const Datagram &datagram); + bool pack_required_field(Datagram &datagram, PyObject *distobj, + const DCField *field) const; bool pack_required_field(DCPacker &packer, PyObject *distobj, const DCField *field) const; diff --git a/direct/src/dcparser/dcField.cxx b/direct/src/dcparser/dcField.cxx index 8117a7210d..40246341ca 100644 --- a/direct/src/dcparser/dcField.cxx +++ b/direct/src/dcparser/dcField.cxx @@ -482,9 +482,8 @@ receive_update(DCPacker &packer, PyObject *distobj) const { PyObject *result = PyObject_CallObject(func, args); Py_XDECREF(result); Py_DECREF(func); + Py_DECREF(args); } - - Py_DECREF(args); } } #endif // HAVE_PYTHON diff --git a/direct/src/dcparser/dcPacker.cxx b/direct/src/dcparser/dcPacker.cxx index 1281242115..c7168661d2 100755 --- a/direct/src/dcparser/dcPacker.cxx +++ b/direct/src/dcparser/dcPacker.cxx @@ -1033,7 +1033,7 @@ enquote_string(ostream &out, char quote_mark, const string &str) { } else if (!isprint(*pi)) { char buffer[10]; - sprintf(buffer, "%02x", (unsigned int)(*pi)); + sprintf(buffer, "%02x", (unsigned char)(*pi)); out << "\\x" << buffer; } else { @@ -1055,7 +1055,7 @@ output_hex_string(ostream &out, const string &str) { pi != str.end(); ++pi) { char buffer[10]; - sprintf(buffer, "%02x", (unsigned int)(*pi)); + sprintf(buffer, "%02x", (unsigned char)(*pi)); out << buffer; } out << '>';