diff options
Diffstat (limited to 'src/analysis/contents/encapsulated.c')
-rw-r--r-- | src/analysis/contents/encapsulated.c | 486 |
1 files changed, 283 insertions, 203 deletions
diff --git a/src/analysis/contents/encapsulated.c b/src/analysis/contents/encapsulated.c index 59b0c9e..e0e6ed1 100644 --- a/src/analysis/contents/encapsulated.c +++ b/src/analysis/contents/encapsulated.c @@ -28,31 +28,14 @@ #include <string.h> -#include "../content-int.h" +#include "encapsulated-int.h" +#include "../db/misc/rlestr.h" +#include "../storage/serialize-int.h" #include "../../common/extstr.h" -/* Contenu de issu d'un contenu plus global (instance) */ -struct _GEncapsContent -{ - GObject parent; /* A laisser en premier */ - - GBinContent *base; /* Base offrant une extraction */ - char *path; /* Chemin vers le contenu ciblé*/ - GBinContent *endpoint; /* Contenu ciblé */ - - char *full_desc; /* Description de l'ensemble */ - char *desc; /* Description de l'ensemble */ - -}; - -/* Contenu de issu d'un contenu plus global (classe) */ -struct _GEncapsContentClass -{ - GObjectClass parent; /* A laisser en premier */ - -}; +/* -------------------------- ENSEMBLE DE DONNEES BINAIRES -------------------------- */ /* Initialise la classe des contenus de données encapsulés. */ @@ -61,24 +44,29 @@ static void g_encaps_content_class_init(GEncapsContentClass *); /* Initialise une instance de contenu de données encapsulé. */ static void g_encaps_content_init(GEncapsContent *); -/* Procède à l'initialisation de l'interface de lecture. */ -static void g_encaps_content_interface_init(GBinContentInterface *); - /* Supprime toutes les références externes. */ static void g_encaps_content_dispose(GEncapsContent *); /* Procède à la libération totale de la mémoire. */ static void g_encaps_content_finalize(GEncapsContent *); + + +/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */ + + +/* Associe un ensemble d'attributs au contenu binaire. */ +static void g_encaps_content_set_attributes(GEncapsContent *, GContentAttributes *); + +/* Fournit l'ensemble des attributs associés à un contenu. */ +static GContentAttributes *g_encaps_content_get_attributes(const GEncapsContent *); + /* Donne l'origine d'un contenu binaire. */ static GBinContent *g_encaps_content_get_root(GEncapsContent *); /* Fournit le nom associé au contenu binaire. */ static char *g_encaps_content_describe(const GEncapsContent *, bool); -/* Ecrit une sauvegarde de contenu binaire dans un fichier XML. */ -static bool g_encaps_content_save(const GEncapsContent *, xmlDocPtr, xmlXPathContextPtr, const char *, const char *); - /* Fournit une empreinte unique (SHA256) pour les données. */ static void g_encaps_content_compute_checksum(GEncapsContent *, GChecksum *); @@ -121,11 +109,21 @@ static bool g_encaps_content_read_uleb128(const GEncapsContent *, vmpa2t *, uleb /* Lit un nombre signé encodé au format LEB128. */ static bool g_encaps_content_read_leb128(const GEncapsContent *, vmpa2t *, leb128_t *); +/* Charge un contenu depuis une mémoire tampon. */ +static bool g_encaps_content_load(GEncapsContent *, GObjectStorage *, packed_buffer_t *); + +/* Sauvegarde un contenu dans une mémoire tampon. */ +static bool g_encaps_content_store(const GEncapsContent *, GObjectStorage *, packed_buffer_t *); + + + +/* ---------------------------------------------------------------------------------- */ +/* ENSEMBLE DE DONNEES BINAIRES */ +/* ---------------------------------------------------------------------------------- */ /* Indique le type défini par la GLib pour les contenus encapsulés. */ -G_DEFINE_TYPE_WITH_CODE(GEncapsContent, g_encaps_content, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE(G_TYPE_BIN_CONTENT, g_encaps_content_interface_init)); +G_DEFINE_TYPE(GEncapsContent, g_encaps_content, G_TYPE_BIN_CONTENT); /****************************************************************************** @@ -143,12 +141,45 @@ G_DEFINE_TYPE_WITH_CODE(GEncapsContent, g_encaps_content, G_TYPE_OBJECT, static void g_encaps_content_class_init(GEncapsContentClass *klass) { GObjectClass *object; /* Autre version de la classe */ + GBinContentClass *content; /* Version parente de la classe*/ object = G_OBJECT_CLASS(klass); object->dispose = (GObjectFinalizeFunc/* ! */)g_encaps_content_dispose; object->finalize = (GObjectFinalizeFunc)g_encaps_content_finalize; + content = G_BIN_CONTENT_CLASS(klass); + + content->set_attribs = (set_content_attributes)g_encaps_content_set_attributes; + content->get_attribs = (get_content_attributes)g_encaps_content_get_attributes; + + content->get_root = (get_content_root_fc)g_encaps_content_get_root; + + content->describe = (describe_content_fc)g_encaps_content_describe; + + content->compute_checksum = (compute_checksum_fc)g_encaps_content_compute_checksum; + + content->compute_size = (compute_size_fc)g_encaps_content_compute_size; + content->compute_start_pos = (compute_start_pos_fc)g_encaps_content_compute_start_pos; + content->compute_end_pos = (compute_end_pos_fc)g_encaps_content_compute_end_pos; + + content->seek = (seek_fc)g_encaps_content_seek; + + content->get_raw_access = (get_raw_access_fc)g_encaps_content_get_raw_access; + + content->read_raw = (read_raw_fc)g_encaps_content_read_raw; + content->read_u4 = (read_u4_fc)g_encaps_content_read_u4; + content->read_u8 = (read_u8_fc)g_encaps_content_read_u8; + content->read_u16 = (read_u16_fc)g_encaps_content_read_u16; + content->read_u32 = (read_u32_fc)g_encaps_content_read_u32; + content->read_u64 = (read_u64_fc)g_encaps_content_read_u64; + + content->read_uleb128 = (read_uleb128_fc)g_encaps_content_read_uleb128; + content->read_leb128 = (read_leb128_fc)g_encaps_content_read_leb128; + + content->load = (load_content_cb)g_encaps_content_load; + content->store = (store_content_cb)g_encaps_content_store; + } @@ -178,49 +209,6 @@ static void g_encaps_content_init(GEncapsContent *content) /****************************************************************************** * * -* Paramètres : iface = interface GLib à initialiser. * -* * -* Description : Procède à l'initialisation de l'interface de lecture. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_encaps_content_interface_init(GBinContentInterface *iface) -{ - iface->get_root = (get_content_root_fc)g_encaps_content_get_root; - - iface->describe = (describe_content_fc)g_encaps_content_describe; - - iface->save = (save_content_fc)g_encaps_content_save; - - iface->compute_checksum = (compute_checksum_fc)g_encaps_content_compute_checksum; - - iface->compute_size = (compute_size_fc)g_encaps_content_compute_size; - iface->compute_start_pos = (compute_start_pos_fc)g_encaps_content_compute_start_pos; - iface->compute_end_pos = (compute_end_pos_fc)g_encaps_content_compute_end_pos; - - iface->seek = (seek_fc)g_encaps_content_seek; - - iface->get_raw_access = (get_raw_access_fc)g_encaps_content_get_raw_access; - - iface->read_raw = (read_raw_fc)g_encaps_content_read_raw; - iface->read_u4 = (read_u4_fc)g_encaps_content_read_u4; - iface->read_u8 = (read_u8_fc)g_encaps_content_read_u8; - iface->read_u16 = (read_u16_fc)g_encaps_content_read_u16; - iface->read_u32 = (read_u32_fc)g_encaps_content_read_u32; - iface->read_u64 = (read_u64_fc)g_encaps_content_read_u64; - - iface->read_uleb128 = (read_uleb128_fc)g_encaps_content_read_uleb128; - iface->read_leb128 = (read_leb128_fc)g_encaps_content_read_leb128; - -} - - -/****************************************************************************** -* * * Paramètres : content = instance d'objet GLib à traiter. * * * * Description : Supprime toutes les références externes. * @@ -283,122 +271,160 @@ static void g_encaps_content_finalize(GEncapsContent *content) GBinContent *g_encaps_content_new(GBinContent *base, const char *path, GBinContent *endpoint) { - GEncapsContent *result; /* Structure à retourner */ + GBinContent *result; /* Structure à retourner */ result = g_object_new(G_TYPE_ENCAPS_CONTENT, NULL); + if (!g_encaps_content_create(G_ENCAPS_CONTENT(result), base, path, endpoint)) + g_clear_object(&result); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : content = instance à initialiser pleinement. * +* base = contenu binaire d'où réaliser une extraction. * +* path = chemin vers le contenu finalement ciblé. * +* endpoint = contenu final rendu accessible. * +* * +* Description : Met en place un contenu de données brutes encapsulées. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_encaps_content_create(GEncapsContent *content, GBinContent *base, const char *path, GBinContent *endpoint) +{ + bool result; /* Bilan à retourner */ + g_object_ref(base); g_object_ref(endpoint); - result->base = base; - result->path = strdup(path); - result->endpoint = endpoint; + content->base = base; + content->path = strdup(path); + content->endpoint = endpoint; /* Description complète */ - result->full_desc = g_binary_content_describe(result->base, true); + content->full_desc = g_binary_content_describe(content->base, true); - result->full_desc = stradd(result->full_desc, G_DIR_SEPARATOR_S); + content->full_desc = stradd(content->full_desc, G_DIR_SEPARATOR_S); - result->full_desc = stradd(result->full_desc, path); + content->full_desc = stradd(content->full_desc, path); /* Description partielle */ - result->desc = strdup(path); + content->desc = strdup(path); + + result = true; - return G_BIN_CONTENT(result); + return result; } /****************************************************************************** * * -* Paramètres : context = contexte pour les recherches XPath. * -* path = chemin d'accès au noeud XML à lire. * -* base = référence au lieu d'enregistrement du projet. * +* Paramètres : content = contenu binaire à venir consulter. * * * -* Description : Charge en mémoire un contenu encapsulé à partir d'XML. * +* Description : Indique la base d'un contenu binaire encapsulé. * * * -* Retour : Adresse de la représentation ou NULL en cas d'échec. * +* Retour : Instance de contenu binaire ou NULL si aucune. * * * * Remarques : - * * * ******************************************************************************/ -GBinContent *g_encaps_content_new_from_xml(xmlXPathContextPtr context, const char *path, const char *base) +GBinContent *g_encaps_content_get_base(const GEncapsContent *content) { - GBinContent *result; /* Adresse à retourner */ - char *access; /* Chemin d'accès à un élément */ - GBinContent *original; /* Base offrant une extraction */ - char *target; /* Chemin vers le contenu ciblé*/ - GBinContent *endpoint; /* Contenu ciblé */ + GBinContent *result; /* Contenu binaire à renvoyer */ - result = NULL; + result = content->base; - /* Base de l'extraction */ + if (result != NULL) + g_object_ref(G_OBJECT(result)); - access = strdup(path); - access = stradd(access, "/Base"); + return result; - original = g_binary_content_new_from_xml(context, access, base); +} - free(access); - /* Référence au contenu encapsulé */ +/****************************************************************************** +* * +* Paramètres : content = contenu binaire à venir consulter. * +* * +* Description : Fournit le chemin vers le contenu interne représenté. * +* * +* Retour : Chemin d'accès au contenu binaire. * +* * +* Remarques : - * +* * +******************************************************************************/ - if (original != NULL) - { - access = strdup(path); - access = stradd(access, "/Path"); +const char *g_encaps_content_get_path(const GEncapsContent *content) +{ + char *result; /* Chemin d'accès à retourner */ - target = get_node_text_value(context, access); + result = content->path; - if (target != NULL) - { - endpoint = NULL;/// TODO + return result; - if (endpoint != NULL) - { - result = g_encaps_content_new(original, target, endpoint); - g_object_unref(G_OBJECT(endpoint)); - } +} - g_object_unref(G_OBJECT(original)); - } - else - g_object_unref(G_OBJECT(original)); +/****************************************************************************** +* * +* Paramètres : content = contenu binaire à venir consulter. * +* * +* Description : Indique le contenu binaire embarqué dans une encapsulation. * +* * +* Retour : Instance de contenu binaire ou NULL si aucune. * +* * +* Remarques : - * +* * +******************************************************************************/ +GBinContent *g_encaps_content_get_endpoint(const GEncapsContent *content) +{ + GBinContent *result; /* Contenu binaire à renvoyer */ - free(target); - free(access); + result = content->endpoint; - } + if (result != NULL) + g_object_ref(G_OBJECT(result)); return result; } + +/* ---------------------------------------------------------------------------------- */ +/* IMPLEMENTATION DES FONCTIONS DE CLASSE */ +/* ---------------------------------------------------------------------------------- */ + + /****************************************************************************** * * -* Paramètres : content = contenu binaire à consulter. * +* Paramètres : content = contenu binaire à actualiser. * +* attribs = jeu d'attributs à lier au contenu courant. * * * -* Description : Donne l'origine d'un contenu binaire. * +* Description : Associe un ensemble d'attributs au contenu binaire. * * * -* Retour : Contenu à l'origine du contenu courant. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -static GBinContent *g_encaps_content_get_root(GEncapsContent *content) +static void g_encaps_content_set_attributes(GEncapsContent *content, GContentAttributes *attribs) { - GBinContent *result; /* Contenu en place à renvoyer */ - - result = g_binary_content_get_root(content->base); - - return result; + g_binary_content_set_attributes(content->endpoint, attribs); } @@ -406,24 +432,20 @@ static GBinContent *g_encaps_content_get_root(GEncapsContent *content) /****************************************************************************** * * * Paramètres : content = contenu binaire à consulter. * -* full = précise s'il s'agit d'une version longue ou non. * * * -* Description : Fournit le nom associé au contenu binaire. * +* Description : Fournit l'ensemble des attributs associés à un contenu. * * * -* Retour : Nom de fichier avec chemin absolu au besoin. * +* Retour : Jeu d'attributs liés au contenu courant. * * * * Remarques : - * * * ******************************************************************************/ -static char *g_encaps_content_describe(const GEncapsContent *content, bool full) +static GContentAttributes *g_encaps_content_get_attributes(const GEncapsContent *content) { - char *result; /* Description à retourner */ + GContentAttributes *result; /* Instance à retourner */ - if (full) - result = strdup(content->full_desc); - else - result = strdup(content->desc); + result = g_binary_content_get_attributes(content->endpoint); return result; @@ -432,51 +454,48 @@ static char *g_encaps_content_describe(const GEncapsContent *content, bool full) /****************************************************************************** * * -* Paramètres : content = contenu binaire à traiter. * -* xdoc = structure XML en cours d'édition. * -* context = contexte à utiliser pour les recherches. * -* path = chemin d'accès réservé au binaire. * -* base = référence au lieu d'enregistrement du projet. * +* Paramètres : content = contenu binaire à consulter. * * * -* Description : Ecrit une sauvegarde de contenu binaire dans un fichier XML. * +* Description : Donne l'origine d'un contenu binaire. * * * -* Retour : true si l'opération a bien tourné, false sinon. * +* Retour : Contenu à l'origine du contenu courant. * * * * Remarques : - * * * ******************************************************************************/ -static bool g_encaps_content_save(const GEncapsContent *content, xmlDocPtr xdoc, xmlXPathContextPtr context, const char *path, const char *base) +static GBinContent *g_encaps_content_get_root(GEncapsContent *content) { - bool result; /* Bilan à faire remonter */ - char *access; /* Chemin d'accès à un élément */ - - /* Type */ - - result = add_string_attribute_to_node(xdoc, context, path, "type", "encaps"); - if (!result) goto gecs_exit; - - /* Base de l'extraction */ - - access = strdup(path); - access = stradd(access, "/Base"); - - result = g_binary_content_save(content->base, xdoc, context, access, base); + GBinContent *result; /* Contenu en place à renvoyer */ - free(access); + result = g_binary_content_get_root(content->base); - if (!result) goto gecs_exit; + return result; - /* Référence au contenu encapsulé */ +} - access = strdup(path); - access = stradd(access, "/Path"); - result = add_content_to_node(xdoc, context, access, content->path); +/****************************************************************************** +* * +* Paramètres : content = contenu binaire à consulter. * +* full = précise s'il s'agit d'une version longue ou non. * +* * +* Description : Fournit le nom associé au contenu binaire. * +* * +* Retour : Nom de fichier avec chemin absolu au besoin. * +* * +* Remarques : - * +* * +******************************************************************************/ - free(access); +static char *g_encaps_content_describe(const GEncapsContent *content, bool full) +{ + char *result; /* Description à retourner */ - gecs_exit: + if (full) + result = strdup(content->full_desc); + else + result = strdup(content->desc); return result; @@ -498,11 +517,11 @@ static bool g_encaps_content_save(const GEncapsContent *content, xmlDocPtr xdoc, static void g_encaps_content_compute_checksum(GEncapsContent *content, GChecksum *checksum) { - GBinContentIface *iface; /* Interface utilisée */ + GBinContentClass *class; /* Classe de l'instance */ - iface = G_BIN_CONTENT_GET_IFACE(content->endpoint); + class = G_BIN_CONTENT_GET_CLASS(content); - iface->compute_checksum(content->endpoint, checksum); + class->compute_checksum(content->endpoint, checksum); } @@ -828,47 +847,75 @@ static bool g_encaps_content_read_leb128(const GEncapsContent *content, vmpa2t * /****************************************************************************** * * -* Paramètres : content = contenu binaire à venir consulter. * +* Paramètres : content = élément GLib à constuire. * +* storage = conservateur de données à manipuler ou NULL. * +* pbuf = zone tampon à lire. * * * -* Description : Indique la base d'un contenu binaire encapsulé. * +* Description : Charge un contenu depuis une mémoire tampon. * * * -* Retour : Instance de contenu binaire ou NULL si aucune. * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -GBinContent *g_encaps_content_get_base(const GEncapsContent *content) +static bool g_encaps_content_load(GEncapsContent *content, GObjectStorage *storage, packed_buffer_t *pbuf) { - GBinContent *result; /* Contenu binaire à renvoyer */ + bool result; /* Bilan à retourner */ + rle_string str; /* Chaîne à charger */ - result = content->base; + content->base = G_BIN_CONTENT(g_object_storage_unpack_object(storage, "contents", pbuf)); + result = (content->base != NULL); - if (result != NULL) - g_object_ref(G_OBJECT(result)); + setup_empty_rle_string(&str); - return result; + if (result) + result = unpack_rle_string(&str, pbuf); -} + if (result) + { + result = (get_rle_string(&str) != NULL); + if (result) + content->path = strdup(get_rle_string(&str)); -/****************************************************************************** -* * -* Paramètres : content = contenu binaire à venir consulter. * -* * -* Description : Fournit le chemin vers le contenu interne représenté. * -* * -* Retour : Chemin d'accès au contenu binaire. * -* * -* Remarques : - * -* * -******************************************************************************/ + exit_rle_string(&str); -const char *g_encaps_content_get_path(const GEncapsContent *content) -{ - char *result; /* Chemin d'accès à retourner */ + } - result = content->path; + if (result) + { + content->endpoint = G_BIN_CONTENT(g_object_storage_unpack_object(storage, "contents", pbuf)); + result = (content->endpoint != NULL); + } + + if (result) + result = unpack_rle_string(&str, pbuf); + + if (result) + { + result = (get_rle_string(&str) != NULL); + + if (result) + content->full_desc = strdup(get_rle_string(&str)); + + exit_rle_string(&str); + + } + + if (result) + result = unpack_rle_string(&str, pbuf); + + if (result) + { + result = (get_rle_string(&str) != NULL); + + if (result) + content->desc = strdup(get_rle_string(&str)); + + exit_rle_string(&str); + + } return result; @@ -877,24 +924,57 @@ const char *g_encaps_content_get_path(const GEncapsContent *content) /****************************************************************************** * * -* Paramètres : content = contenu binaire à venir consulter. * +* Paramètres : content = élément GLib à consulter. * +* storage = conservateur de données à manipuler ou NULL. * +* pbuf = zone tampon à remplir. * * * -* Description : Indique le contenu binaire embarqué dans une encapsulation. * +* Description : Sauvegarde un contenu dans une mémoire tampon. * * * -* Retour : Instance de contenu binaire ou NULL si aucune. * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -GBinContent *g_encaps_content_get_endpoint(const GEncapsContent *content) +static bool g_encaps_content_store(const GEncapsContent *content, GObjectStorage *storage, packed_buffer_t *pbuf) { - GBinContent *result; /* Contenu binaire à renvoyer */ + bool result; /* Bilan à retourner */ + rle_string str; /* Chaîne à conserver */ - result = content->endpoint; + result = g_object_storage_pack_object(storage, "contents", G_SERIALIZABLE_OBJECT(content->base), pbuf); - if (result != NULL) - g_object_ref(G_OBJECT(result)); + if (result) + { + init_static_rle_string(&str, content->path); + + result = pack_rle_string(&str, pbuf); + + exit_rle_string(&str); + + } + + if (result) + result = g_object_storage_pack_object(storage, "contents", G_SERIALIZABLE_OBJECT(content->endpoint), pbuf); + + if (result) + { + init_static_rle_string(&str, content->full_desc); + + result = pack_rle_string(&str, pbuf); + + exit_rle_string(&str); + + } + + if (result) + { + init_static_rle_string(&str, content->desc); + + result = pack_rle_string(&str, pbuf); + + exit_rle_string(&str); + + } return result; |