+ /* Should be a list of [annotation format, [string, ...]] */
+ if (!PyList_Check(obj) && !PyTuple_Check(obj)) {
+ srd_err("Protocol decoder %s submitted %s instead of list",
+ di->decoder->name, obj->ob_type->tp_name);
+ return SRD_ERR_PYTHON;
+ }
+
+ /* Should have 2 elements... */
+ if (PyList_Size(obj) != 2) {
+ srd_err("Protocol decoder %s submitted annotation list with %d elements instead of 2",
+ di->decoder->name, PyList_Size(obj));
+ return SRD_ERR_PYTHON;
+ }
+
+ /* First element should be an integer matching a previously
+ * registered annotation format. */
+ py_tmp = PyList_GetItem(obj, 0);
+ if (!PyLong_Check(py_tmp)) {
+ srd_err("Protocol decoder %s submitted annotation list, but first element was not an integer",
+ di->decoder->name);
+ return SRD_ERR_PYTHON;
+ }
+
+ ann_id = PyLong_AsLong(py_tmp);
+ if (!(pdo = g_slist_nth_data(di->decoder->annotations, ann_id))) {
+ srd_err("Protocol decoder %s submitted data to non-existent annotation format %d",
+ di->decoder->name, ann_id);
+ return SRD_ERR_PYTHON;
+ }
+ *ann_format = ann_id;
+
+ /* Second element must be a list */
+ py_tmp = PyList_GetItem(obj, 1);
+ if (!PyList_Check(py_tmp)) {
+ srd_err("Protocol decoder %s submitted annotation list, but second element was not a list",
+ di->decoder->name);
+ return SRD_ERR_PYTHON;
+ }
+ if (py_strlist_to_char(py_tmp, ann) != SRD_OK) {
+ srd_err("Protocol decoder %s submitted annotation list, but second element was malformed",
+ di->decoder->name);
+ return SRD_ERR_PYTHON;
+ }
+
+ return SRD_OK;