From 63d012bfab75840b789e144177ca73847ea989e7 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Fri, 28 Dec 2018 18:28:26 +0100
Subject: Enabled the comment creation from Python.

---
 plugins/pychrysalide/analysis/db/Makefile.am     |   4 +-
 plugins/pychrysalide/analysis/db/items/comment.c | 116 ++++++++++++++---------
 tests/analysis/db/items/__init__.py              |   0
 tests/analysis/db/items/comment.py               |  30 ++++++
 4 files changed, 104 insertions(+), 46 deletions(-)
 create mode 100644 tests/analysis/db/items/__init__.py
 create mode 100644 tests/analysis/db/items/comment.py

diff --git a/plugins/pychrysalide/analysis/db/Makefile.am b/plugins/pychrysalide/analysis/db/Makefile.am
index 940deca..709f153 100644
--- a/plugins/pychrysalide/analysis/db/Makefile.am
+++ b/plugins/pychrysalide/analysis/db/Makefile.am
@@ -7,9 +7,11 @@ libpychrysaanalysisdb_la_SOURCES =		\
 	item.h item.c						\
 	module.h module.c
 
-libpychrysaanalysisdb_la_LDFLAGS = 		\
+libpychrysaanalysisdb_la_LIBADD = 		\
 	items/libpychrysaanalysisdbitems.la
 
+libpychrysaanalysisdb_la_LDFLAGS = 
+
 
 devdir = $(includedir)/chrysalide-$(subdir)
 
diff --git a/plugins/pychrysalide/analysis/db/items/comment.c b/plugins/pychrysalide/analysis/db/items/comment.c
index 3a12019..6d05403 100644
--- a/plugins/pychrysalide/analysis/db/items/comment.c
+++ b/plugins/pychrysalide/analysis/db/items/comment.c
@@ -43,12 +43,12 @@
 /* Crée un nouvel objet Python de type 'DbComment'. */
 static PyObject *py_db_comment_new(PyTypeObject *, PyObject *, PyObject *);
 
+/* Associe un contenu statique supplémentaire à un commentaire. */
+static PyObject *py_db_comment_add_text(PyObject *, PyObject *);
+
 /* Fournit le commentaire associé à un commentaire. */
 static PyObject *py_db_comment_get_text(PyObject *, void *);
 
-/* Définit le commentaire associé à un commentaire. */
-static int py_db_comment_set_text(PyObject *, PyObject *, void *);
-
 
 
 /******************************************************************************
@@ -68,24 +68,46 @@ static int py_db_comment_set_text(PyObject *, PyObject *, void *);
 static PyObject *py_db_comment_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
     PyObject *result;                       /* Instance à retourner        */
-    PyObject *py_vmpa;                      /* Localisation version Python */
-    const char *text;                       /* Texte à associer            */
-    int is_volatile;                        /* Conservation en mémoire     */
+    int repeatable;                         /* Note une répétition demandée*/
+    const char *text;                       /* Eventuel premier commentaire*/
+    int before;                             /* Indication sur l'emplacement*/
+    vmpa2t addr;                            /* Emplacement ciblé           */
+    unsigned long flags;                    /* Identifiants de ligne visée */
     int ret;                                /* Bilan de lecture des args.  */
-    vmpa2t *addr;                           /* Localisation version C      */
     GDbComment *comment;                    /* Version GLib du commentaire */
 
-    ret = PyArg_ParseTuple(args, "Osp", &py_vmpa, &text, &is_volatile);
-    if (!ret) Py_RETURN_NONE;
+    static char *kwlist[] = { "addr", "flags", "repeatable", "text", "before", NULL };
+
+    /* Récupération des paramètres */
+
+    repeatable = -1;
+    text = NULL;
+    before = -1;
 
-    ret = PyObject_IsInstance(py_vmpa, (PyObject *)get_python_vmpa_type());
+    ret = PyArg_ParseTupleAndKeywords(args, kwds, "O&k|$psp", kwlist,
+                                      convert_any_to_vmpa, &addr, &flags, &repeatable, &text, &before);
     if (!ret) return NULL;
 
-    addr = get_internal_vmpa(py_vmpa);
-    if (py_vmpa == NULL) Py_RETURN_NONE;
+    /* Vérifications diverses */
+
+    if (flags > BLF_ALL)
+    {
+        PyErr_SetString(PyExc_ValueError, _("Invalid flag combination"));
+        return NULL;
+    }
+
+    if ((repeatable == -1 && before == -1) || (repeatable != -1 && before != -1))
+    {
+        PyErr_SetString(PyExc_ValueError, _("repeatable or before has to be defined"));
+        return NULL;
+    }
 
-    return NULL;/* FIXME */
-    //comment = g_db_comment_new(addr, text, is_volatile);
+    /* Construction */
+
+    if (repeatable)
+        comment = g_db_comment_new_inlined(&addr, flags, repeatable);
+    else
+        comment = g_db_comment_new_area(&addr, flags, text, before);
 
     result = pygobject_new(G_OBJECT(comment));
     g_object_unref(comment);
