From 944fc0a5638bfe77fc65e514fbdd945d8a652635 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Sat, 15 Sep 2012 08:19:09 +0000
Subject: Shown all Android permissions with links to the code.

git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@262 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
---
 ChangeLog                               |  51 ++++++++
 configure.ac                            |   2 +
 plugins/pychrysa/Makefile.am            |   7 +-
 plugins/pychrysa/arch/instruction.c     |  36 ++++++
 plugins/pychrysa/gui/Makefile.am        |  20 +++
 plugins/pychrysa/gui/module.c           |  68 ++++++++++
 plugins/pychrysa/gui/module.h           |  39 ++++++
 plugins/pychrysa/gui/panels/Makefile.am |  17 +++
 plugins/pychrysa/gui/panels/module.c    |  68 ++++++++++
 plugins/pychrysa/gui/panels/module.h    |  39 ++++++
 plugins/pychrysa/gui/panels/panel.c     | 213 ++++++++++++++++++++++++++++++++
 plugins/pychrysa/gui/panels/panel.h     |  44 +++++++
 plugins/pychrysa/pychrysa.c             |   3 +
 plugins/pychrysa/quirks.c               |  32 ++++-
 plugins/pychrysa/quirks.h               |   7 ++
 plugins/python/androperms/androperms.py |  67 ++++++++--
 plugins/python/androperms/panel.py      |  78 +++++-------
 src/Makefile.am                         |  64 +++++-----
 src/analysis/routine.c                  |   4 +-
 src/analysis/type.c                     |   2 +-
 src/arch/instruction.c                  |  19 +++
 src/arch/instruction.h                  |   3 +
 src/gui/Makefile.am                     |   3 +-
 src/gui/menus/Makefile.am               |   2 +-
 src/gui/panels/panel.c                  |   2 -
 25 files changed, 788 insertions(+), 102 deletions(-)
 create mode 100644 plugins/pychrysa/gui/Makefile.am
 create mode 100644 plugins/pychrysa/gui/module.c
 create mode 100644 plugins/pychrysa/gui/module.h
 create mode 100644 plugins/pychrysa/gui/panels/Makefile.am
 create mode 100644 plugins/pychrysa/gui/panels/module.c
 create mode 100644 plugins/pychrysa/gui/panels/module.h
 create mode 100644 plugins/pychrysa/gui/panels/panel.c
 create mode 100644 plugins/pychrysa/gui/panels/panel.h

diff --git a/ChangeLog b/ChangeLog
index 667e23b..a2e548b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,54 @@
+12-09-15  Cyrille Bagard <nocbos@gmail.com>
+
+	* configure.ac:
+	Add the new Makfiles from the plugins/pychrysa/gui and
+	plugins/pychrysa/gui/panels directories to AC_CONFIG_FILES.
+
+	* plugins/pychrysa/arch/instruction.c:
+	Provide the keyword used in an instruction.
+
+	* plugins/pychrysa/gui/Makefile.am:
+	* plugins/pychrysa/gui/module.c:
+	* plugins/pychrysa/gui/module.h:
+	* plugins/pychrysa/gui/panels/Makefile.am:
+	* plugins/pychrysa/gui/panels/module.c:
+	* plugins/pychrysa/gui/panels/module.h:
+	* plugins/pychrysa/gui/panels/panel.c:
+	* plugins/pychrysa/gui/panels/panel.h:
+	New entries: allow plugins to add panels in the editor.
+
+	* plugins/pychrysa/Makefile.am:
+	Reorganize binaries.
+
+	* plugins/pychrysa/pychrysa.c:
+	Store the global reference area and load the gui module.
+
+	* plugins/pychrysa/quirks.c:
+	* plugins/pychrysa/quirks.h:
+	Update Gil access (!) and store the global reference here.
+
+	* plugins/python/androperms/androperms.py:
+	* plugins/python/androperms/panel.py:
+	Show all Android permissions with links to the code.
+
+	* src/analysis/routine.c:
+	* src/analysis/type.c:
+	Cosmetic.
+
+	* src/arch/instruction.c:
+	* src/arch/instruction.h:
+	Provide the keyword used in an instruction.
+
+	* src/gui/Makefile.am:
+	* src/gui/menus/Makefile.am:
+	Reorganize binaries.
+
+	* src/gui/panels/panel.c:
+	Remove dead code.
+
+	* src/Makefile.am:
+	Reorganize and rename all binaries.
+
 12-08-20  Cyrille Bagard <nocbos@gmail.com>
 
 	* pixmaps/drop_bottom_hover.png:
