]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
Lectura de opciones desde el XML
authorRicardo Markiewicz <gazer.arg@gmail.com>
Wed, 26 May 2004 17:53:02 +0000 (17:53 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Wed, 26 May 2004 17:53:02 +0000 (17:53 +0000)
emufs_gui/articulos.c
emufs_gui/articulos.h
emufs_gui/emufs_view.c
emufs_gui/facturas.c
emufs_gui/facturas.h
emufs_gui/gui.h

index 8d628f2d4d3008125db0719725ea7f6276a68d69..fd1d1fdbf8a5fe58fa7992cd8b806901e7fb5c11 100644 (file)
@@ -71,7 +71,7 @@ t_LstArticulos *art_get_lst()
        return lst_articulos;
 }
 
-t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque)
+t_LstArticulos *art_cargar(t_Parametros *param)
 {
        xmlDocPtr document;
        xmlNode *node, *inicio;
@@ -87,9 +87,9 @@ t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque)
        lst_articulos = tmp;
        tmp->primero = NULL;
 
-       if (filename != NULL) {
+       if (param != NULL) {
                PERR("Voy a crear desde un XML");
-               document = xmlReadFile(filename, "ISO-8859-1",0);
+               document = xmlReadFile(param->xml_art, "ISO-8859-1",0);
                if (document == NULL) {
                        free(tmp);
                        lst_articulos = NULL;
@@ -108,11 +108,8 @@ t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque)
                        }
                        node = node->next;
                }
-#ifdef DEBUG
-               fprintf(stderr, "Articulos : Tipo=%d Bloque=%d\n", tipo-1, tam_bloque);
-#endif
                /* Creo el FS */
-               tmp->fp = emufs_crear("articulos", tipo-1, tam_bloque, sizeof(t_Articulo));
+               tmp->fp = emufs_crear("articulos", param->tipo_arch_art, param->tam_bloque_art, sizeof(t_Articulo));
                /* Agrego los indices */
                PERR("Voy a agregar un indice");
                emufs_agregar_indice(tmp->fp, "presentacion", IND_EXAHUSTIVO, IND_B, IDX_STRING, STRUCT_OFFSET(un_articulo, presentacion), 512);
index d3b2a41fef546dadd7d2feda00be5717bb9185a7..bfaa5ee4a4df6f924af89641573ac1def1fb22cf 100644 (file)
@@ -6,6 +6,7 @@
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 #include <string.h>
+#include "gui.h"
 #include "form.h"
 #include "emufs.h"
 #include "common.h"
@@ -35,7 +36,7 @@ typedef struct _lista_articulos_ {
        EMUFS *fp; /* Filepointer al archivo donde estan los datos */
 } t_LstArticulos;
 
-t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_registro);
+t_LstArticulos *art_cargar(t_Parametros *param);
 int art_liberar(t_LstArticulos *l);
 t_Articulo *art_obtener(t_LstArticulos *, int numero, EMUFS_REG_ID *id);
 void art_agregar(char *);
index 2f48972bb1bb5df011f72bfb87bbc8cdb3551b7f..571193c7f8b1eb8a3228429cd3ff8067185d65ed 100644 (file)
@@ -42,111 +42,6 @@ typedef enum {
                NULL_BLOCK_FOUND    /* Tamaño de bloque <= 0!!! */
 } t_Param;
 
