diff options
Diffstat (limited to 'src/analysis/contents')
-rw-r--r-- | src/analysis/contents/file.c | 128 | ||||
-rw-r--r-- | src/analysis/contents/file.h | 3 |
2 files changed, 131 insertions, 0 deletions
diff --git a/src/analysis/contents/file.c b/src/analysis/contents/file.c index eb0d488..9f1c10c 100644 --- a/src/analysis/contents/file.c +++ b/src/analysis/contents/file.c @@ -27,12 +27,14 @@ #include <assert.h> #include <fcntl.h> #include <malloc.h> +#include <string.h> #include <unistd.h> #include <sys/mman.h> #include <sys/stat.h> #include "../content-int.h" +#include "../../common/extstr.h" @@ -41,6 +43,8 @@ struct _GFileContent { GObject parent; /* A laisser en premier */ + char *filename; /* Fichier chargé en mémoire */ + bin_t *data; /* Contenu binaire représenté */ mrange_t range; /* Couverture du binaire */ @@ -72,6 +76,12 @@ static void g_file_content_dispose(GFileContent *); /* Procède à la libération totale de la mémoire. */ static void g_file_content_finalize(GFileContent *); +/* Fournit le nom associé au contenu binaire. */ +static const char *g_file_content_describe(const GFileContent *, bool); + +/* Ecrit une sauvegarde de contenu binaire dans un fichier XML. */ +static bool g_file_content_save(const GFileContent *, xmlDocPtr, xmlXPathContextPtr, const char *); + /* Fournit une empreinte unique (SHA256) pour les données. */ static const gchar *g_file_content_get_checksum(GFileContent *); @@ -166,6 +176,10 @@ static void g_file_content_init(GFileContent *content) static void g_file_content_interface_init(GBinContentInterface *iface) { + iface->describe = (describe_content_fc)g_file_content_describe; + + iface->save = (save_content_fc)g_file_content_save; + iface->get_checksum = (get_checksum_fc)g_file_content_get_checksum; iface->compute_size = (compute_size_fc)g_file_content_compute_size; @@ -217,6 +231,8 @@ static void g_file_content_dispose(GFileContent *content) static void g_file_content_finalize(GFileContent *content) { + free(content->filename); + if (content->data != NULL) free(content->data); @@ -275,6 +291,8 @@ GBinContent *g_file_content_new(const char *filename) result = g_object_new(G_TYPE_FILE_CONTENT, NULL); + result->filename = strdup(filename); + result->data = (bin_t *)malloc(info.st_size); memcpy(result->data, content, info.st_size); @@ -295,6 +313,116 @@ GBinContent *g_file_content_new(const char *filename) /****************************************************************************** * * +* Paramètres : context = contexte pour les recherches XPath. * +* path = chemin d'accès au noeud XML à lire. * +* * +* Description : Charge en mémoire le contenu d'un fichier à partir d'XML. * +* * +* Retour : Adresse de la représentation ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBinContent *g_file_content_new_from_xml(xmlXPathContextPtr context, const char *path) +{ + GBinContent *result; /* Adresse à retourner */ + char *access; /* Chemin pour une sous-config.*/ + char *filename; /* Chemin du binaire à charger */ + + result = NULL; + + /* Chemin du fichier à retrouver */ + + access = strdup(path); + access = stradd(access, "/Filename"); + + filename = get_node_text_value(context, access); + + free(access); + + /* Chargement */ + + if (filename != NULL) + { + result = g_file_content_new(filename); + free(filename); + } + + return result; + +} + + +/****************************************************************************** +* * +* 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 : - * +* * +******************************************************************************/ + +static const char *g_file_content_describe(const GFileContent *content, bool full) +{ + const char *result; /* Description à retourner */ + + if (full) + result = content->filename; + else + result = strrchr(content->filename, G_DIR_SEPARATOR) + 1; + + return result; + +} + + +/****************************************************************************** +* * +* 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. * +* * +* Description : Ecrit une sauvegarde de contenu binaire dans un fichier XML. * +* * +* Retour : true si l'opération a bien tourné, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_file_content_save(const GFileContent *content, xmlDocPtr xdoc, xmlXPathContextPtr context, const char *path) +{ + bool result; /* Bilan à faire remonter */ + char *access; /* Chemin d'accès à un élément */ + + result = true; + + /* Type */ + + result &= add_string_attribute_to_node(xdoc, context, path, "type", "file"); + + /* Nom du fichier associé */ + + access = strdup(path); + access = stradd(access, "/Filename"); + + result &= add_content_to_node(xdoc, context, access, content->filename); + + free(access); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : content = contenu binaire à venir lire. * * * * Description : Fournit une empreinte unique (SHA256) pour les données. * diff --git a/src/analysis/contents/file.h b/src/analysis/contents/file.h index 2e3cfef..0985f6b 100644 --- a/src/analysis/contents/file.h +++ b/src/analysis/contents/file.h @@ -53,6 +53,9 @@ GType g_file_content_get_type(void); /* Charge en mémoire le contenu d'un fichier donné. */ GBinContent *g_file_content_new(const char *); +/* Charge en mémoire le contenu d'un fichier à partir d'XML. */ +GBinContent *g_file_content_new_from_xml(xmlXPathContextPtr, const char *); + #endif /* _ANALYSIS_CONTENTS_FILE_H */ |