diff --git a/configure.ac b/configure.ac
index 9f369da..23804fb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -242,6 +242,8 @@ AC_CONFIG_FILES([Makefile
                  plugins/pychrysa/debug/Makefile
                  plugins/pychrysa/format/Makefile
                  plugins/pychrysa/glibext/Makefile
+                 plugins/pychrysa/gui/Makefile
+                 plugins/pychrysa/gui/panels/Makefile
                  plugins/python/Makefile
                  plugins/python/androperms/Makefile
                  plugins/python/apkfiles/Makefile
diff --git a/plugins/pychrysa/Makefile.am b/plugins/pychrysa/Makefile.am
index f8c08db..d57c9f5 100644
--- a/plugins/pychrysa/Makefile.am
+++ b/plugins/pychrysa/Makefile.am
@@ -12,11 +12,12 @@ pychrysa_la_LIBADD =					\
 	arch/libpychrysaarch.la				\
 	debug/libpychrysadebug.la			\
 	format/libpychrysaformat.la			\
-	glibext/libpychrysaglibext.la
+	glibext/libpychrysaglibext.la		\
+	gui/libpychrysagui.la
 
 pychrysa_la_LDFLAGS = -module -avoid-version $(LIBGTK_LIBS) $(LIBXML_LIBS) $(LIBPYTHON_LIBS) \
 	$(LIBPYGOBJECT_LIBS) \
-		-L../../src/panels/ -lpanels -L../../src/.libs -loidadisass -loidagtkext 	\
+		-L../../src/panels/ -lpanels -L../../src/.libs -L../../src/gui/.libs -lchrysagui -lchrysadisass -lchrysagtkext 	\
 	-L../../src/plugins/.libs -lplugins
 
 
@@ -26,4 +27,4 @@ AM_CPPFLAGS =
 
 AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS)
 
-SUBDIRS = analysis arch debug format glibext
+SUBDIRS = analysis arch debug format glibext gui
diff --git a/plugins/pychrysa/arch/instruction.c b/plugins/pychrysa/arch/instruction.c
index 80cc4ee..bed937b 100644
--- a/plugins/pychrysa/arch/instruction.c
+++ b/plugins/pychrysa/arch/instruction.c
@@ -72,6 +72,9 @@ static PyObject *py_arch_instruction_get_iter(PyObject *);
 /* Fournit la valeur associée à une propriété donnée. */
 static PyObject *py_arch_instruction_get_location(PyObject *, char *);
 
+/* Fournit le nom humain de l'instruction manipulée. */
+static PyObject *py_arch_instruction_get_keyword(PyObject *, void *);
+
 
 
 /* ---------------------------------------------------------------------------------- */
@@ -347,6 +350,35 @@ static PyObject *py_arch_instruction_get_location(PyObject *self, char *name)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : self   = classe représentant une instruction.                *
+*                unused = adresse non utilisée ici.                           *
+*                                                                             *
+*  Description : Fournit le nom humain de l'instruction manipulée.            *
+*                                                                             *
+*  Retour      : Valeur associée à la propriété consultée.                    *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static PyObject *py_arch_instruction_get_keyword(PyObject *self, void *unused)
+{
+    PyObject *result;                       /* Trouvailles à retourner     */
+    GArchInstruction *instr;                /* Version native              */
+    const char *kw;                         /* Valeur récupérée            */
+
+    instr = G_ARCH_INSTRUCTION(pygobject_get(self));
+    kw = g_arch_instruction_get_keyword(instr);
+
+    result = PyString_FromString(kw);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : module = module dont la définition est à compléter.          *
 *                                                                             *
 *  Description : Prend en charge l'objet 'pychrysalide.arch.ArchInstruction'. *
@@ -379,6 +411,10 @@ bool register_python_arch_instruction(PyObject *module)
             "address", (getter)py_arch_instruction_get_location, (setter)NULL,
             "Provide the location of the instruction in memory.", "address"
         },
+        {
+            "keyword", (getter)py_arch_instruction_get_keyword, (setter)NULL,
+            "Give le name of the assembly instruction.", NULL
+        },
         { NULL }
     };
 