-struct _mis_param_ {
-       int xml_fact; /* Pos en argv  del archivo XML a usar para facturas */
-       int xml_art; /* Pos en argv del archivo XML a usar para articulos */
-       char tipo_arch_fact; /* Tipo de archivo para Facturas */
-       char tipo_arch_art; /* Tipo de archivo para Articulos */
-       char tipo_arch_nota;
-       EMUFS_BLOCK_SIZE tam_bloque_fact;
-       EMUFS_BLOCK_SIZE tam_bloque_art;
-       EMUFS_BLOCK_SIZE tam_bloque_nota;
-} parametros;
-
-/* Verifica Argumentos */
-t_Param param_ok(int argc, char *argv[])
-{
-       int n,i;
-       int file;
-       for(i=1; i<argc; i++) {
-               if ((strcmp(argv[i], "-h")==0) || (strcmp(argv[i], "--help")==0)) return SHOW_HELP;
-
-               if (strcmp(argv[i], "-a") == 0) { /* Articulos! */
-                       i++;
-                       if (i >= argc) return SHOW_HELP;
-                       if (strcmp(argv[i]+strlen(argv[i])-3, "xml") == 0) {
-                               /* Luego del archivo XML debe seguir el tipo */
-                               if ((i+1)<argc) {
-                                       n = atoi(argv[i+1]);
-                                       if ((n < 1) || (n > 3)) return TIPO_INVALIDO;
-                                       if (((n == 1) || (n == 3)) && ((i+2)>=argc))
-                                               return BLOQUE_NO_DEFINIDO;
-                                       parametros.tipo_arch_art = n;
-                                       if (n != 2) {
-                                               if ((i+2) >= argc) return NULL_BLOCK_FOUND;
-                                               parametros.tam_bloque_art = atoi(argv[i+2]);
-                                               if (parametros.tam_bloque_art <= 0) return NULL_BLOCK_FOUND;
-                                       }
-                                       parametros.xml_art = i;
-                               } else {
-                                       /* Ops, no hay mas parametros */
-                                       return TIPO_NO_DEFINIDO;
-                               }
-                       } else {
-                               return NO_ART_FILE;
-                       }
-               } /* Articulos */
-
-               if (strcmp(argv[i], "-f") == 0) { /* Facturas! */
-                       i++;
-                       if (i >= argc) return SHOW_HELP;
-                       if (strcmp(argv[i]+strlen(argv[i])-3, "xml") == 0) {
-                               /* Luego del archivo XML debe seguir el tipo */
-                               file = i;
-                               i++;
-                               if (i<argc) {
-                                       n = atoi(argv[i]);
-                                       if ((n < 1) || (n > 3)) return TIPO_INVALIDO;
-                                       if (((n == 1) || (n == 3)) && ((i+1)>=argc))
-                                               return BLOQUE_NO_DEFINIDO;
-                                       parametros.tipo_arch_fact = n;
-                                       i++;
-                                       switch (n) {
-                                               case 1:
-                                               case 3:
-                                                       parametros.tam_bloque_fact = atoi(argv[i]);
-                                                       if (parametros.tam_bloque_fact <= 0) return NULL_BLOCK_FOUND;
-                                                       i++;
-                                                       if (i >= argc) return SHOW_HELP;
-                                                       n = atoi(argv[i]);
-                                                       if ((n<1) || (n>3)) return SHOW_HELP;
-                                                       parametros.tipo_arch_nota = n;
-                                                       if (((n == 1) || (n == 3)) && ((i+1)>=argc))
-                                                               return SHOW_HELP;
-                                                       i++;
-                                                       if (n != 2) {
-                                                               parametros.tam_bloque_nota = atoi(argv[i]);
-                                                               if (parametros.tam_bloque_nota <= 0) return SHOW_HELP;
-                                                       }
-                                               break;
-                                               case 2:
-                                                       if (i >= argc) return SHOW_HELP;
-                                                       n = atoi(argv[i]);
-                                                       if ((n<1) || (n>3)) return SHOW_HELP;
-                                                       parametros.tipo_arch_nota = n;
-                                                       if (((n == 1) || (n == 3)) && ((i+1)>=argc))
-                                                               return SHOW_HELP;
-                                                       i++;
-                                                       if (n != 2) {
-                                                               parametros.tam_bloque_nota = atoi(argv[i]);
-                                                               if (parametros.tam_bloque_nota <= 0) return SHOW_HELP;
-                                                       }
-                                       }
-                                       PERR("ACA");
-                                       parametros.xml_fact = file;
-                               } else {
-                                       /* Ops, no hay mas parametros */
-                                       return TIPO_NO_DEFINIDO;
-                               }
-                       } else {
-                               return NO_FACT_FILE;
-                       }
-               } /* Facturas */
-               
-       }
-       return PARAM_OK;
-}
-
 void print_help(char *s)
 {
        printf("EMUFS - 1v0\n");
@@ -162,40 +57,109 @@ void print_help(char *s)
        printf("  tamaño bloque debe ser especificado solo en aquellos tipos que lo requiera.\n");
 }
 
