summaryrefslogtreecommitdiff
path: root/src/binary.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/binary.c')
-rw-r--r--src/binary.c227
1 files changed, 227 insertions, 0 deletions
diff --git a/src/binary.c b/src/binary.c
index 1bc87cb..8de0bdb 100644
--- a/src/binary.c
+++ b/src/binary.c
@@ -26,6 +26,7 @@
#include <fcntl.h>
#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>
@@ -48,6 +49,13 @@
extern bool find_line_info(const uint8_t *content, off_t *size);
+
+/* Charge en mémoire le contenu d'un fichier à partir d'XML. */
+openida_binary *load_binary_file_from_xml(xmlXPathObjectPtr);
+
+
+
+
/* Charge en mémoire le contenu d'un fichier. */
uint8_t *map_binary_file(const char *, size_t *);
@@ -55,6 +63,225 @@ uint8_t *map_binary_file(const char *, size_t *);
+/* Description d'un fichier binaire */
+struct _openida_binary
+{
+ char *filename; /* Fichier chargé en mémoire */
+
+
+};
+
+
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : filename = nom du fichier à charger. *
+* *
+* Description : Charge en mémoire le contenu d'un fichier. *
+* *
+* Retour : Adresse de la représentation ou NULL en cas d'échec. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+openida_binary *load_binary_file(const char *filename)
+{
+ openida_binary *result; /* Adresse à retourner */
+
+ result = (openida_binary *)calloc(1, sizeof(openida_binary));
+
+ result->filename = strdup(filename);
+
+
+
+
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : xpathObj = point de lecture de tous les éléments. *
+* *
+* 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 : - *
+* *
+******************************************************************************/
+
+openida_binary *load_binary_file_from_xml(xmlXPathObjectPtr xpathObj)
+{
+ openida_binary *result; /* Adresse à retourner */
+
+ int i;
+
+ result = (openida_binary *)calloc(1, sizeof(openida_binary));
+
+ for (i = 0; i < XPATH_OBJ_NODES_COUNT(xpathObj); i++)
+ if (xmlStrEqual(NODE_FROM_PATH_OBJ(xpathObj, i)->name, BAD_CAST "Filename"))
+ result->filename = qck_get_node_text_value(NODE_FROM_PATH_OBJ(xpathObj, i));
+
+
+
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : binary = élément binaire à supprimer de la mémoire. *
+* *
+* Description : Décharge de la mémoire le contenu d'un fichier. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void unload_binary_file(openida_binary *binary)
+{
+ free(binary->filename);
+
+ free(binary);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : binary = élément binaire à traiter. *
+* *
+* Description : Fournit une description humaine d'un élément binaire. *
+* *
+* Retour : Chaîne de caractères humainenement lisible de représentation.*
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const char *openida_binary_to_string(const openida_binary *binary)
+{
+ return binary->filename;
+
+}
+
+
+
+
+
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : xpathCtx = contexte à utiliser pour mener les parcours. *
+* base = première partie de l'expression XPath d'accès. *
+* index = indice de la élément dans la liste des voisins. *
+* *
+* Description : Lit un élément binaire depuis un fichier XML. *
+* *
+* Retour : Représentation mise en place à libérer de la mémoire. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+openida_binary *read_openida_binary_from_xml(xmlXPathContextPtr xpathCtx, const char *base, unsigned int index)
+{
+ openida_binary *result; /* Représentation à retourner */
+ size_t expr_len; /* Taille d'une expression */
+ char *expr; /* Chemin XPath reconstitué */
+ xmlXPathObjectPtr xpathObj; /* Cible d'une recherche */
+ char *value; /* Type d'élément rencontré */
+ size_t sub_expr_len; /* Taille d'une expression #2 */
+ char *sub_expr; /* Chemin XPath reconstitué #2 */
+ int i; /* Boucle de parcours */
+
+ result = NULL;
+
+ /* S'occupe en premier lieu du niveau courant */
+
+ expr_len = strlen(base) + strlen("/*[position()=") + strlen("4294967295") /* UINT_MAX */ + strlen("]") + 1;
+
+ expr = (char *)calloc(expr_len, sizeof(char));
+ snprintf(expr, expr_len, "%s/*[position()=%u]", base, index);
+
+ xpathObj = get_node_xpath_object(xpathCtx, expr);
+
+ value = qck_get_node_prop_value(NODE_FROM_PATH_OBJ(xpathObj, 0), "type");
+
+ xmlXPathFreeObject(xpathObj);
+
+ if (value == NULL) goto robfx_err1;
+
+ /* Raffinement au second passage */
+
+ sub_expr_len = expr_len + strlen("/*");
+ sub_expr = (char *)calloc(sub_expr_len, sizeof(char));
+ snprintf(sub_expr, sub_expr_len, "%s/*", expr);
+
+ xpathObj = get_node_xpath_object(xpathCtx, sub_expr);
+
+ if (strcmp(value, "file") == 0) result = load_binary_file_from_xml(xpathObj);
+
+ xmlXPathFreeObject(xpathObj);
+
+ free(sub_expr);
+
+ robfx_err1:
+
+ free(expr);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : binary = élément binaire à traiter. *
+* writer = rédacteur dédié à l'écriture. *
+* *
+* Description : Ecrit une sauvegarde du binaire dans un fichier XML. *
+* *
+* Retour : true si l'opération a bien tourné, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool write_openida_binary_to_xml(const openida_binary *binary, xmlTextWriterPtr writer)
+{
+ bool result; /* Bilan à faire remonter */
+
+ result = open_xml_element(writer, "Binary");
+
+ result &= write_xml_attribute(writer, "type", "file");
+
+ result &= write_xml_element_with_content(writer, "Filename", "%s", binary->filename);
+
+ result &= close_xml_element(writer);
+
+ return result;
+
+}
+
+
+
+
+
/******************************************************************************
* *
* Paramètres : filename = nom du fichier à charger. *