10 #include "articulos.h"
13 #include "registros.h"
17 static void finish(int sig);
20 void menu_articulos();
22 void menu_mantenimiento();
23 void menu_estadisticas();
24 void preguntar_nuevo_tipo(int *tipo, int *tam_bloque, int *tam_reg);
26 void ver_estadisticas(EMUFS *fp);
28 /* cuadro de msg. w y h son de la ventana padre */
29 WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...);
30 void msg_box_free(WINDOW *padre, WINDOW *win);
32 typedef enum {PARAM_OK, SHOW_HELP, TIPO_NO_DEFINIDO, TIPO_INVALIDO, BLOQUE_NO_DEFINIDO} t_Param;
34 /* Verifica Argumentos */
35 t_Param param_ok(int argc, char *argv[])
38 for(i=1; i<argc; i++) {
39 if ((strcmp(argv[i], "-h")==0) || (strcmp(argv[i], "--help")==0)) return SHOW_HELP;
41 if (strcmp(argv[i]+strlen(argv[i])-3, "xml") == 0) {
42 /* Luego del archivo XML debe seguir el tipo */
45 if ((n < 1) || (n > 3)) return TIPO_INVALIDO;
46 if (((n == 1) || (n == 3)) && ((i+2)>=argc))
47 return BLOQUE_NO_DEFINIDO;
49 /* Ops, no hay mas parametros */
50 return TIPO_NO_DEFINIDO;
58 void print_help(char *s)
60 printf("EMUFS - 1v0\n");
61 printf("Modo de uso : %s [<archivo articulos XML> tipo=[1|2|3]]\n", s);
62 printf("\nSi especifica un archivo XML desde donde cargar los articulos debera tambien especificar el tipo");
63 printf(" de archivo a crear, siendo 1, 2, 3\n");
66 int main(int argc, char *argv[])
71 switch (param_ok(argc, argv)) {
75 case TIPO_NO_DEFINIDO:
76 printf("Falta parámetro requerido.\nLuego del nombre del archivo debe especificar el tipo de archivo\n");
78 case BLOQUE_NO_DEFINIDO:
79 printf("Falta parámetro requerido.\nLuego del tipo de archivo debe especificar el tamaño del bloque a utilizar\n");
82 printf("Tipo de archivo no valido. Los valores posibles para el tipo de archivo son:\n");
83 printf("\t1 - Archivo de bloque parametrizado y registro de long. variable.\n");
84 printf("\t2 - Archivo de registros variables sin bloques.\n");
85 printf("\t3 - Archivos de bloque parametrizado y registro de long. parametrizada.\n");
92 printf("CUIDADO! - Uds esta a punto de ejecutar EMUFS Gui compilado con mensajes de debug (-DDEBUG). ");
93 printf("Esto puede causar que ante un error alguna función trate de emitir un mensaje por pantalla ");
94 printf("haciendo que el aspecto visual se vea desvirtuado.\n\n");
95 printf("Todos los mensajes de error se envian por stderr, por lo que es conveniente que vuelva a ejecutar ");
96 printf("el programa de la siguiente manera :\n");
97 printf("\t#> %s <parametros> 2> error.log\n\n", argv[0]);
98 printf("De esta forma el SO se encargaga de redirigir stderr al archivo error.log y evitar algun problema en ");
99 printf("visualizacion de la aplicacion.\n");
100 printf("Para continuar **bajo su propio riesgo** presione una tecla. Puede cancelar la ejecucion en este punto con CTRL+C\n");
105 signal(SIGINT, finish);
107 keypad(stdscr, TRUE);
111 /* Si se soporta color, los inicializo */
114 /* Simple color assignment, often all we need. */
115 init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); /* COLOR_PAIR(1) */
116 init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK);
117 init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK);
118 init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK);
119 init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK);
120 init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK);
121 init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK);
122 init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK);
125 /* Verifico un tamaño minimo de consola */
126 if ((LINES < 25) || (COLS < 80)) {
128 printf("El tamaño de la consola debe ser de por lo menos 80x25!\n");
132 /* Ventana, caracter para linea vertical, caracter para linea horizontal*/
133 box(stdscr, ACS_VLINE, ACS_HLINE);
134 /* Ventana, Y, X, Texto */
135 mvwaddstr(stdscr, 1, 1, "EMUFS");
136 attron(COLOR_PAIR(2));
137 mvwaddstr(stdscr, LINES-2, 1, "EMUFS (c) The EMUFS Team - Bajo Licencia GNU/GPL");
138 attroff(COLOR_PAIR(2));
141 dialog = msg_box(stdscr, COLS, LINES, "Generando archivos ...");
143 art_cargar(argv[1], atoi(argv[2]), atoi(argv[3]));
144 if (!fact_cargar("facturas.xml", 1, 400))
145 fprintf(stderr, "ERROR CARGANDO FACTURAS\n");
147 art_cargar(NULL, -1, -1);
149 msg_box_free(stdscr, dialog);
151 /* CICLO PRINCIPAL DE LA APLICACION */
152 while ((c = main_menu()) != -1) {
161 dialog = derwin(stdscr, LINES-4, COLS-2, 2, 1);
162 ver_registros(dialog, COLS-2, LINES-4);
172 menu_mantenimiento();
202 items = (ITEM **)calloc(5, sizeof(ITEM *));
204 items[0] = new_item(opciones[0], "Crear una nueva factura.");
205 set_item_userptr(items[0], fact_agregar);
206 items[1] = new_item(opciones[1], "Eliminar una factura existente.");
207 set_item_userptr(items[1], fact_eliminar);
208 items[2] = new_item(opciones[2], "Modificar una factura existente.");
209 set_item_userptr(items[2], fact_modificar);
210 items[3] = new_item(opciones[3], "Volver al menu anterior.");
213 menu = new_menu((ITEM **)items);
214 menu_win = newwin(8, COLS-2, 3, 1);
215 keypad(menu_win, TRUE);
216 set_menu_mark(menu, " > ");
217 set_menu_win(menu, menu_win);
218 set_menu_sub(menu, derwin(menu_win, 5, COLS-4, 3, 1));
221 mvwaddch(menu_win, 2, 0, ACS_LTEE);
222 mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
223 mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
224 wattron(menu_win, COLOR_PAIR(COLOR_RED));
225 mvwaddstr(menu_win, 1, 1, "Menu Facturas");
226 wattroff(menu_win, COLOR_PAIR(COLOR_RED));
232 while((!salir) && (c = getch()) != KEY_F(3)) {
235 menu_driver(menu, REQ_DOWN_ITEM);
238 menu_driver(menu, REQ_UP_ITEM);
245 cur = current_item(menu);
246 if (strcmp(item_name(cur), opciones[3]) == 0) {
249 p = item_userptr(cur);
252 p(NULL); /* Paso NULL para que ejecute la accion por defecto */
255 mvwaddch(menu_win, 2, 0, ACS_LTEE);
256 mvwhline(menu_win, 2, 1, ACS_HLINE, 67);
257 mvwaddch(menu_win, 2, 67, ACS_RTEE);
260 pos_menu_cursor(menu);
277 void menu_articulos()
290 items = (ITEM **)calloc(5, sizeof(ITEM *));
292 items[0] = new_item(opciones[0], "Crear un nuevo articulo.");
293 set_item_userptr(items[0], art_agregar);
294 items[1] = new_item(opciones[1], "Eliminar un articulo existente.");
295 set_item_userptr(items[1], art_eliminar);
296 items[2] = new_item(opciones[2], "Modificar un articulo existente.");
297 set_item_userptr(items[2], art_modificar);
298 items[3] = new_item(opciones[3], "Volver al menu anterior.");
301 menu = new_menu((ITEM **)items);
302 menu_win = newwin(8, COLS-2, 3, 1);
303 keypad(menu_win, TRUE);
304 set_menu_mark(menu, " > ");
305 set_menu_win(menu, menu_win);
306 set_menu_sub(menu, derwin(menu_win, 5, COLS-4, 3, 1));
309 mvwaddch(menu_win, 2, 0, ACS_LTEE);
310 mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
311 mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
312 wattron(menu_win, COLOR_PAIR(COLOR_RED));
313 mvwaddstr(menu_win, 1, 1, "Menu Articulos");
314 wattroff(menu_win, COLOR_PAIR(COLOR_RED));
320 while((!salir) && (c = getch()) != KEY_F(3)) {
323 menu_driver(menu, REQ_DOWN_ITEM);
326 menu_driver(menu, REQ_UP_ITEM);
333 cur = current_item(menu);
334 if (strcmp(item_name(cur), opciones[3]) == 0) {
337 p = item_userptr(cur);
340 p(NULL); /* Paso NULL para que ejecute la accion por defecto */
343 mvwaddch(menu_win, 2, 0, ACS_LTEE);
344 mvwhline(menu_win, 2, 1, ACS_HLINE, 67);
345 mvwaddch(menu_win, 2, 67, ACS_RTEE);
348 pos_menu_cursor(menu);
365 void menu_estadisticas()
378 items = (ITEM **)calloc(5, sizeof(ITEM *));
380 items[0] = new_item(opciones[0], "Ver datos del archivo de Articulos.");
381 items[1] = new_item(opciones[1], "Ver datos del archivo de Facturas.");
382 items[2] = new_item(opciones[2], "Ver datos del archivo de Notas.");
383 items[3] = new_item(opciones[3], "Volver al menu anterior.");
386 menu = new_menu((ITEM **)items);
387 menu_win = newwin(8, COLS-2, 3, 1);
388 keypad(menu_win, TRUE);
389 set_menu_mark(menu, " > ");
390 set_menu_win(menu, menu_win);
391 set_menu_sub(menu, derwin(menu_win, 5, COLS-4, 3, 1));
394 mvwaddch(menu_win, 2, 0, ACS_LTEE);
395 mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
396 mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
397 wattron(menu_win, COLOR_PAIR(COLOR_RED));
398 mvwaddstr(menu_win, 1, 1, "Menu Articulos");
399 wattroff(menu_win, COLOR_PAIR(COLOR_RED));
405 while((!salir) && (c = getch()) != KEY_F(3)) {
408 menu_driver(menu, REQ_DOWN_ITEM);
411 menu_driver(menu, REQ_UP_ITEM);
418 cur = current_item(menu);
419 if (strcmp(item_name(cur), opciones[3]) == 0) {
422 if (strcmp(item_name(cur), opciones[0]) == 0) {
424 fprintf(stderr, "Muestro\n");
425 ver_estadisticas( art_get_lst()->fp );
429 if (strcmp(item_name(cur), opciones[1]) == 0) {
431 ver_estadisticas( fact_get_lst()->fp );
435 if (strcmp(item_name(cur), opciones[2]) == 0) {
437 ver_estadisticas( fact_get_lst()->fp_texto );
442 pos_menu_cursor(menu);
464 int c, salir, opcion;
476 items = (ITEM **)calloc(9, sizeof(ITEM *));
478 items[0] = new_item(opciones[0], "Alta,baja,consulta y modificacion de articulos.");
479 items[1] = new_item(opciones[1], "Alta,baja,consulta y modificacion de facturas.");
480 items[2] = new_item(opciones[2], "Ver registros/bloques de archivo Articulos.");
481 items[3] = new_item(opciones[3], "Ver registros/bloques de archivo Facturas.");
482 items[4] = new_item(opciones[4], "Ver registros/bloques de archivo Notas.");
483 items[5] = new_item(opciones[5], "Ver estadisticas de ocupacion de archivos.");
484 items[6] = new_item(opciones[6], "Tareas de mantenimiento de los archivos.");
485 items[7] = new_item(opciones[7], "Salir del sistema.");
488 menu = new_menu((ITEM **)items);
489 menu_win = newwin(14, COLS-2, 3, 1);
490 keypad(menu_win, TRUE);
491 set_menu_mark(menu, " > ");
492 set_menu_win(menu, menu_win);
493 set_menu_sub(menu, derwin(menu_win, 10, COLS-4, 3, 1));
496 mvwaddch(menu_win, 2, 0, ACS_LTEE);
497 mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
498 mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
499 wattron(menu_win, COLOR_PAIR(COLOR_RED));
500 mvwaddstr(menu_win, 1, 1, "Menu Principal");
501 wattroff(menu_win, COLOR_PAIR(COLOR_RED));
508 while((!salir) && (c = getch())) {
511 menu_driver(menu, REQ_DOWN_ITEM);
514 menu_driver(menu, REQ_UP_ITEM);
522 cur = current_item(menu);
524 if (strcmp(item_name(cur), opciones[i]) == 0)
527 pos_menu_cursor(menu);
553 static void finish(int sig)
557 /* do your non-curses wrapup here */
561 WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...)
567 va_start(ap, format);
568 vsprintf(txt, format, ap);
573 dialog = derwin(win, mh, mw, h/2-mh/2, w/2-mw/2);
575 mvwaddstr(dialog, 1, 1, txt);
581 void msg_box_free(WINDOW *padre, WINDOW *win)
590 void menu_mantenimiento()
592 WINDOW *menu_win, *dlg;
595 int c, salir, nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro;
597 "Compactar Articulos",
598 "Compactar Facturas",
600 "Cambiar tipo Archivo Articulos",
601 "Cambiar tipo Archivo Facturas",
602 "Cambiar tipo Archivo Notas",
606 items = (ITEM **)calloc(8, sizeof(ITEM *));
608 items[0] = new_item(opciones[0], "Elimina espacio no utilizado.");
609 items[1] = new_item(opciones[1], "Elimina espacio no utilizado.");
610 items[2] = new_item(opciones[2], "Elimina espacio no utilizado.");
611 items[3] = new_item(opciones[3], "Permite cambiar el tipo del archivo.");
612 items[4] = new_item(opciones[4], "Permite cambiar el tipo del archivo.");
613 items[5] = new_item(opciones[5], "Permite cambiar el tipo del archivo.");
614 items[6] = new_item(opciones[6], "Volver al menu anterior.");
617 menu = new_menu((ITEM **)items);
618 menu_win = newwin(12, COLS-2, 3, 1);
619 keypad(menu_win, TRUE);
620 set_menu_mark(menu, " > ");
621 set_menu_win(menu, menu_win);
622 set_menu_sub(menu, derwin(menu_win, 8, COLS-4, 3, 1));
625 mvwaddch(menu_win, 2, 0, ACS_LTEE);
626 mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
627 mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
628 wattron(menu_win, COLOR_PAIR(COLOR_RED));
629 mvwaddstr(menu_win, 1, 1, "Menu Mantenimiento");
630 wattroff(menu_win, COLOR_PAIR(COLOR_RED));
636 while((!salir) && (c = getch()) != KEY_F(3)) {
639 menu_driver(menu, REQ_DOWN_ITEM);
642 menu_driver(menu, REQ_UP_ITEM);
649 cur = current_item(menu);
650 if (strcmp(item_name(cur), opciones[6]) == 0) {
653 if (strcmp(item_name(cur), opciones[0]) == 0) {
654 art_get_lst()->fp->compactar(art_get_lst()->fp);
656 if (strcmp(item_name(cur), opciones[1]) == 0) {
657 fact_get_lst()->fp->compactar(fact_get_lst()->fp);
659 if (strcmp(item_name(cur), opciones[2]) == 0) {
660 fact_get_lst()->fp_texto->compactar(fact_get_lst()->fp_texto);
662 if (strcmp(item_name(cur), opciones[3]) == 0) {
664 nuevo_tam_registro = -1; /* No permito cambiar el tamaño de registro */
665 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
666 dlg = msg_box(stdscr, COLS, LINES, "Cambiando el formato de archivo .... Aguarde");
667 art_reformatear(nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro);
668 msg_box_free(stdscr, dlg);
672 if (strcmp(item_name(cur), opciones[4]) == 0) {
674 nuevo_tam_registro = 0;
675 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
679 if (strcmp(item_name(cur), opciones[5]) == 0) {
681 nuevo_tam_registro = -2;
682 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
704 void preguntar_nuevo_tipo(int *tipo, int *tam_bloque, int *tam_reg)
711 win = newwin(LINES/2, COLS/2, LINES/4, COLS/4);
714 form = form_crear(win);
715 form_agregar_widget(form, RADIO, "Tipo de archivo", 3, "T1,T2,T3");
716 form_ejecutar(form, 1,1);
718 s = form_obtener_valor_char(form, "Tipo de archivo");
719 if (strcmp(s, "T1") == 0) n = T1;
720 if (strcmp(s, "T2") == 0) n = T2;
721 if (strcmp(s, "T3") == 0) n = T3;
732 form = form_crear(win);
733 form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
736 form_set_valor(form, "Tamaño de bloque", "");
737 form_ejecutar(form, 1,1);
738 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
740 (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
746 if (((*tam_reg) != -1) && ((*tam_reg) != -2)) {
747 mvwaddstr(win, LINES/2-3, 1, "Nota: El tamaño de registro puede");
748 mvwaddstr(win, LINES/2-2, 1, "llegar a ser redondeado por el sistema.");
750 form = form_crear(win);
751 form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
752 if ((*tam_reg) != -1)
753 form_agregar_widget(form, INPUT, "Tamaño de registro", 8, "");
756 form_set_valor(form, "Tamaño de bloque", "");
757 if ((*tam_reg) != -1)
758 form_set_valor(form, "Tamaño de registro", "");
759 form_ejecutar(form, 1,1);
760 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
761 if ((*tam_reg) != -1) {
762 if (form_obtener_valor_int(form, "Tamaño de registro") > 0) is_ok = 1; else is_ok = 0;
765 (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
766 if ((*tam_reg) != -1)
767 (*tam_reg) = form_obtener_valor_int(form, "Tamaño de registro");
775 void ver_estadisticas(EMUFS *fp)
778 EMUFS_Estadisticas stats;
782 fprintf(stderr, "....! (%p)\n", fp->leer_estadisticas);
783 stats = fp->leer_estadisticas(fp);
784 fprintf(stderr, "Vamos que pasamos!\n");
786 win = newwin(LINES-4, COLS-2, 2, 1);
788 mvwaddstr(win, 1, 1, "Tipo de Archivo : ");
791 waddstr(win, "Registro long. variable con bloque parametrizado");
794 waddstr(win, "Registro long. variable sin bloques");
797 waddstr(win, "Registro long. fija con bloque parametrizado");
800 mvwaddstr(win, i++, 1, "Cant. Registros : ");
801 sprintf(s, "%lu", stats.tam_archivo);
804 mvwaddstr(win, i++, 1, "Tamaño de Archivo (bytes) : ");
805 sprintf(s, "%lu", stats.tam_archivo_bytes);
808 mvwaddstr(win, i++, 1, "Tamaño de Info de Control (bytes) : ");
809 sprintf(s, "%lu", stats.info_control);
812 mvwaddstr(win, i++, 1, "Media de espacio libre : ");
813 sprintf(s, "%lu", stats.media_fs);
816 mvwaddstr(win, i++, 1, "Espacio Libre : ");
817 sprintf(s, "%lu", stats.total_fs);
820 mvwaddstr(win, i++, 1, "Maximo de Espacio libre : ");
821 sprintf(s, "%lu", stats.max_fs);
824 mvwaddstr(win, i++, 1, "Minimo de Espacio libre : ");
825 sprintf(s, "%lu", stats.min_fs);
828 mvwaddstr(win, i++, 1, "Cantidad de bloques : ");
829 sprintf(s, "%lu", stats.cant_bloques);