+void leer_param_art(t_Parametros *param, xmlNode *padre)
+{
+       xmlNode *node;
+       char *tmp;
+       node = padre->children;
+       while (node) {
+               if (node->type == XML_ELEMENT_NODE) {
+                       if (strcmp(node->name, "fuente")==0) {
+                               strcpy(param->xml_art, XML_GET_CONTENT(node->children));
+                       } else if (strcmp(node->name, "datos")==0) {
+                               tmp = xml_get_prop(node, "tipo");
+                               param->tipo_arch_art = atoi(tmp)-1;
+                               free(tmp);
+                               tmp = xml_get_prop(node, "bloque");
+                               param->tam_bloque_art = atoi(tmp);
+                               free(tmp);
+                       }
+               }
+               node = node->next;
+       }
+}
+
+void leer_param_fac(t_Parametros *param, xmlNode *padre)
+{
+       xmlNode *nodo;
+       char *tmp;
+       nodo = padre->children;
+       while (nodo) {
+               if (nodo->type == XML_ELEMENT_NODE) {
+                       if (strcmp(nodo->name, "fuente")==0) {
+                               strcpy(param->xml_fact, XML_GET_CONTENT(nodo->children));
+                       } else if (strcmp(nodo->name, "datos")==0) {
+                               tmp = xml_get_prop(nodo, "tipo");
+                               param->tipo_arch_fact = atoi(tmp)-1;
+                               free(tmp);
+                               tmp = xml_get_prop(nodo, "bloque");
+                               param->tam_bloque_fact = atoi(tmp);
+                               free(tmp);
+                       } else if (strcmp(nodo->name, "datos_notas")==0) {
+                               tmp = xml_get_prop(nodo, "tipo");
+                               param->tipo_arch_nota = atoi(tmp)-1;
+                               free(tmp);
+                               tmp = xml_get_prop(nodo, "bloque");
+                               param->tam_bloque_nota = atoi(tmp);
+                               free(tmp);
+                       }
+               }
+               nodo = nodo->next;
+       }
+}
+
+void param_xml(char *s, t_Parametros *param)
+{
+       xmlDocPtr document;
+       xmlNode *node, *inicio;
+
+       document = xmlReadFile(s, NULL,0);
+       if (document == NULL) {
+               return;
+       }
+       inicio = NULL;
+       node = xmlDocGetRootElement(document);
+       /* Busco el TAG principal "EMUFS" */
+       while (node) {
+               if (node->type == XML_ELEMENT_NODE) {
+                       PERR(node->name);
+                       if (strcmp(node->name, "emufs") == 0) {
+                               inicio = node->children;
+                               break;
+                       }
+               }
+               node = node->next;
+       }
+       if (inicio == NULL) {
+                       PERR("NO ENCONTRE TAG PRINCIPAL");
+                       xmlFreeDoc(document);
+                       xmlCleanupParser();
+                       return;
+       }
+
+       node = inicio;
+       while (node) {
+               if (node->type == XML_ELEMENT_NODE) {
+                       if (strcmp(node->name, "articulos")==0) {
+                               leer_param_art(param, node);
+                       } else if (strcmp(node->name, "facturas")==0) {
+                               leer_param_fac(param, node);
+                       }
+               }
+               node = node->next;
+       }
+}
+
 int main(int argc, char *argv[])
 {
-       int fin=0;
        WINDOW *dialog;
+       t_Parametros parametros;
 
-       parametros.xml_art = parametros.xml_fact = -1;
-       switch (param_ok(argc, argv)) {
-               case SHOW_HELP:
-                       print_help(argv[0]);
-                       return 0;
-               case TIPO_NO_DEFINIDO:
-                       printf("Falta parámetro requerido.\nLuego del nombre del archivo debe especificar el tipo de archivo\n");
-                       return 1;
-               case BLOQUE_NO_DEFINIDO:
-                       printf("Falta parámetro requerido.\nLuego del tipo de archivo debe especificar el tamaño del bloque a utilizar\n");
-                       return 1;
-               case TIPO_INVALIDO:
-                       printf("Tipo de archivo no valido. Los valores posibles para el tipo de archivo son:\n");
-                       printf("\t1 - Archivo de bloque parametrizado y registro de long. variable.\n");
-                       printf("\t2 - Archivo de registros variables sin bloques.\n");
-                       printf("\t3 - Archivos de bloque parametrizado y registro de long. parametrizada.\n");
-                       return 2;
-               case NO_ART_FILE:
-                       printf("Falta parámetro requerido.\nHa utilizado el modificador -a para crear los articulos a partir de un XML pero no ha especificado ningún archivo XML.\n");
-                       return 3;
-               case NO_FACT_FILE:
-                       printf("Falta parámetro requerido.\nHa utilizado el modificador -f para crear las facturas a partir de un XML pero no ha especificado ningún archivo XML.\n");
-                       return 3;
-               case NULL_BLOCK_FOUND:
-                       printf("Error de parámerto.\nHa ingresado un valor nulo como tamaño de bloque.\n");
-                       return 4;
-               case PARAM_OK:
-                       fin = 0;
+       if (argc != 2) {
+               print_help(argv[0]);
        }
+       
+       param_xml(argv[1], &parametros);
 
 #ifdef DEBUG
        printf("CUIDADO! - Uds esta a punto de ejecutar EMUFS Gui compilado con mensajes de debug (-DDEBUG). ");
@@ -249,22 +213,16 @@ int main(int argc, char *argv[])
 
        dialog = msg_box(stdscr, COLS, LINES, "Generando archivos ...");
 
-       if (parametros.xml_art != -1) {
-               art_cargar(argv[parametros.xml_art], parametros.tipo_arch_art, parametros.tam_bloque_art);
-       } else {
-               art_cargar(NULL, -1, -1);
-       }
-       if (parametros.xml_fact != -1) {
-               fact_cargar(
-                                       argv[parametros.xml_fact],
-                                       parametros.tipo_arch_fact,
-                                       parametros.tam_bloque_fact,
-                                       parametros.tipo_arch_nota,
-                                       parametros.tam_bloque_nota
-               );
-       } else {
-               fact_cargar(NULL, -1, -1, -1, -1);
+/*     if (parametros.xml_art != -1) {*/
+               art_cargar(&parametros);
+/*     } else {
+               art_cargar(NULL);
        }
+       if (parametros.xml_fact != -1) {*/
+               fact_cargar(&parametros);
+/*     } else {
+               fact_cargar(NULL);
+       }*/
 
        msg_box_free(stdscr, dialog);
 
index e06fbe3ac353da9f34e6c952ea2a1ba580dcf55f..f1ce517e9bf71181859da6bc2a098559c6e6079f 100644 (file)
@@ -180,7 +180,7 @@ char *leer_nota(xmlNode *node, int max)
 }
 
 
-t_LstFacturas *fact_cargar(const char *filename, int tipo, int tam_bloque, int tipo_nota, int bloque_nota)
+t_LstFacturas *fact_cargar(t_Parametros *param)
 {
        xmlDocPtr document;
        xmlNode *node, *inicio;
@@ -198,9 +198,10 @@ t_LstFacturas *fact_cargar(const char *filename, int tipo, int tam_bloque, int t
        lst_facturas = tmp;
        tmp->primero = NULL;
 
-       if (filename != NULL) {
+       if (param != NULL) {
                PERR("Voy a cargar de un XML");
-               document = xmlReadFile(filename, "ISO-8859-1",0);
+               PERR(param->xml_fact);
+               document = xmlReadFile(param->xml_fact, "ISO-8859-1",0);
                if (document == NULL) {
                        PERR("Error al leer documento!!");
                        free(tmp);
@@ -224,16 +225,16 @@ t_LstFacturas *fact_cargar(const char *filename, int tipo, int tam_bloque, int t
                /* En el registro no guardo los punteros de nota ni items. Si guardo la cantidad de items
                 * y los items al final del registro.
                 */
-               if ((tipo-1) == T3) {
+               if ((param->tipo_arch_fact) == T3) {
                        /* Limito a 10 items en el caso de registro constante! */
                        cant_items = 10;
                } else {
                        cant_items = 0;
                }
-               tmp->fp = emufs_crear("facturas", tipo-1, tam_bloque, sizeof(t_Factura)-sizeof(char *)-sizeof(t_Item*)+cant_items*sizeof(t_Item));
+               tmp->fp = emufs_crear("facturas", param->tipo_arch_fact, param->tam_bloque_fact, sizeof(t_Factura)-sizeof(char *)-sizeof(t_Item*)+cant_items*sizeof(t_Item));
                emufs_agregar_indice(tmp->fp, "emision", IND_EXAHUSTIVO, IND_B, IDX_STRING, STRUCT_OFFSET(factura, emision), 512);
                emufs_agregar_indice(tmp->fp, "numero", IND_PRIMARIO, IND_B, IDX_INT, 0, 512);
-               tmp->fp_texto = emufs_crear("notas", tipo_nota-1, bloque_nota, 100);
+               tmp->fp_texto = emufs_crear("notas", param->tipo_arch_nota, param->tam_bloque_nota, 100);
                for (node=inicio ; node ; node = node->next) {
                        if (node->type == XML_ELEMENT_NODE) {
                                if (strcmp(node->name, "FACTURA") == 0) {
@@ -260,11 +261,11 @@ t_LstFacturas *fact_cargar(const char *filename, int tipo, int tam_bloque, int t
                                        strncpy(fact.cheque, prop = xml_get_prop(node, "NroCheque"), 18); xmlFree(prop);
                                        fact.cheque[18] = '\0';
 
-                                       fact.nota = leer_nota(node, (((tipo-1)==T3)?100:-1));
-                                       fact.items = leer_items(node, &fact.cant_items, ((tipo-1)==T3)?10:-1);
+                                       fact.nota = leer_nota(node, ((param->tipo_arch_nota==T3)?100:-1));
+                                       fact.items = leer_items(node, &fact.cant_items, (param->tipo_arch_fact==T3)?10:-1);
 
                                        error = 0;
-                                       id = tmp->fp_texto->grabar_registro(tmp->fp_texto, fact.nota, ((tipo-1)==T3)?100:(strlen(fact.nota)+1), &error);
+                                       id = tmp->fp_texto->grabar_registro(tmp->fp_texto, fact.nota, (param->tipo_arch_nota==T3)?100:(strlen(fact.nota)+1), &error);
                                        fact.reg_nota = id;
                                        save = procesar_guardar_factura(&fact, lst_facturas, &size);
                                        if (save != NULL) {
index 3db27a6c86403ee24331d86adbb61f745947d159..dee84211540eb625785c2bb742d64df526a6dc72 100644 (file)
@@ -12,6 +12,7 @@
 #include <curses.h>
 #include <libxml/tree.h>
 #include <libxml/parser.h>
+#include "gui.h"
 
 typedef struct _t_item_ {
        int numero;
@@ -54,7 +55,7 @@ typedef struct _lista_facturas_ {
  *
  *  \param filename Si es NULL trata de abrir un archivo existente, si no cargar el XML pasado
  */
-t_LstFacturas *fact_cargar(const char *filename, int tipo, int tam_bloque, int tipo_nota, int bloque_nota);
+t_LstFacturas *fact_cargar(t_Parametros *param);
 
 /** Elimina toda la memoria utilizada por las facturas */
 int fact_liberar(t_LstFacturas *l);
index b2ad520b523b02dfbeb5823a8ac7e832f0284972..05f4d70fd0fe979bbe5b1c46f84f6124f3cabdb4 100644 (file)
@@ -27,5 +27,26 @@ WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...);
 /** Libera un dialogo creado */
 void msg_box_free(WINDOW *padre, WINDOW *win);
 
+typedef struct _param_idx_ {
+       int tipo_arbol;
+       long int tam_bloque;
+} parametro_indice;
+
+typedef struct _mis_param_ {
+       char xml_fact[100];
+       char xml_art[100];
+       char tipo_arch_fact;
+       char tipo_arch_art;
+       char tipo_arch_nota;
+       long int tam_bloque_fact;
+       long int  tam_bloque_art;
+       long int tam_bloque_nota;
+
+       /* 0 = codigo, 1=desc, 2=presentacion */
+       parametro_indice ind_art[3];
+       /* 0 = numero, 1=emision */
+       parametro_indice ind_fac[2];
+} t_Parametros;
+
 #endif