diff --git a/plugins/pychrysa/gui/Makefile.am b/plugins/pychrysa/gui/Makefile.am
new file mode 100644
index 0000000..48fde30
--- /dev/null
+++ b/plugins/pychrysa/gui/Makefile.am
@@ -0,0 +1,20 @@
+
+noinst_LTLIBRARIES = libpychrysagui.la
+
+libpychrysagui_la_SOURCES =				\
+	module.h module.c
+
+libpychrysagui_la_LIBADD =				\
+	panels/libpychrysaguipanels.la
+
+libpychrysagui_la_LDFLAGS = 
+
+
+INCLUDES = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_CFLAGS) $(LIBPYGOBJECT_CFLAGS) \
+	-I../../../src
+
+AM_CPPFLAGS = 
+
+AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS)
+
+SUBDIRS = panels
diff --git a/plugins/pychrysa/gui/module.c b/plugins/pychrysa/gui/module.c
new file mode 100644
index 0000000..bee46df
--- /dev/null
+++ b/plugins/pychrysa/gui/module.c
@@ -0,0 +1,68 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * module.c - intégration du répertoire gui en tant que module
+ *
+ * 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 "module.h"
+
+
+#include "panels/module.h"
+
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : module = module dont la définition est à compléter.          *
+*                                                                             *
+*  Description : Ajoute le module 'gui' au module Python.                     *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool add_gui_module_to_python_module(PyObject *super)
+{
+    bool result;
+    PyObject *module;
+    int ret;                                /* Bilan d'un appel            */
+
+    static PyMethodDef py_gui_methods[] = {
+        { NULL }
+    };
+
+    module = Py_InitModule("pychrysalide.gui", py_gui_methods);
+    if (module == NULL) return false;
+
+    Py_INCREF(module);
+    ret = PyModule_AddObject(super, "pychrysalide.gui", module);
+
+    result = (ret != 0);
+
+    if (ret != 0) /* ... */;
+
+    result &= add_gui_panels_module_to_python_module(module);
+
+    return true;
+
+}
diff --git a/plugins/pychrysa/gui/module.h b/plugins/pychrysa/gui/module.h
new file mode 100644
index 0000000..0c909d3
--- /dev/null
+++ b/plugins/pychrysa/gui/module.h
@@ -0,0 +1,39 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * module.h - prototypes pour l'intégration du répertoire gui en tant que module
+ *
+ * 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_GUI_MODULE_H
+#define _PLUGINS_PYCHRYSA_GUI_MODULE_H
+
+
+#include <Python.h>
+#include <stdbool.h>
+
+
+
+/* Ajoute le module 'gui' au module Python. */
+bool add_gui_module_to_python_module(PyObject *);
+
+
+
+#endif  /* _PLUGINS_PYCHRYSA_GUI_MODULE_H */
diff --git a/plugins/pychrysa/gui/panels/Makefile.am b/plugins/pychrysa/gui/panels/Makefile.am
new file mode 100644
index 0000000..b383293
--- /dev/null
+++ b/plugins/pychrysa/gui/panels/Makefile.am
@@ -0,0 +1,17 @@
+
+noinst_LTLIBRARIES = libpychrysaguipanels.la
+
+libpychrysaguipanels_la_SOURCES =		\
+	module.h module.c					\
+	panel.h panel.c
+
+
+libpychrysaguipanels_la_LDFLAGS = 
+
+
+INCLUDES = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_CFLAGS) $(LIBPYGOBJECT_CFLAGS) \
+	-I../../../../src
+
+AM_CPPFLAGS = 
+
+AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS)
diff --git a/plugins/pychrysa/gui/panels/module.c b/plugins/pychrysa/gui/panels/module.c
new file mode 100644
index 0000000..7c26dac
--- /dev/null
+++ b/plugins/pychrysa/gui/panels/module.c
@@ -0,0 +1,68 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * module.c - intégration du répertoire arch en tant que module
+ *
+ * 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 "module.h"
+
+
+#include "panel.h"
+
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : module = module dont la définition est à compléter.          *
+*                                                                             *
+*  Description : Ajoute le module 'gui.panels' au module Python.              *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool add_gui_panels_module_to_python_module(PyObject *super)
+{
+    bool result;
+    PyObject *module;
+    int ret;                                /* Bilan d'un appel            */
+
+    static PyMethodDef py_gui_panels_methods[] = {
+        { NULL }
+    };
+
+    module = Py_InitModule("pychrysalide.gui.panels", py_gui_panels_methods);
+    if (module == NULL) return false;
+
+    Py_INCREF(module);
+    ret = PyModule_AddObject(super, "pychrysalide.gui.panels", module);
+
+    result = (ret != 0);
+
+    if (ret != 0) /* ... */;
+
+    result &= register_python_panel_item(module);
+
+    return true;
+
+}
diff --git a/plugins/pychrysa/gui/panels/module.h b/plugins/pychrysa/gui/panels/module.h
new file mode 100644
index 0000000..6d7415c
--- /dev/null
+++ b/plugins/pychrysa/gui/panels/module.h
@@ -0,0 +1,39 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * module.h - prototypes pour l'intégration du répertoire gui.panels en tant que module
+ *
+ * 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_GUI_PANELS_MODULE_H
+#define _PLUGINS_PYCHRYSA_GUI_PANELS_MODULE_H
+
+
+#include <Python.h>
+#include <stdbool.h>
+
+
+
+/* Ajoute le module 'gui.panels' au module Python. */
+bool add_gui_panels_module_to_python_module(PyObject *);
+
+
+
+#endif  /* _PLUGINS_PYCHRYSA_GUI_PANELS_MODULE_H */
diff --git a/plugins/pychrysa/gui/panels/panel.c b/plugins/pychrysa/gui/panels/panel.c
new file mode 100644
index 0000000..c35e9a0
--- /dev/null
+++ b/plugins/pychrysa/gui/panels/panel.c
@@ -0,0 +1,213 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * panel.c - équivalent Python du fichier "gui/panels/panel.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 "panel.h"
+
+
+#include <pygobject.h>
+
+
+#include "../../quirks.h"
+
+
+
+/* Crée un nouvel objet Python de type 'PanelItem'. */
+static PyObject *py_panel_item_new(PyTypeObject *, PyObject *, PyObject *);
+
+/* Place un panneau dans l'ensemble affiché. */
+static PyObject *py_panel_item_dock(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 'PanelItem'.             *
+*                                                                             *
+*  Retour      : Instance Python mise en place.                               *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static PyObject *py_panel_item_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+    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_ParseTupleAndKeywords(args, kwds, "ssOs",
+                                      (char *[]) { "name", "lname", "widget", "path", NULL },
+                                      &name, &lname, &widget, &path);
+    if (!ret) return Py_None;
+
+    item = g_panel_item_new(get_internal_ref(), name, lname,
+                            GTK_WIDGET(pygobject_get(widget)), path);
+
+    result = py_panel_item_from_c(G_PANEL_ITEM(item));
+    g_object_unref(item);
+
+    return (PyObject *)result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : item = instance existante GLib.                              *
+*                                                                             *
+*  Description : Crée un nouvel objet Python de type 'PanelItem'.             *
+*                                                                             *
+*  Retour      : Instance Python mise en place.                               *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+PyObject *py_panel_item_from_c(GPanelItem *item)
+{
+    PyObject *module;                       /* Module d'appartenance       */
+    PyTypeObject *type;                     /* Type Python correspondant   */
+
+    module = PyImport_ImportModule("pychrysalide.gui.panels");
+    type = (PyTypeObject *)PyObject_GetAttrString(module, "PanelItem");
+    Py_DECREF(module);
+
+    pychrysalide_set_instance_data(G_OBJECT(item), type);
+
+    return pygobject_new(G_OBJECT(item));
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : self = classe représentant un binaire.                       *
+*                args = arguments fournis à l'appel.                          *
+*                                                                             *
+*  Description : Place un panneau dans l'ensemble affiché.                    *
+*                                                                             *
+*  Retour      : Py_None.                                                     *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static PyObject *py_panel_item_dock(PyObject *self, PyObject *args)
+{
+    GPanelItem *item;                       /* Panneau à manipuler         */
+
+    item = G_PANEL_ITEM(pygobject_get(self));
+
+    g_panel_item_dock(item);
+
+    return Py_None;
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : module = module dont la définition est à compléter.          *
+*                                                                             *
+*  Description : Prend en charge l'objet 'pychrysalide.gui.panels.PanelItem'. *
+*                                                                             *
+*  Retour      : Bilan de l'opération.                                        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool register_python_panel_item(PyObject *module)
+{
+    PyObject *pygobj_mod;                   /* Module Python-GObject       */
+    int ret;                                /* Bilan d'un appel            */
+
+    static PyMethodDef py_panel_item_methods[] = {
+        {
+            "dock", (PyCFunction)py_panel_item_dock,
+            METH_NOARGS,
+            "DIsplay the panel item in the right place."
+        },
+        { NULL }
+    };
+
+    static PyGetSetDef py_panel_item_getseters[] = {
+        { NULL }
+    };
+
+    static PyTypeObject py_panel_item_type = {
+
+        PyObject_HEAD_INIT(NULL)
+
+        .tp_name        = "pychrysalide.gui.panels.PanelItem",
+        .tp_basicsize   = sizeof(PyGObject),
+
+        .tp_flags       = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+
+        .tp_doc         = "PyChrysalide panel item",
+
+        .tp_methods     = py_panel_item_methods,
+        .tp_getset      = py_panel_item_getseters,
+        .tp_new         = (newfunc)py_panel_item_new
+
+    };
+
+    pygobj_mod = PyImport_ImportModule("gobject");
+    if (pygobj_mod == NULL) return false;
+
+    py_panel_item_type.tp_base = (PyTypeObject *)PyObject_GetAttrString(pygobj_mod, "GObject");
+    Py_DECREF(pygobj_mod);
+
+    if (PyType_Ready(&py_panel_item_type) < 0)
+        return false;
+
+    Py_INCREF(&py_panel_item_type);
+    ret = PyModule_AddObject(module, "PanelItem", (PyObject *)&py_panel_item_type);
+
+    return (ret == 0);
+
+}
diff --git a/plugins/pychrysa/gui/panels/panel.h b/plugins/pychrysa/gui/panels/panel.h
new file mode 100644
index 0000000..8d06094
--- /dev/null
+++ b/plugins/pychrysa/gui/panels/panel.h
@@ -0,0 +1,44 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * panel.h - prototypes pour l'équivalent Python du fichier "gui/panels/panel.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_GUI_PANELS_PANEL_H
+#define _PLUGINS_PYCHRYSA_GUI_PANELS_PANEL_H
+
+
+#include <Python.h>
+#include <stdbool.h>
+
+#include <gui/panels/panel.h>
+
+
+
+/* Crée un nouvel objet Python de type 'PanelItem'. */
+PyObject *py_panel_item_from_c(GPanelItem *);
+
+/* Prend en charge l'objet 'pychrysalide.gui.panels.PanelItem'. */
+bool register_python_panel_item(PyObject *module);
+
+
+
+#endif  /* _PLUGINS_PYCHRYSA_GUI_PANELS_PANEL_H */
diff --git a/plugins/pychrysa/pychrysa.c b/plugins/pychrysa/pychrysa.c
index 8b9fc50..0aa6175 100644
--- a/plugins/pychrysa/pychrysa.c
+++ b/plugins/pychrysa/pychrysa.c
@@ -38,6 +38,7 @@
 #include "debug/module.h"
 #include "format/module.h"
 #include "glibext/module.h"
+#include "gui/module.h"
 
 /*
 #include "analysis/py_binary.h"
@@ -123,6 +124,7 @@ bool init_plugin(GPluginModule *plugin, GObject *ref)
 
     //return false;
 
+    define_internal_ref(ref);
 
     Py_Initialize();
 
@@ -267,6 +269,7 @@ PyMODINIT_FUNC initpychrysa(void)
     add_debug_module_to_python_module(module);
     add_format_module_to_python_module(module);
     add_glibext_module_to_python_module(module);
+    add_gui_module_to_python_module(module);
 
     add_log_to_python_module(module);
     add_plugin_to_python_module(module);
diff --git a/plugins/pychrysa/quirks.c b/plugins/pychrysa/quirks.c
index 4dcae2c..0e35f57 100644
--- a/plugins/pychrysa/quirks.c
+++ b/plugins/pychrysa/quirks.c
@@ -55,7 +55,7 @@ static void pygobject_data_free_fake(PyGObjectData_fake *data)
     PyGILState_STATE state;                 /* Etat interne de Python      */
     GSList *iter;                           /* Boucle de parcours          */
 
-    state = pyglib_gil_state_ensure();
+    //state = pyglib_gil_state_ensure();
 
     Py_DECREF(data->type);
 
@@ -77,7 +77,7 @@ static void pygobject_data_free_fake(PyGObjectData_fake *data)
 
     g_free(data);
 
-    pyglib_gil_state_release(state);
+    //pyglib_gil_state_release(state);
 
 }
 
@@ -94,6 +94,9 @@ static PyGObjectData_fake *pygobject_data_new_fake(void)
 }
 
 
+static GObject *_ref = NULL;
+
+
 
 /******************************************************************************
 *                                                                             *
@@ -146,3 +149,28 @@ void pychrysalide_set_instance_data(GObject *obj, PyTypeObject *type)
     }
 
 }
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : ref = espace de référencement global à utiliser.             *
+*                                                                             *
+*  Description : Evite à Python d'avoir à manipuler les références internes.  *
+*                                                                             *
+*  Retour      : Adresse de l'espace de référencement global.                 *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+GObject *_get_internal_ref(GObject *ref)
+{
+    if (ref != NULL)
+    {
+        g_object_ref(ref);
+        _ref = ref;
+    }
+
+    return _ref;
+
+}
diff --git a/plugins/pychrysa/quirks.h b/plugins/pychrysa/quirks.h
index 70e036e..f9c53dc 100644
--- a/plugins/pychrysa/quirks.h
+++ b/plugins/pychrysa/quirks.h
@@ -37,6 +37,13 @@ void pychrysalide_init_quirks(void);
 /* Crée l'association précise attendue par Python-GObject. */
 void pychrysalide_set_instance_data(GObject *, PyTypeObject *);
 
+/* Evite à Python d'avoir à manipuler les références internes. */
+GObject *_get_internal_ref(GObject *);
+
+
+#define define_internal_ref(r) _get_internal_ref(r)
+#define get_internal_ref() _get_internal_ref(NULL)
+
 
 
 #endif  /* _PLUGINS_PYOIDA_QUIRKS_H */
diff --git a/plugins/python/androperms/androperms.py b/plugins/python/androperms/androperms.py
index 0d70edc..6d65ca4 100644
--- a/plugins/python/androperms/androperms.py
+++ b/plugins/python/androperms/androperms.py
@@ -1,9 +1,10 @@
 #!/usr/bin/python
 # -*- coding: utf-8 -*-
 
-from pychrysalide import Plugin
 from manifest import AndroidManifest
 from panel import PermsPanel
+from pychrysalide import Plugin
+from pychrysalide.gui.panels import PanelItem
 from xml.dom import minidom
 
 import gtk
@@ -45,27 +46,69 @@ class AndroPerms(Plugin):
 
         print
 
-        button = gtk.Button("Hello World")
-        button.show()
-
-        treestore = gtk.TreeStore(str, str, str)
 
 
         panel = PermsPanel()
 
+        self._build_panel_item()
+
+
 
         panel.filter_permissions(plist)
 
-        #self.add_wgt(panel.get_widget())
 
         instrs = binary.get_instructions()
+        buffer = binary.disassembled_buffer
+
+
+
+
 
         for i in instrs:
-        #    print i, " :: 0x%08lx" % i.address
 
-            line = binary.disassembled_buffer.find_line_by_addr(i.address)
-            text = line.get_text()
+            if i.keyword.startswith("invoke"):
+
+                line = buffer.find_line_by_addr(i.address)
+                text = line.get_text()
+
+                panel.check_call(i.address, text)
+
+
+
+
+
+        panel.fill_tree(self._store)
+        self._tree.expand_all()
+
+
+
+    def _build_panel_item(self):
+
+        self._scrolled_window = gtk.ScrolledWindow()
+        self._scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        self._scrolled_window.show()
+
+        self._tree = gtk.TreeView()
+        self._tree.set_headers_visible(False)
+        self._tree.show()
+        self._scrolled_window.add_with_viewport(self._tree)
+
+        locations = gtk.TreeViewColumn()
+        self._tree.append_column(locations)
+
+        cell = gtk.CellRendererText()
+        locations.pack_start(cell, False)
+        locations.add_attribute(cell, "text", 0)
+
+        functions = gtk.TreeViewColumn()
+        self._tree.append_column(functions)
+
+        cell = gtk.CellRendererText()
+        functions.pack_start(cell, True)
+        functions.add_attribute(cell, "text", 1)
+
+        self._store = gtk.TreeStore(str, str)
+        self._tree.set_model(self._store)
 
-            if text.startswith("invoke"):
-                #print "[0x%08lx] " % i.address, text
-                pass
+        pi = PanelItem(name="Permissions", lname="Permissions", widget=self._scrolled_window, path="S")
+        pi.dock()
diff --git a/plugins/python/androperms/panel.py b/plugins/python/androperms/panel.py
index b852049..ca7bb90 100644
--- a/plugins/python/androperms/panel.py
+++ b/plugins/python/androperms/panel.py
@@ -1,5 +1,6 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
 
-import gtk
 import os
 
 
@@ -8,50 +9,12 @@ class PermsPanel:
 
     def __init__(self):
 
-
-        tree = gtk.TreeView()
-
-        languages = gtk.TreeViewColumn()
-        languages.set_title("Programming languages")
-
-        cell = gtk.CellRendererText()
-        languages.pack_start(cell, True)
-        languages.add_attribute(cell, "text", 0)
-
-        treestore = gtk.TreeStore(str)
-
-        it = treestore.append(None, ["Scripting languages"])
-        treestore.append(it, ["Python"])
-        treestore.append(it, ["PHP"])
-        treestore.append(it, ["Perl"])
-        treestore.append(it, ["Ruby"])
-
-        it = treestore.append(None, ["Compiling languages"])
-        treestore.append(it, ["C#"])
-        treestore.append(it, ["C++"])
-        treestore.append(it, ["C"])
-        treestore.append(it, ["Java"])
-
-        tree.append_column(languages)
-        tree.set_model(treestore)
-
-        tree.show()
-
-        self._view = tree
-
         self._perms = { }
+        self._used = { }
                      
         self._load_all_definitions()
 
 
-    def get_widget(self):
-
-        return self._view
-
-
-
-
-
     def _load_all_definitions(self):
         """Load the database in memory."""
 
@@ -69,7 +32,10 @@ class PermsPanel:
                     if p not in self._perms:
                         self._perms[p] = []
 
-                    self._perms[p].append(perm[0])
+                    call = perm[0].split("(")[0]
+
+                    if call not in self._perms[p]:
+                        self._perms[p].append(call)
 
 
     def filter_permissions(self, used):
@@ -83,7 +49,29 @@ class PermsPanel:
 
         self._perms = keep
 
-        # for p in self._perms:
-        #     print p
-        #     for v in self._perms[p]:
-        #         print "   - ", v
+        for p in keep:
+            self._used[p] = []
+
+
+    def check_call(self, addr, line):
+        """Check if a call requires some rights."""
+
+        for p in self._perms:
+
+            for c in self._perms[p]:
+
+                if line.find(c) > -1:
+                    self._used[p].append([addr, c + "()"])
+
+
+    def fill_tree(self, store):
+        """Fill a treeview with all found permissions."""
+
+        for p in self._used:
+
+            if len(self._used[p]) > 0:
+
+                it = store.append(None, [p, None])
+
+                for f in self._used[p]:
+                    store.append(it, ["0x%08x" % f[0], f[1]])
diff --git a/src/Makefile.am b/src/Makefile.am
index 9432240..35cd031 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,7 +1,7 @@
 
-lib_LTLIBRARIES = liboidaglibext.la liboidadisass.la liboidagtkext.la liboidagui.la liboidaplugin.la
+lib_LTLIBRARIES = libchrysaglibext.la libchrysadisass.la libchrysagtkext.la libchrysagui.la libchrysaplugin.la
 
-bin_PROGRAMS=openida
+bin_PROGRAMS = chrysalide
 
 
 
@@ -9,14 +9,14 @@ bin_PROGRAMS=openida
 # Bibliothèques dynamiques
 ############################################################
 
-#--- liboidadisas
+#--- libchrysadisas
 
-liboidadisass_la_SOURCES =
+libchrysadisass_la_SOURCES =
 
-liboidadisass_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBXML_LIBS)	\
-	-Lcommon/.libs -lcommon -L.libs -loidaglibext
+libchrysadisass_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBXML_LIBS)	\
+	-Lcommon/.libs -lcommon -L.libs -lchrysaglibext
 
