From e46e38a30e735cac5618bbd2060ad96644475a02 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Tue, 10 Apr 2018 19:55:20 +0200
Subject: Provided a direct access to content data in the Python bindings.

---
 plugins/pychrysalide/analysis/content.c | 48 ++++++++++++++++++++++++++++++++-
 1 file changed, 47 insertions(+), 1 deletion(-)

diff --git a/plugins/pychrysalide/analysis/content.c b/plugins/pychrysalide/analysis/content.c
index 1f36eb8..05f1c74 100644
--- a/plugins/pychrysalide/analysis/content.c
+++ b/plugins/pychrysalide/analysis/content.c
@@ -61,6 +61,9 @@ static PyObject *py_binary_content_read_u32(PyObject *, PyObject *);
 /* Lit un nombre non signé sur huit octets. */
 static PyObject *py_binary_content_read_u64(PyObject *, PyObject *);
 
+/* Renvoie tout le contenu binaire d'un coup. */
+static PyObject *py_binary_content_get_all_bytes(PyObject *, void *);
+
 
 
 /******************************************************************************
@@ -144,7 +147,7 @@ static PyObject *py_binary_content_read_raw(PyObject *self, PyObject *args)
     vmpa2t *addr;                           /* Position interne associée   */
     unsigned long long length;              /* Quantité de données à lire  */
     int ret;                                /* Bilan de lecture des args.  */
-    const bin_t *val;                             /* Valeur lue à faire suivre   */
+    const bin_t *val;                       /* Valeur lue à faire suivre   */
 
     content = G_BIN_CONTENT(pygobject_get(self));
     assert(content != NULL);
@@ -357,6 +360,44 @@ static PyObject *py_binary_content_read_u64(PyObject *self, PyObject *args)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : self    = contenu binaire à manipuler.                       *
+*                closure = adresse non utilisée ici.                          *
+*                                                                             *
+*  Description : Renvoie tout le contenu binaire d'un coup.                   *
+*                                                                             *
+*  Retour      : Ensemble d'octets lus.                                       *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static PyObject *py_binary_content_get_all_bytes(PyObject *self, void *closure)
+{
+    PyObject *result;                       /* Contenu à retourner         */
+    GBinContent *content;                   /* Version GLib du format      */
+    vmpa2t start;                           /* Tête de lecture initiale    */
+    phys_t length;                          /* Nombre d'octets disponibles */
+    const bin_t *val;                       /* Valeur lue à faire suivre   */
+
+    content = G_BIN_CONTENT(pygobject_get(self));
+    assert(content != NULL);
+
+    init_vmpa(&start, 0, VMPA_NO_VIRTUAL);
+
+    length = g_binary_content_compute_size(content);
+
+    val = g_binary_content_get_raw_access(content, &start, length);
+    assert(val != NULL);
+
+    result = PyBytes_FromStringAndSize((char *)val, length);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : -                                                            *
 *                                                                             *
 *  Description : Fournit un accès à une définition de type à diffuser.        *
@@ -409,6 +450,11 @@ PyTypeObject *get_python_binary_content_type(void)
     };
 
     static PyGetSetDef py_binary_content_getseters[] = {
+        {
+            "data", py_binary_content_get_all_bytes, NULL,
+            "Provide all the content bytes at once.", NULL
+        },
+
         { NULL }
     };
 
-- 
cgit v0.11.2-87-g4458