-static int convert_pyobj(struct srd_decoder_instance *di, PyObject *obj,
- int *annotation_format, char ***annotation)
-{
- PyObject *py_tmp;
- struct srd_pd_output *pdo;
- int ann_id;
-
- /* 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->annotation, ann_id))) {
- srd_err("Protocol decoder %s submitted data to non-existent annotation format %d",
- di->decoder->name, ann_id);
- return SRD_ERR_PYTHON;
- }
- *annotation_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, annotation) != 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;
-}
-
-/* TODO: not used, doesn't work actually */
-static PyObject *Decoder_init(PyObject *self, PyObject *args)
-{
- (void)self;
- (void)args;
- printf("init Decoder object %p\n", self);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *Decoder_put(PyObject *self, PyObject *args)
-{
- GSList *l;
- PyObject *data;
- struct srd_decoder_instance *di;
- struct srd_pd_output *pdo;
- uint64_t timeoffset, duration;
- int output_id, annotation_format, i;
- char **annotation, **ann_info;
-
- if (!(di = get_di_by_decobject(self)))
- return NULL;
-
- if (!PyArg_ParseTuple(args, "KKiO", &timeoffset, &duration, &output_id, &data))
- return NULL;
-
- if (!(l = g_slist_nth(di->pd_output, output_id))) {
- srd_err("Protocol decoder %s submitted invalid output ID %d",
- di->decoder->name, output_id);
- return NULL;
- }
- pdo = l->data;
-
- switch (pdo->output_type) {
- case SRD_OUTPUT_ANNOTATION:
- if (convert_pyobj(di, data, &annotation_format, &annotation) != SRD_OK)
- return NULL;
-
- /* TODO: SRD_OUTPUT_ANNOTATION should go back up to the caller */
- ann_info = g_slist_nth_data(pdo->decoder->annotation, annotation_format);
- printf("annotation format %d (%s): ", annotation_format, ann_info[0]);
- for (i = 0; annotation[i]; i++)
- printf("\"%s\" ", annotation[i]);
- printf("\n");
- break;
-
- case SRD_OUTPUT_PROTOCOL:
-
- /* TODO: SRD_OUTPUT_PROTOCOL should go up the PD stack. */
- printf("%s protocol data: ", pdo->protocol_id);
- PyObject_Print(data, stdout, Py_PRINT_RAW);
- puts("");
- break;