+ PyObject *py_str;
+ int ret;
+
+ if (!PyObject_HasAttrString((PyObject *)py_obj, attr)) {
+ srd_dbg("%s object has no attribute '%s'.",
+ Py_TYPE(py_obj)->tp_name, attr);
+ return SRD_ERR_PYTHON;
+ }
+
+ if (!(py_str = PyObject_GetAttrString((PyObject *)py_obj, attr))) {
+ srd_exception_catch("");
+ return SRD_ERR_PYTHON;
+ }
+
+ if (!PyUnicode_Check(py_str)) {
+ srd_dbg("%s attribute should be a string, but is a %s.",
+ attr, Py_TYPE(py_str)->tp_name);
+ Py_DecRef(py_str);
+ return SRD_ERR_PYTHON;
+ }
+
+ ret = py_str_as_str(py_str, outstr);
+ Py_DecRef(py_str);
+
+ return ret;
+}
+
+/**
+ * Get the value of a Python dictionary item, returned as a newly
+ * allocated char *.
+ *
+ * @param py_obj The dictionary to probe.
+ * @param key Key of the item to retrieve.
+ * @param outstr Pointer to char * storage to be filled in.
+ *
+ * @return SRD_OK upon success, a (negative) error code otherwise.
+ * The 'outstr' argument points to a malloc()ed string upon success.
+ */
+SRD_PRIV int py_dictitem_as_str(const PyObject *py_obj, const char *key,
+ char **outstr)
+{
+ PyObject *py_value;
+ int ret;
+
+ if (!PyDict_Check((PyObject *)py_obj)) {
+ srd_dbg("Object is a %s, not a dictionary.",
+ Py_TYPE((PyObject *)py_obj)->tp_name);
+ return SRD_ERR_PYTHON;
+ }
+
+ if (!(py_value = PyDict_GetItemString((PyObject *)py_obj, key))) {
+ srd_dbg("Dictionary has no attribute '%s'.", key);
+ return SRD_ERR_PYTHON;
+ }
+
+ if (!PyUnicode_Check(py_value)) {
+ srd_dbg("Dictionary value for %s should be a string, but is "
+ "a %s.", key, Py_TYPE(py_value)->tp_name);
+ return SRD_ERR_PYTHON;
+ }
+
+ ret = py_str_as_str(py_value, outstr);
+
+ return ret;
+}
+
+/**
+ * Get the value of a Python unicode string object, returned as a newly
+ * allocated char *.
+ *
+ * @param py_str The unicode string object.
+ * @param outstr ptr to char * storage to be filled in.
+ *
+ * @return SRD_OK upon success, a (negative) error code otherwise.
+ * The 'outstr' argument points to a malloc()ed string upon success.
+ */
+SRD_PRIV int py_str_as_str(const PyObject *py_str, char **outstr)
+{
+ PyObject *py_encstr;