From 513b9c9b30c8d71decced2491a91c720a52aa910 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Fri, 28 Dec 2012 01:18:24 +0000
Subject: Created Python objects for the GtkBlockView widgets and fixed some
 bugs.

git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@311 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
---
 ChangeLog                                   |  31 ++++++
 plugins/pychrysa/analysis/binaries/module.c |   2 +-
 plugins/pychrysa/analysis/module.c          |   2 +-
 plugins/pychrysa/arch/module.c              |   2 +-
 plugins/pychrysa/debug/module.c             |   2 +-
 plugins/pychrysa/format/dex/module.c        |   2 +-
 plugins/pychrysa/format/module.c            |   2 +-
 plugins/pychrysa/glibext/module.c           |   2 +-
 plugins/pychrysa/gtkext/Makefile.am         |   1 +
 plugins/pychrysa/gtkext/blockview.c         | 156 ++++++++++++++++++++++++++++
 plugins/pychrysa/gtkext/blockview.h         |  39 +++++++
 plugins/pychrysa/gtkext/module.c            |   4 +-
 plugins/pychrysa/gui/module.c               |   2 +-
 plugins/pychrysa/gui/panels/module.c        |   2 +-
 plugins/pychrysa/pychrysa.c                 |   5 +-
 src/arch/processor.c                        |   3 +-
 16 files changed, 245 insertions(+), 12 deletions(-)
 create mode 100644 plugins/pychrysa/gtkext/blockview.c
 create mode 100644 plugins/pychrysa/gtkext/blockview.h

diff --git a/ChangeLog b/ChangeLog
index e1bdf12..ecfde9f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,34 @@
+12-12-28  Cyrille Bagard <nocbos@gmail.com>
+
+	* plugins/pychrysa/analysis/binaries/module.c:
+	* plugins/pychrysa/analysis/module.c:
+	* plugins/pychrysa/arch/module.c:
+	* plugins/pychrysa/debug/module.c:
+	* plugins/pychrysa/format/dex/module.c:
+	* plugins/pychrysa/format/module.c:
+	* plugins/pychrysa/glibext/module.c:
+	Fix the check of the return value from PyModule_AddObject().
+
+	* plugins/pychrysa/gtkext/blockview.c:
+	* plugins/pychrysa/gtkext/blockview.h:
+	New entries: create Python objects for the GtkBlockView widgets.
+
+	* plugins/pychrysa/gtkext/Makefile.am:
+	* plugins/pychrysa/gtkext/module.c:
+	Fix the check of the return value from PyModule_AddObject().
+	Register the BlockView object.
+
+	* plugins/pychrysa/gui/module.c:
+	* plugins/pychrysa/gui/panels/module.c:
+	Fix the check of the return value from PyModule_AddObject().
+
+	* plugins/pychrysa/pychrysa.c:
+	Follow the official FAQ for initializing pygobject and pygtk
+	in the right way.
+
+	* src/arch/processor.c:
+	Avoid undefined symbol when compiling in non debug mode.
+
 12-12-27  Cyrille Bagard <nocbos@gmail.com>
 
 	* configure.ac:
diff --git a/plugins/pychrysa/analysis/binaries/module.c b/plugins/pychrysa/analysis/binaries/module.c
index 084e0a4..e3daf0e 100644
--- a/plugins/pychrysa/analysis/binaries/module.c
+++ b/plugins/pychrysa/analysis/binaries/module.c
@@ -57,7 +57,7 @@ bool add_binaries_module_to_python_module(PyObject *super)
     Py_INCREF(module);
     ret = PyModule_AddObject(super, "pychrysalide.analysis.binaries", module);
 
-    result = (ret != 0);
+    result = (ret == 0);
 
     result &= register_python_file_binary(module);
 
diff --git a/plugins/pychrysa/analysis/module.c b/plugins/pychrysa/analysis/module.c
index 688ea12..05c2e2e 100644
--- a/plugins/pychrysa/analysis/module.c
+++ b/plugins/pychrysa/analysis/module.c
@@ -58,7 +58,7 @@ bool add_analysis_module_to_python_module(PyObject *super)
     Py_INCREF(module);
     ret = PyModule_AddObject(super, "pychrysalide.analysis", module);
 