-liboidadisass_la_LIBADD =				\
+libchrysadisass_la_LIBADD =				\
 	analysis/libanalysis.la				\
 	arch/libarch.la						\
 	debug/libdebug.la					\
@@ -25,47 +25,48 @@ liboidadisass_la_LIBADD =				\
 	format/libformat.la
 
 
-#--- liboidaglibext
+#--- libchrysaglibext
 
-liboidaglibext_la_SOURCES =
+libchrysaglibext_la_SOURCES =
 
-liboidaglibext_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBGRAPH_LIBS)
+libchrysaglibext_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBGRAPH_LIBS)
 
-liboidaglibext_la_LIBADD =						\
+libchrysaglibext_la_LIBADD =						\
 	glibext/libglibext.la
 
 
-#--- liboidagtkext
+#--- libchrysagtkext
 
-liboidagtkext_la_SOURCES =
+libchrysagtkext_la_SOURCES =
 
-liboidagtkext_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBGRAPH_LIBS)		\
-	-L.libs -loidadisass
+libchrysagtkext_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBGRAPH_LIBS)		\
+	-L.libs -lchrysadisass
 
-liboidagtkext_la_LIBADD =						\
+libchrysagtkext_la_LIBADD =						\
 	graph/libgraph.la							\
 	gtkext/libgtkext.la
 
 
