From d36b8a3939443512c3afb840b4a81026a57582e7 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Wed, 18 Apr 2018 20:58:21 +0200
Subject: Introduced projects into the Python bindings.

---
 plugins/pychrysalide/analysis/Makefile.am |   1 +
 plugins/pychrysalide/analysis/module.c    |   2 +
 plugins/pychrysalide/analysis/project.c   | 154 ++++++++++++++++++++++++++++++
 plugins/pychrysalide/analysis/project.h   |  42 ++++++++
 4 files changed, 199 insertions(+)
 create mode 100644 plugins/pychrysalide/analysis/project.c
 create mode 100644 plugins/pychrysalide/analysis/project.h

diff --git a/plugins/pychrysalide/analysis/Makefile.am b/plugins/pychrysalide/analysis/Makefile.am
index 59207ad..5c3c46c 100644
--- a/plugins/pychrysalide/analysis/Makefile.am
+++ b/plugins/pychrysalide/analysis/Makefile.am
@@ -7,6 +7,7 @@ libpychrysaanalysis_la_SOURCES =		\
 	content.h content.c					\
 	loaded.h loaded.c					\
 	module.h module.c					\
+	project.h project.c					\
 	routine.h routine.c					\
 	type.h type.c
 
diff --git a/plugins/pychrysalide/analysis/module.c b/plugins/pychrysalide/analysis/module.c
index 309083c..a77121b 100644
--- a/plugins/pychrysalide/analysis/module.c
+++ b/plugins/pychrysalide/analysis/module.c
@@ -32,6 +32,7 @@
 #include "block.h"
 #include "content.h"
 #include "loaded.h"
+#include "project.h"
 #include "routine.h"
 #include "type.h"
 #include "contents/module.h"
@@ -93,6 +94,7 @@ bool add_analysis_module_to_python_module(PyObject *super)
     result &= register_python_instr_block(module);
     result &= register_python_binary_routine(module);
     result &= register_python_data_type(module);
+    result &= register_python_study_project(module);
 
     result &= add_analysis_contents_module_to_python_module(module);
     result &= add_analysis_db_module_to_python_module(module);
diff --git a/plugins/pychrysalide/analysis/project.c b/plugins/pychrysalide/analysis/project.c
new file mode 100644
index 0000000..cd7578d
--- /dev/null
+++ b/plugins/pychrysalide/analysis/project.c
@@ -0,0 +1,154 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * project.c - équivalent Python du fichier "analysis/project.c"
+ *
+ * Copyright (C) 2018 Cyrille Bagard
+ *
+ *  This file is part of Chrysalide.
+ *
+ *  Chrysalide is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  Chrysalide is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+#include "project.h"
+
+
+#include <assert.h>
+#include <pygobject.h>
+
+
+#include <analysis/project.h>
+
+
+#include "../helpers.h"
+
+
+
+/* Procède à l'enregistrement d'un projet donné. */
+static PyObject *py_study_project_save(PyObject *, PyObject *);
+
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : self = contenu binaire à manipuler.                          *
+*                args = arguments accompagnant l'appel.                       *
+*                                                                             *
+*  Description : Procède à l'enregistrement d'un projet donné.                *
+*                                                                             *
+*  Retour      : Py_True si l'enregistrement s'est déroule sans encombre.     *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static PyObject *py_study_project_save(PyObject *self, PyObject *args)
+{
+    PyObject *result;                       /* Instance à retourner        */
+    GStudyProject *project;                 /* Version GLib du format      */
+    const char *filename;                   /* Destination de la sauvegarde*/
+    int ret;                                /* Bilan de lecture des args.  */
+    bool status;                            /* Bilan de l'opération        */
+
+    project = G_STUDY_PROJECT(pygobject_get(self));
+    assert(project != NULL);
+
+    ret = PyArg_ParseTuple(args, "s", &filename);
+    if (!ret) return NULL;
+
+    status = g_study_project_save(project, filename);
+
+    result = status ? Py_True : Py_False;
+    Py_INCREF(result);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : -                                                            *
+*                                                                             *
+*  Description : Fournit un accès à une définition de type à diffuser.        *
+*                                                                             *
+*  Retour      : Définition d'objet pour Python.                              *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+PyTypeObject *get_python_study_project_type(void)
+{
+    static PyMethodDef py_study_project_methods[] = {
+        {
+            "save", py_study_project_save,
+            METH_VARARGS,
+            "save($self, filename, /)\n--\n\nSave the project into a given file."
+        },
+        { NULL }
+    };
+
+    static PyGetSetDef py_study_project_getseters[] = {
+        { NULL }
+    };
+
+    static PyTypeObject py_study_project_type = {
+
+        PyVarObject_HEAD_INIT(NULL, 0)
+
+        .tp_name        = "pychrysalide.analysis.StudyProject",
+
+        .tp_flags       = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+
+        .tp_doc         = "PyChrysalide study project",
+
+        .tp_methods     = py_study_project_methods,
+        .tp_getset      = py_study_project_getseters
+
+    };
+
+    return &py_study_project_type;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : module = module dont la définition est à compléter.          *
+*                                                                             *
+*  Description : Prend en charge l'objet 'pychrysalide.analysis.StudyProject'.*
+*                                                                             *
+*  Retour      : Bilan de l'opération.                                        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool register_python_study_project(PyObject *module)
+{
+    PyTypeObject *py_study_project_type;    /* Type Python 'StudyProject'  */
+    PyObject *dict;                         /* Dictionnaire du module      */
+
+    py_study_project_type = get_python_study_project_type();
+
+    dict = PyModule_GetDict(module);
+
+    if (!register_class_for_pygobject(dict, G_TYPE_STUDY_PROJECT, py_study_project_type, &PyGObject_Type))
+        return false;
+
+    return true;
+
+}
diff --git a/plugins/pychrysalide/analysis/project.h b/plugins/pychrysalide/analysis/project.h
new file mode 100644
index 0000000..7909604
--- /dev/null
+++ b/plugins/pychrysalide/analysis/project.h
@@ -0,0 +1,42 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * project.h - prototypes pour l'équivalent Python du fichier "analysis/project.h"
+ *
+ * Copyright (C) 2018 Cyrille Bagard
+ *
+ *  This file is part of Chrysalide.
+ *
+ *  Chrysalide is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  Chrysalide is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+#ifndef _PLUGINS_PYCHRYSALIDE_ANALYSIS_PROJECT_H
+#define _PLUGINS_PYCHRYSALIDE_ANALYSIS_PROJECT_H
+
+
+#include <Python.h>
+#include <stdbool.h>
+
+
+
+/* Fournit un accès à une définition de type à diffuser. */
+PyTypeObject *get_python_study_project_type(void);
+
+/* Prend en charge l'objet 'pychrysalide.analysis.StudyProject'. */
+bool register_python_study_project(PyObject *);
+
+
+
+#endif  /* _PLUGINS_PYCHRYSALIDE_ANALYSIS_PROJECT_H */
-- 
cgit v0.11.2-87-g4458