@@ -97,38 +119,31 @@ static PyObject *py_db_comment_new(PyTypeObject *type, PyObject *args, PyObject
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : self    = objet Python concerné par l'appel.                 *
-*                closure = non utilisé ici.                                   *
+*  Paramètres  : self = classe représentant un commentaire.                   *
+*                args = arguments fournis à l'appel.                          *
 *                                                                             *
-*  Description : Fournit le commentaire associé à un commentaire.             *
+*  Description : Associe un contenu statique supplémentaire à un commentaire. *
 *                                                                             *
-*  Retour      : Texte manipulable en Python.                                 *
+*  Retour      : None.                                                        *
 *                                                                             *
 *  Remarques   : -                                                            *
 *                                                                             *
 ******************************************************************************/
 
-static PyObject *py_db_comment_get_text(PyObject *self, void *closure)
+static PyObject *py_db_comment_add_text(PyObject *self, PyObject *args)
 {
-    PyObject *result;                       /* Résultat à retourner        */
+    const char *text;                       /* Commentaire complémentaire  */
+    int ret;                                /* Bilan de lecture des args.  */
     GDbComment *comment;                    /* Commentaire à consulter     */
-    char *text;                             /* Contenu textuel associé     */
+
+    ret = PyArg_ParseTuple(args, "s", &text);
+    if (!ret) return NULL;
 
     comment = G_DB_COMMENT(pygobject_get(self));
-    text = g_db_comment_get_text(comment);
 
-    if (text == NULL)
-    {
-        result = Py_None;
-        Py_INCREF(result);
-    }
-    else
-    {
-        result = PyUnicode_FromString(text);
-        free(text);
-    }
+    g_db_comment_add_static_text(comment, text);
 
-    return result;
+    Py_RETURN_NONE;
 
 }
 
@@ -136,31 +151,37 @@ static PyObject *py_db_comment_get_text(PyObject *self, void *closure)
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : self    = objet Python concerné par l'appel.                 *
-*                value   = valeur fournie à intégrer ou prendre en compte.    *
 *                closure = non utilisé ici.                                   *
 *                                                                             *
-*  Description : Définit le commentaire associé à un commentaire.             *
+*  Description : Fournit le commentaire associé à un commentaire.             *
 *                                                                             *
-*  Retour      : Bilan de l'opération pour Python.                            *
+*  Retour      : Texte manipulable en Python.                                 *
 *                                                                             *
 *  Remarques   : -                                                            *
 *                                                                             *
 ******************************************************************************/
 
-static int py_db_comment_set_text(PyObject *self, PyObject *value, void *closure)
+static PyObject *py_db_comment_get_text(PyObject *self, void *closure)
 {
+    PyObject *result;                       /* Résultat à retourner        */
     GDbComment *comment;                    /* Commentaire à consulter     */
+    char *text;                             /* Contenu textuel associé     */
+
+    comment = G_DB_COMMENT(pygobject_get(self));
+    text = g_db_comment_get_text(comment);
 
-    if (!PyUnicode_Check(value))
+    if (text == NULL)
     {
-        PyErr_SetString(PyExc_TypeError, _("The attribute value must be a string."));
-        return -1;
+        result = Py_None;
+        Py_INCREF(result);
+    }
+    else
+    {
+        result = PyUnicode_FromString(text);
+        free(text);
     }
 
-    comment = G_DB_COMMENT(pygobject_get(self));
-    //g_db_comment_set_text(comment, PyUnicode_DATA(value));
-
-    return 0;
+    return result;
 
 }
 
@@ -180,12 +201,17 @@ static int py_db_comment_set_text(PyObject *self, PyObject *value, void *closure
 PyTypeObject *get_python_db_comment_type(void)
 {
     static PyMethodDef py_db_comment_methods[] = {
+        {
+            "add_text", py_db_comment_add_text,
+            METH_VARARGS,
+            "add_text($self, text, /)\n--\n\nAppend extra text to a given comment."
+        },
         { NULL }
     };
 
     static PyGetSetDef py_db_comment_getseters[] = {
         {
-            "text", py_db_comment_get_text, py_db_comment_set_text,
+            "text", py_db_comment_get_text, NULL,
             "Give access to the content of a given comment.", NULL
         },
         { NULL }
diff --git a/tests/analysis/db/items/__init__.py b/tests/analysis/db/items/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/analysis/db/items/comment.py b/tests/analysis/db/items/comment.py
new file mode 100644
index 0000000..531756c
--- /dev/null
+++ b/tests/analysis/db/items/comment.py
@@ -0,0 +1,30 @@
+#!/usr/bin/python3-dbg
+# -*- coding: utf-8 -*-
+
+
+# Tests validant la manipulation des commentaires
+
+
+from chrysacase import ChrysalideTestCase
+from pychrysalide.analysis.db.items import DbComment
+from pychrysalide.glibext import BufferLine
+
+
+class TestDbComment(ChrysalideTestCase):
+    """TestCase for analysis.db.items.DbComment."""
+
+
+    def testCreation(self):
+        """Ensure comments are buildable from Python."""
+
+        c0 = DbComment(0, BufferLine.BLF_HAS_CODE, repeatable=True)
+
+        self.assertIsNotNone(c0)
+
+        with self.assertRaises(TypeError):
+
+            c1 = DbComment(0, BufferLine.BLF_HAS_CODE, text=None, before=False)
+
+        c2 = DbComment(0, BufferLine.BLF_HAS_CODE, text='None', before=False)
+
+        self.assertIsNotNone(c2)
-- 
cgit v0.11.2-87-g4458