-#--- liboidagui
+#--- libchrysagui
 
-liboidagui_la_SOURCES =
+libchrysagui_la_SOURCES =
 
-liboidagui_la_LDFLAGS = $(LIBGTK_LIBS)			\
-	-L.libs -loidagtkext
+libchrysagui_la_LDFLAGS = $(LIBGTK_LIBS)			\
+	-L.libs -lchrysagtkext
 
-liboidagui_la_LIBADD =							\
+libchrysagui_la_LIBADD =							\
+	gui/libgui.la									\
 	panels/libpanels.la
 
 
-#--- liboidaplugin
+#--- libchrysaplugin
 
-liboidaplugin_la_SOURCES =
+libchrysaplugin_la_SOURCES =
 
-liboidaplugin_la_LDFLAGS = $(LIBGTK_LIBS)		\
-	-L.libs -loidadisass -loidagui
+libchrysaplugin_la_LDFLAGS = $(LIBGTK_LIBS)		\
+	-L.libs -lchrysadisass -lchrysagui
 
-liboidaplugin_la_LIBADD =						\
+libchrysaplugin_la_LIBADD =						\
 	plugins/libplugins.la
 
 
@@ -74,7 +75,7 @@ liboidaplugin_la_LIBADD =						\
 # Programme principal
 ############################################################
 
