--- _dbus_bindings/message.c.orig 2009-01-24 00:46:48.000000000 -0500 +++ _dbus_bindings/message.c 2009-01-24 11:57:16.000000000 -0500 @@ -26,6 +26,7 @@ #include "dbus_bindings-internal.h" #include "message-internal.h" +#include static PyTypeObject MessageType, SignalMessageType, ErrorMessageType; static PyTypeObject MethodReturnMessageType, MethodCallMessageType; @@ -733,6 +734,45 @@ Py_RETURN_NONE; } +PyDoc_STRVAR(Message_marshal__doc__, +"message.marshal() -> string\n" +"Returns a bytestring representing the message serialized for transmission.\n"); +static PyObject * +Message_marshal(Message *self, PyObject *args UNUSED) +{ + char *marshaled; + int len; + dbus_bool_t success; + if (!self->msg) return DBusPy_RaiseUnusableMessage(); + success = dbus_message_marshal(self->msg, &marshaled, &len); + if (!success) return PyErr_NoMemory(); + return Py_BuildValue("s#", marshaled, len); +} + +PyDoc_STRVAR(Message_demarshal__doc__, +"message.demarshal(marshaled_data: string) -> Message (or subclass) [static]\n" +"Return the Message represented by the marshaled_data.\n"); +static PyObject * +Message_demarshal(PyObject *unused UNUSED, PyObject *args) +{ + DBusMessage *msg; + DBusError err; + dbus_error_init(&err); + char *marshaled; + int len; /* For python 2.5+, len should probably be Py_ssize_t, not int*/ + + if (!PyArg_ParseTuple(args, "t#", &marshaled, &len)) return NULL; + + msg = dbus_message_demarshal(marshaled, len, &err); + if (!msg) { + PyErr_SetString(PyExc_RuntimeError, err.message); + dbus_error_free(&err); + return NULL; + } + dbus_error_free(&err); + return DBusPyMessage_ConsumeDBusMessage(msg); +} + static PyMethodDef Message_tp_methods[] = { {"copy", (PyCFunction)Message_copy, METH_NOARGS, Message_copy__doc__}, @@ -806,6 +846,12 @@ METH_VARARGS, Message_has_signature__doc__}, {"get_type", (PyCFunction)Message_get_type, METH_NOARGS, Message_get_type__doc__}, + + {"marshal", (PyCFunction)Message_marshal, + METH_NOARGS, Message_marshal__doc__}, + {"demarshal", (PyCFunction)Message_demarshal, + METH_VARARGS|METH_STATIC, Message_demarshal__doc__}, + {NULL, NULL, 0, NULL} };