-    result = (ret != 0);
+    result = (ret == 0);
 
     result &= register_python_loaded_binary(module);
     result &= add_binaries_module_to_python_module(module);
diff --git a/plugins/pychrysa/arch/module.c b/plugins/pychrysa/arch/module.c
index 8092b6b..073ba62 100644
--- a/plugins/pychrysa/arch/module.c
+++ b/plugins/pychrysa/arch/module.c
@@ -60,7 +60,7 @@ bool add_arch_module_to_python_module(PyObject *super)
     Py_INCREF(module);
     ret = PyModule_AddObject(super, "pychrysalide.arch", module);
 
-    result = (ret != 0);
+    result = (ret == 0);
 
     if (ret != 0) /* ... */;
 
diff --git a/plugins/pychrysa/debug/module.c b/plugins/pychrysa/debug/module.c
index 7537dc7..cf9d671 100644
--- a/plugins/pychrysa/debug/module.c
+++ b/plugins/pychrysa/debug/module.c
@@ -57,7 +57,7 @@ bool add_debug_module_to_python_module(PyObject *super)
     Py_INCREF(module);
     ret = PyModule_AddObject(super, "pyoida.debug", module);
 
-    result = (ret != 0);
+    result = (ret == 0);
 
     result &= register_python_binary_debugger(module);
 
diff --git a/plugins/pychrysa/format/dex/module.c b/plugins/pychrysa/format/dex/module.c
index cea0702..8e6b775 100644
--- a/plugins/pychrysa/format/dex/module.c
+++ b/plugins/pychrysa/format/dex/module.c
@@ -58,7 +58,7 @@ bool add_format_dex_module_to_python_module(PyObject *super)
     Py_INCREF(module);
     ret = PyModule_AddObject(super, "pychrysalide.format.dex", module);
 
-    result = (ret != 0);
+    result = (ret == 0);
 
     if (ret != 0) /* ... */;
 
diff --git a/plugins/pychrysa/format/module.c b/plugins/pychrysa/format/module.c
index 8bf2ed2..92c3966 100644
--- a/plugins/pychrysa/format/module.c
+++ b/plugins/pychrysa/format/module.c
@@ -61,7 +61,7 @@ bool add_format_module_to_python_module(PyObject *super)
     Py_INCREF(module);
     ret = PyModule_AddObject(super, "pychrysalide.format", module);
 
-    result = (ret != 0);
+    result = (ret == 0);
 
     result &= register_python_binary_format(module);
     result &= add_format_executable_to_python_module(module);
diff --git a/plugins/pychrysa/glibext/module.c b/plugins/pychrysa/glibext/module.c
index 2212c32..65de4e5 100644
--- a/plugins/pychrysa/glibext/module.c
+++ b/plugins/pychrysa/glibext/module.c
@@ -58,7 +58,7 @@ bool add_glibext_module_to_python_module(PyObject *super)
     Py_INCREF(module);
     ret = PyModule_AddObject(super, "pychrysalide.glibext", module);
 
-    result = (ret != 0);
+    result = (ret == 0);
 
     result &= register_python_buffer_line(module);
     result &= register_python_code_buffer(module);
diff --git a/plugins/pychrysa/gtkext/Makefile.am b/plugins/pychrysa/gtkext/Makefile.am
index 79cece8..967c2ed 100644
--- a/plugins/pychrysa/gtkext/Makefile.am
+++ b/plugins/pychrysa/gtkext/Makefile.am
@@ -2,6 +2,7 @@
 noinst_LTLIBRARIES = libpychrysagtkext.la
 
 libpychrysagtkext_la_SOURCES =			\
+	blockview.h blockview.c				\
 	viewpanel.h viewpanel.c				\
 	module.h module.c
 