-openida_SOURCES = 						\
+chrysalide_SOURCES = 						\
 	configuration.h configuration.c		\
 	editor.h editor.c					\
 	main.c								\
@@ -90,16 +91,15 @@ AM_CPPFLAGS =
 AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS)
 
 
-openida_LDFLAGS = $(LIBGTK_LIBS) -L/usr/X11R6/lib -ldl -lm $(LIBXML_LIBS) `pkg-config --libs gthread-2.0` $(LIBPYTHON_LIBS) \
-	-L.libs  -loidaglibext -loidadisass -loidagtkext			\
+chrysalide_LDFLAGS = $(LIBGTK_LIBS) -L/usr/X11R6/lib -ldl -lm $(LIBXML_LIBS) `pkg-config --libs gthread-2.0` $(LIBPYTHON_LIBS) \
+	-L.libs  -lchrysaglibext -lchrysadisass -lchrysagtkext -lchrysagui			\
 	-Lcommon/.libs -lcommon						\
 	-Lpanels/.libs -lpanels						\
 	-Lplugins/.libs -lplugins
 
 
-openida_LDADD = $(LIBINTL) 				\
-	dialogs/libdialogs.la 				\
-	gui/libgui.la
+chrysalide_LDADD = $(LIBINTL) 				\
+	dialogs/libdialogs.la
 
 
 
