]> git.ipfire.org Git - people/ms/libloc.git/blobdiff - src/python/writer.c
python: Do not use any GNU-style initialisers for structs
[people/ms/libloc.git] / src / python / writer.c
index 03722d653fc7f6882ee697a8006e2717b9f77d6d..9e980035f93fdfeeaa9cb77310bc1e31af292f6f 100644 (file)
@@ -20,6 +20,8 @@
 #include <loc/writer.h>
 
 #include "locationmodule.h"
+#include "as.h"
+#include "network.h"
 #include "writer.h"
 
 static PyObject* Writer_new(PyTypeObject* type, PyObject* args, PyObject* kwds) {
@@ -50,11 +52,8 @@ static PyObject* Writer_get_vendor(WriterObject* self) {
        return PyUnicode_FromString(vendor);
 }
 
-static int Writer_set_vendor(WriterObject* self, PyObject* args) {
-       const char* vendor = NULL;
-
-       if (!PyArg_ParseTuple(args, "s", &vendor))
-               return -1;
+static int Writer_set_vendor(WriterObject* self, PyObject* value) {
+       const char* vendor = PyUnicode_AsUTF8(value);
 
        int r = loc_writer_set_vendor(self->writer, vendor);
        if (r) {
@@ -65,6 +64,89 @@ static int Writer_set_vendor(WriterObject* self, PyObject* args) {
        return 0;
 }
 
+static PyObject* Writer_get_description(WriterObject* self) {
+       const char* description = loc_writer_get_description(self->writer);
+
+       return PyUnicode_FromString(description);
+}
+
+static int Writer_set_description(WriterObject* self, PyObject* value) {
+       const char* description = PyUnicode_AsUTF8(value);
+
+       int r = loc_writer_set_description(self->writer, description);
+       if (r) {
+               PyErr_Format(PyExc_ValueError, "Could not set description: %s", description);
+               return r;
+       }
+
+       return 0;
+}
+
+static PyObject* Writer_get_license(WriterObject* self) {
+       const char* license = loc_writer_get_license(self->writer);
+
+       return PyUnicode_FromString(license);
+}
+
+static int Writer_set_license(WriterObject* self, PyObject* value) {
+       const char* license = PyUnicode_AsUTF8(value);
+
+       int r = loc_writer_set_license(self->writer, license);
+       if (r) {
+               PyErr_Format(PyExc_ValueError, "Could not set license: %s", license);
+               return r;
+       }
+
+       return 0;
+}
+
+static PyObject* Writer_add_as(WriterObject* self, PyObject* args) {
+       struct loc_as* as;
+       uint32_t number = 0;
+
+       if (!PyArg_ParseTuple(args, "i", &number))
+               return NULL;
+
+       // Create AS object
+       int r = loc_writer_add_as(self->writer, &as, number);
+       if (r)
+               return NULL;
+
+       PyObject* obj = new_as(&ASType, as);
+       loc_as_unref(as);
+
+       return obj;
+}
+
+static PyObject* Writer_add_network(WriterObject* self, PyObject* args) {
+       struct loc_network* network;
+       const char* string = NULL;
+
+       if (!PyArg_ParseTuple(args, "s", &string))
+               return NULL;
+
+       // Create network object
+       int r = loc_writer_add_network(self->writer, &network, string);
+       if (r) {
+               switch (r) {
+                       case -EINVAL:
+                               PyErr_SetString(PyExc_ValueError, "Invalid network");
+                               break;
+
+                       case -EBUSY:
+                               PyErr_SetString(PyExc_IndexError, "A network already exists here");
+                               break;
+               }
+
+               return NULL;
+       }
+
+       PyObject* obj = new_network(&NetworkType, network);
+       loc_network_unref(network);
+
+       return obj;
+}
+
 static PyObject* Writer_write(WriterObject* self, PyObject* args) {
        const char* path = NULL;
 
@@ -90,6 +172,18 @@ static PyObject* Writer_write(WriterObject* self, PyObject* args) {
 }
 
 static struct PyMethodDef Writer_methods[] = {
+       {
+               "add_as",
+               (PyCFunction)Writer_add_as,
+               METH_VARARGS,
+               NULL,
+       },
+       {
+               "add_network",
+               (PyCFunction)Writer_add_network,
+               METH_VARARGS,
+               NULL,
+       },
        {
                "write",
                (PyCFunction)Writer_write,
@@ -100,6 +194,20 @@ static struct PyMethodDef Writer_methods[] = {
 };
 
 static struct PyGetSetDef Writer_getsetters[] = {
+       {
+               "description",
+               (getter)Writer_get_description,
+               (setter)Writer_set_description,
+               NULL,
+               NULL,
+       },
+       {
+               "license",
+               (getter)Writer_get_license,
+               (setter)Writer_set_license,
+               NULL,
+               NULL,
+       },
        {
                "vendor",
                (getter)Writer_get_vendor,
@@ -112,13 +220,13 @@ static struct PyGetSetDef Writer_getsetters[] = {
 
 PyTypeObject WriterType = {
        PyVarObject_HEAD_INIT(NULL, 0)
-       tp_name:                "location.Writer",
-       tp_basicsize:           sizeof(WriterObject),
-       tp_flags:               Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-       tp_new:                 Writer_new,
-       tp_dealloc:             (destructor)Writer_dealloc,
-       tp_init:                (initproc)Writer_init,
-       tp_doc:                 "Writer object",
-       tp_methods:             Writer_methods,
-       tp_getset:              Writer_getsetters,
+       .tp_name =               "location.Writer",
+       .tp_basicsize =          sizeof(WriterObject),
+       .tp_flags =              Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
+       .tp_new =                Writer_new,
+       .tp_dealloc =            (destructor)Writer_dealloc,
+       .tp_init =               (initproc)Writer_init,
+       .tp_doc =                "Writer object",
+       .tp_methods =            Writer_methods,
+       .tp_getset =             Writer_getsetters,
 };