diff --git a/plugins/pychrysa/gtkext/blockview.c b/plugins/pychrysa/gtkext/blockview.c
new file mode 100644
index 0000000..70e61e6
--- /dev/null
+++ b/plugins/pychrysa/gtkext/blockview.c
@@ -0,0 +1,156 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * blockview.c - prototypes pour l'équivalent Python du fichier "gtkext/gtkblockview.c"
+ *
+ * Copyright (C) 2012 Cyrille Bagard
+ *
+ *  This file is part of OpenIDA.
+ *
+ *  OpenIDA 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.
+ *
+ *  OpenIDA 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 "blockview.h"
+
+
+#include <pygobject.h>
+
+
+#include <gtkext/gtkblockview.h>
+
+
+#include "../quirks.h"
+
+
+
+/* Crée un nouvel objet Python de type 'ViewPanel'. */
+static PyObject *py_block_view_new(PyTypeObject *, PyObject *, PyObject *);
+
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : type = type de l'objet à instancier.                         *
+*                args = arguments fournis à l'appel.                          *
+*                kwds = arguments de type key=val fournis.                    *
+*                                                                             *
+*  Description : Crée un nouvel objet Python de type 'ViewPanel'.             *
+*                                                                             *
+*  Retour      : Instance Python mise en place.                               *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static PyObject *py_block_view_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+#if 0
+    PyObject *result;                       /* Instance à retourner        */
+    const char *name;                       /* Désignation humaine         */
+    const char *lname;                      /* Nom version longue          */
+    PyGObject *widget;                      /* Composant visuel du panneau */
+    const char *path;                       /* Placement à l'affichage     */
+    int ret;                                /* Bilan de lecture des args.  */
+    GEditorItem *item;                      /* Version GLib du format      */
+
+    ret = PyArg_ParseTuple(args, "ssOs", &name, &lname, &widget, &path);
+    if (!ret) Py_RETURN_NONE;
+
+    item = g_block_view_new(get_internal_ref(), name, lname,
+                            GTK_WIDGET(pygobject_get(widget)), path);
+
+    result = py_block_view_from_c(G_BLOCK_VIEW(item));
+    g_object_unref(item);
+
+    return (PyObject *)result;
+#endif
+
+    /* FIXME */
+
+
+    Py_RETURN_NONE;
+
+}
+
+
+
+
+
+
+
+
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : module = module dont la définition est à compléter.          *
+*                                                                             *
+*  Description : Prend en charge l'objet 'pychrysalide.gtkext.BlockView'.     *
+*                                                                             *
+*  Retour      : Bilan de l'opération.                                        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool register_python_block_view(PyObject *module)
+{
+    PyObject *parent_mod;                   /* Module Python-EditorItem    */
+    int ret;                                /* Bilan d'un appel            */
+
+    static PyMethodDef py_block_view_methods[] = {
+        { NULL }
+    };
+
+    static PyGetSetDef py_block_view_getseters[] = {
+        { NULL }
+    };
+
+    static PyTypeObject py_block_view_type = {
+
+        PyObject_HEAD_INIT(NULL)
+
+        .tp_name        = "pychrysalide.gtkext.BlockView",
+        .tp_basicsize   = sizeof(PyGObject),
+
+        .tp_flags       = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+
+        .tp_doc         = "PyChrysalide view panel",
+
+        .tp_methods     = py_block_view_methods,
+        .tp_getset      = py_block_view_getseters,
+        .tp_new         = (newfunc)py_block_view_new,
+        .tp_init        = (initproc)pychrysalide_allow_args_for_gobjects
+
+    };
+
+    parent_mod = PyImport_ImportModule("pychrysalide.gtkext");
+    if (parent_mod == NULL) return false;
+
+    py_block_view_type.tp_base = (PyTypeObject *)PyObject_GetAttrString(parent_mod, "ViewPanel");
+    Py_DECREF(parent_mod);
+
+    if (PyType_Ready(&py_block_view_type) < 0)
+        return false;
+
+    Py_INCREF(&py_block_view_type);
+    ret = PyModule_AddObject(module, "BlockView", (PyObject *)&py_block_view_type);
+
+    pygobject_register_class(module, "GtkBlockView", GTK_TYPE_BLOCK_VIEW, &py_block_view_type,
+                             Py_BuildValue("(O)", py_block_view_type.tp_base));
+
+    return (ret == 0);
+
+}
diff --git a/plugins/pychrysa/gtkext/blockview.h b/plugins/pychrysa/gtkext/blockview.h
new file mode 100644
index 0000000..c45b4bc
--- /dev/null
+++ b/plugins/pychrysa/gtkext/blockview.h
@@ -0,0 +1,39 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * blockview.h - prototypes pour l'équivalent Python du fichier "gtkext/gtkblockview.h"
+ *
+ * Copyright (C) 2012 Cyrille Bagard
+ *
+ *  This file is part of OpenIDA.
+ *
+ *  OpenIDA 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.
+ *
+ *  OpenIDA 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_PYCHRYSA_GTKEXT_MODULE_BLOCK_VIEW_H
+#define _PLUGINS_PYCHRYSA_GTKEXT_MODULE_BLOCK_VIEW_H
+
+
+#include <Python.h>
+#include <stdbool.h>
+
+
+
+/* Prend en charge l'objet 'pychrysalide.gtkext.BlockView'. */
+bool register_python_block_view(PyObject *module);
+
+
+
+#endif  /* _PLUGINS_PYCHRYSA_GTKEXT_MODULE_BLOCK_VIEW_H */
diff --git a/plugins/pychrysa/gtkext/module.c b/plugins/pychrysa/gtkext/module.c
index fb17633..744f1b1 100644
--- a/plugins/pychrysa/gtkext/module.c
+++ b/plugins/pychrysa/gtkext/module.c
@@ -25,6 +25,7 @@
 #include "module.h"
 
 
