summaryrefslogtreecommitdiff
path: root/qpid/extras/dispatch/src/python_embedded.c
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/extras/dispatch/src/python_embedded.c')
-rw-r--r--qpid/extras/dispatch/src/python_embedded.c193
1 files changed, 193 insertions, 0 deletions
diff --git a/qpid/extras/dispatch/src/python_embedded.c b/qpid/extras/dispatch/src/python_embedded.c
index 17c97ae10e..b88830f6c6 100644
--- a/qpid/extras/dispatch/src/python_embedded.c
+++ b/qpid/extras/dispatch/src/python_embedded.c
@@ -20,11 +20,53 @@
#include "python_embedded.h"
#include <qpid/dispatch/threading.h>
#include <qpid/dispatch/log.h>
+#include <qpid/dispatch/amqp.h>
static uint32_t ref_count = 0;
static sys_mutex_t *lock = 0;
static char *log_module = "PYTHON";
+
+static PyObject *parsed_to_py_string(dx_parsed_field_t *field)
+{
+ switch (dx_parse_tag(field)) {
+ case DX_AMQP_VBIN8:
+ case DX_AMQP_VBIN32:
+ case DX_AMQP_STR8_UTF8:
+ case DX_AMQP_STR32_UTF8:
+ case DX_AMQP_SYM8:
+ case DX_AMQP_SYM32:
+ break;
+ default:
+ return Py_None;
+ }
+
+#define SHORT_BUF 1024
+ uint8_t short_buf[SHORT_BUF];
+ PyObject *result;
+ dx_field_iterator_t *raw = dx_parse_raw(field);
+ dx_field_iterator_reset(raw);
+ uint32_t length = dx_field_iterator_remaining(raw);
+ uint8_t *buffer = short_buf;
+ uint8_t *ptr;
+ int alloc = 0;
+
+ if (length > SHORT_BUF) {
+ alloc = 1;
+ buffer = (uint8_t*) malloc(length);
+ }
+
+ ptr = buffer;
+ while (!dx_field_iterator_end(raw))
+ *(ptr++) = dx_field_iterator_octet(raw);
+ result = PyString_FromStringAndSize((char*) buffer, ptr - buffer);
+ if (alloc)
+ free(buffer);
+
+ return result;
+}
+
+
void dx_python_initialize()
{
lock = sys_mutex();
@@ -62,3 +104,154 @@ void dx_python_stop()
}
+void dx_py_to_composed(PyObject *value, dx_composed_field_t *field)
+{
+ if (PyBool_Check(value))
+ dx_compose_insert_bool(field, PyInt_AS_LONG(value) ? 1 : 0);
+
+ //else if (PyFloat_Check(value))
+ // dx_compose_insert_double(field, PyFloat_AS_DOUBLE(value));
+
+ else if (PyInt_Check(value))
+ dx_compose_insert_long(field, (int64_t) PyInt_AS_LONG(value));
+
+ else if (PyLong_Check(value))
+ dx_compose_insert_long(field, (int64_t) PyLong_AsLongLong(value));
+
+ else if (PyString_Check(value))
+ dx_compose_insert_string(field, PyString_AS_STRING(value));
+
+ else if (PyDict_Check(value)) {
+ Py_ssize_t iter = 0;
+ PyObject *key;
+ PyObject *val;
+ dx_compose_start_map(field);
+ while (PyDict_Next(value, &iter, &key, &val)) {
+ dx_py_to_composed(key, field);
+ dx_py_to_composed(val, field);
+ }
+ dx_compose_end_map(field);
+ }
+
+ else if (PyList_Check(value)) {
+ Py_ssize_t count = PyList_Size(value);
+ dx_compose_start_list(field);
+ for (Py_ssize_t idx = 0; idx < count; idx++) {
+ PyObject *item = PyList_GetItem(value, idx);
+ dx_py_to_composed(item, field);
+ }
+ dx_compose_end_list(field);
+ }
+
+ else if (PyTuple_Check(value)) {
+ Py_ssize_t count = PyTuple_Size(value);
+ dx_compose_start_list(field);
+ for (Py_ssize_t idx = 0; idx < count; idx++) {
+ PyObject *item = PyTuple_GetItem(value, idx);
+ dx_py_to_composed(item, field);
+ }
+ dx_compose_end_list(field);
+ }
+}
+
+
+PyObject *dx_field_to_py(dx_parsed_field_t *field)
+{
+ PyObject *result = Py_None;
+ uint8_t tag = dx_parse_tag(field);
+
+ switch (tag) {
+ case DX_AMQP_NULL:
+ result = Py_None;
+ break;
+
+ case DX_AMQP_BOOLEAN:
+ case DX_AMQP_TRUE:
+ case DX_AMQP_FALSE:
+ result = dx_parse_as_uint(field) ? Py_True : Py_False;
+ break;
+
+ case DX_AMQP_UBYTE:
+ case DX_AMQP_USHORT:
+ case DX_AMQP_UINT:
+ case DX_AMQP_SMALLUINT:
+ case DX_AMQP_UINT0:
+ result = PyInt_FromLong((long) dx_parse_as_uint(field));
+ break;
+
+ case DX_AMQP_ULONG:
+ case DX_AMQP_SMALLULONG:
+ case DX_AMQP_ULONG0:
+ case DX_AMQP_TIMESTAMP:
+ result = PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) dx_parse_as_ulong(field));
+ break;
+
+ case DX_AMQP_BYTE:
+ case DX_AMQP_SHORT:
+ case DX_AMQP_INT:
+ case DX_AMQP_SMALLINT:
+ result = PyInt_FromLong((long) dx_parse_as_int(field));
+ break;
+
+ case DX_AMQP_LONG:
+ case DX_AMQP_SMALLLONG:
+ result = PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) dx_parse_as_long(field));
+ break;
+
+ case DX_AMQP_FLOAT:
+ case DX_AMQP_DOUBLE:
+ case DX_AMQP_DECIMAL32:
+ case DX_AMQP_DECIMAL64:
+ case DX_AMQP_DECIMAL128:
+ case DX_AMQP_UTF32:
+ case DX_AMQP_UUID:
+ break;
+
+ case DX_AMQP_VBIN8:
+ case DX_AMQP_VBIN32:
+ case DX_AMQP_STR8_UTF8:
+ case DX_AMQP_STR32_UTF8:
+ case DX_AMQP_SYM8:
+ case DX_AMQP_SYM32:
+ result = parsed_to_py_string(field);
+ break;
+
+ case DX_AMQP_LIST0:
+ case DX_AMQP_LIST8:
+ case DX_AMQP_LIST32: {
+ uint32_t count = dx_parse_sub_count(field);
+ result = PyList_New(count);
+ for (uint32_t idx = 0; idx < count; idx++) {
+ dx_parsed_field_t *sub = dx_parse_sub_value(field, idx);
+ PyObject *pysub = dx_field_to_py(sub);
+ if (pysub == 0)
+ return 0;
+ PyList_SetItem(result, idx, pysub);
+ }
+ break;
+ }
+ case DX_AMQP_MAP8:
+ case DX_AMQP_MAP32: {
+ uint32_t count = dx_parse_sub_count(field);
+ result = PyDict_New();
+ for (uint32_t idx = 0; idx < count; idx++) {
+ dx_parsed_field_t *key = dx_parse_sub_key(field, idx);
+ dx_parsed_field_t *val = dx_parse_sub_value(field, idx);
+ PyObject *pykey = parsed_to_py_string(key);
+ PyObject *pyval = dx_field_to_py(val);
+ if (pyval == 0)
+ return 0;
+ PyDict_SetItem(result, pykey, pyval);
+ Py_DECREF(pykey);
+ Py_DECREF(pyval);
+ }
+ break;
+ }
+ case DX_AMQP_ARRAY8:
+ case DX_AMQP_ARRAY32:
+ break;
+ }
+
+ return result;
+}
+