diff --git a/src/analysis/routine.c b/src/analysis/routine.c
index b4fc51f..7151fdc 100644
--- a/src/analysis/routine.c
+++ b/src/analysis/routine.c
@@ -744,7 +744,7 @@ char *_g_binary_routine_to_string(const GBinRoutine *routine, Routine2StringOpti
     {
         case RTT_CONSTRUCTOR:
             result = strdup(g_binary_routine_get_name(routine));
-            result = stradd(result, "::");
+            result = stradd(result, "." /* FIXME */);
             break;
 
         case RTT_DESTRUCTOR:
@@ -772,7 +772,7 @@ char *_g_binary_routine_to_string(const GBinRoutine *routine, Routine2StringOpti
         namespace = g_openida_type_to_string(routine->namespace);
 
         result = stradd(result, namespace);
-        result = stradd(result, "::");
+        result = stradd(result, "." /* FIXME */);
 
         free(namespace);
 
diff --git a/src/analysis/type.c b/src/analysis/type.c
index be49d98..d04e7ce 100644
--- a/src/analysis/type.c
+++ b/src/analysis/type.c
@@ -388,7 +388,7 @@ char *_g_openida_type_to_string(const GOpenidaType *type, bool simple)
     {
         namespace = g_openida_type_to_string(type->namespace);
 
-        result = strprep(result, "::");
+        result = strprep(result, "." /* FIXME */);
         result = strprep(result, namespace);
 
         free(namespace);
diff --git a/src/arch/instruction.c b/src/arch/instruction.c
index 2d1836b..240ffbe 100644
--- a/src/arch/instruction.c
+++ b/src/arch/instruction.c
@@ -586,6 +586,25 @@ size_t g_arch_instruction_get_destinations(const GArchInstruction *instr, GArchI
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : instr  = instruction d'assemblage à consulter.               *
+*                                                                             *
+*  Description : Fournit le nom humain de l'instruction manipulée.            *
+*                                                                             *
+*  Retour      : Mot clef de bas niveau.                                      *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+const char *g_arch_instruction_get_keyword(const GArchInstruction *instr)
+{
+    return instr->get_text(instr, NULL/* FIXME */, 0/* FIXME */);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : instr  = instruction d'assemblage à représenter.             *
 *                buffer = espace où placer ledit contenu.                     *
 *                syntax = type de représentation demandée.                    *
diff --git a/src/arch/instruction.h b/src/arch/instruction.h
index fd059a1..bf78bfd 100644
--- a/src/arch/instruction.h
+++ b/src/arch/instruction.h
@@ -118,6 +118,9 @@ size_t g_arch_instruction_get_destinations(const GArchInstruction *, GArchInstru
 /* --------------------- CONVERSIONS DU FORMAT DES INSTRUCTIONS --------------------- */
 
 
+/* Fournit le nom humain de l'instruction manipulée. */
+const char *g_arch_instruction_get_keyword(const GArchInstruction *);
+
 /* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */
 void g_arch_instruction_print(const GArchInstruction *, GCodeBuffer *, MemoryDataSize, const bin_t *, AsmSyntax);
 
diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am
index 24ba5e5..c0a03f0 100644
--- a/src/gui/Makefile.am
+++ b/src/gui/Makefile.am
@@ -8,8 +8,7 @@ libgui_la_SOURCES =						\
 libgui_la_LIBADD =						\
 	menus/libguimenus.la				\
 	panels/libguipanels.la				\
-	tb/libguitb.la						\
-	../dialogs/libdialogs.la
+	tb/libguitb.la
 
 libgui_la_LDFLAGS = 
 
diff --git a/src/gui/menus/Makefile.am b/src/gui/menus/Makefile.am
index 0f41d14..3aebdc0 100644
--- a/src/gui/menus/Makefile.am
+++ b/src/gui/menus/Makefile.am
@@ -12,7 +12,7 @@ libguimenus_la_SOURCES =				\
 
 libguimenus_la_LDFLAGS = 
 
-libguimenus_LIBADD = $(LIBINTL) 		\
+libguimenus_la_LIBADD = $(LIBINTL) 		\
 	../../dialogs/libdialogs.la
 
 
diff --git a/src/gui/panels/panel.c b/src/gui/panels/panel.c
index f70a1ab..dc6a89f 100644
--- a/src/gui/panels/panel.c
+++ b/src/gui/panels/panel.c
@@ -669,6 +669,4 @@ static void rebuild_panels_interface(const panel_node *current)
 
     }
 
-    //g_object_unref(G_OBJECT(widget));
-
 }
-- 
cgit v0.11.2-87-g4458