+#include "blockview.h"
 #include "viewpanel.h"
 
 
@@ -57,9 +58,10 @@ bool add_gtkext_module_to_python_module(PyObject *super)
     Py_INCREF(module);
     ret = PyModule_AddObject(super, "pychrysalide.gtkext", module);
 
-    result = (ret != 0);
+    result = (ret == 0);
 
     result &= register_python_view_panel(module);
+    result &= register_python_block_view(module);
 
     return result;
 
diff --git a/plugins/pychrysa/gui/module.c b/plugins/pychrysa/gui/module.c
index cf09c44..88ea244 100644
--- a/plugins/pychrysa/gui/module.c
+++ b/plugins/pychrysa/gui/module.c
@@ -58,7 +58,7 @@ bool add_gui_module_to_python_module(PyObject *super)
     Py_INCREF(module);
     ret = PyModule_AddObject(super, "pychrysalide.gui", module);
 
-    result = (ret != 0);
+    result = (ret == 0);
 
     if (ret != 0) /* ... */;
 
diff --git a/plugins/pychrysa/gui/panels/module.c b/plugins/pychrysa/gui/panels/module.c
index 7c26dac..9427f22 100644
--- a/plugins/pychrysa/gui/panels/module.c
+++ b/plugins/pychrysa/gui/panels/module.c
@@ -57,7 +57,7 @@ bool add_gui_panels_module_to_python_module(PyObject *super)
     Py_INCREF(module);
     ret = PyModule_AddObject(super, "pychrysalide.gui.panels", module);
 
-    result = (ret != 0);
+    result = (ret == 0);
 
     if (ret != 0) /* ... */;
 
diff --git a/plugins/pychrysa/pychrysa.c b/plugins/pychrysa/pychrysa.c
index 94cd51e..980c073 100644
--- a/plugins/pychrysa/pychrysa.c
+++ b/plugins/pychrysa/pychrysa.c
@@ -27,6 +27,7 @@
 #include <dirent.h>
 #include <pygobject.h>
 #include <string.h>
+#include <pygtk/pygtk.h>
 
 
 #include <config.h>
@@ -280,7 +281,9 @@ PyMODINIT_FUNC initpychrysa(void)
 {
     PyObject *module;
 
-    pygobject_init(-1, -1, -1);
+    init_pygobject();
+    init_pygtk();
+
     pychrysalide_init_quirks();
 
     module = Py_InitModule("pychrysalide", SpamMethods);
diff --git a/src/arch/processor.c b/src/arch/processor.c
index 01c3b82..fea71d6 100644
--- a/src/arch/processor.c
+++ b/src/arch/processor.c
@@ -262,9 +262,10 @@ GArchInstruction *g_arch_processor_decode_instruction(const GArchProcessor *proc
         *pos = old_pos;
         result = g_db_instruction_new_from_data(data, pos, len, base, proc);
 
+#ifdef DEBUG /* FIXME */
         if (skipped)
             g_db_instruction_mark_as_skipped(G_DB_INSTRUCTION(result));
-
+#endif
     }
 
     g_arch_instruction_set_location(result, base + old_pos, *pos - old_pos, addr);
-- 
cgit v0.11.2-87-g4458