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 Estadisticas");
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 ver_estadisticas( art_get_lst()->fp );
428 if (strcmp(item_name(cur), opciones[1]) == 0) {
430 ver_estadisticas( fact_get_lst()->fp );
434 if (strcmp(item_name(cur), opciones[2]) == 0) {
436 ver_estadisticas( fact_get_lst()->fp_texto );
441 pos_menu_cursor(menu);
463 int c, salir, opcion;
475 items = (ITEM **)calloc(9, sizeof(ITEM *));
477 items[0] = new_item(opciones[0], "Alta,baja,consulta y modificacion de articulos.");
478 items[1] = new_item(opciones[1], "Alta,baja,consulta y modificacion de facturas.");
479 items[2] = new_item(opciones[2], "Ver registros/bloques de archivo Articulos.");
480 items[3] = new_item(opciones[3], "Ver registros/bloques de archivo Facturas.");
481 items[4] = new_item(opciones[4], "Ver registros/bloques de archivo Notas.");
482 items[5] = new_item(opciones[5], "Ver estadisticas de ocupacion de archivos.");
483 items[6] = new_item(opciones[6], "Tareas de mantenimiento de los archivos.");
484 items[7] = new_item(opciones[7], "Salir del sistema.");
487 menu = new_menu((ITEM **)items);
488 menu_win = newwin(14, COLS-2, 3, 1);
489 keypad(menu_win, TRUE);
490 set_menu_mark(menu, " > ");
491 set_menu_win(menu, menu_win);
492 set_menu_sub(menu, derwin(menu_win, 10, COLS-4, 3, 1));
495 mvwaddch(menu_win, 2, 0, ACS_LTEE);
496 mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
497 mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
498 wattron(menu_win, COLOR_PAIR(COLOR_RED));
499 mvwaddstr(menu_win, 1, 1, "Menu Principal");
500 wattroff(menu_win, COLOR_PAIR(COLOR_RED));
507 while((!salir) && (c = getch())) {
510 menu_driver(menu, REQ_DOWN_ITEM);
513 menu_driver(menu, REQ_UP_ITEM);
521 cur = current_item(menu);
523 if (strcmp(item_name(cur), opciones[i]) == 0)
526 pos_menu_cursor(menu);
552 static void finish(int sig)
556 /* do your non-curses wrapup here */
560 WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...)
566 va_start(ap, format);
567 vsprintf(txt, format, ap);
572 dialog = derwin(win, mh, mw, h/2-mh/2, w/2-mw/2);
574 mvwaddstr(dialog, 1, 1, txt);
580 void msg_box_free(WINDOW *padre, WINDOW *win)
589 void menu_mantenimiento()
591 WINDOW *menu_win, *dlg;
594 int c, salir, nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro;
596 "Compactar Articulos",
597 "Compactar Facturas",
599 "Cambiar tipo Archivo Articulos",
600 "Cambiar tipo Archivo Facturas",
601 "Cambiar tipo Archivo Notas",
605 items = (ITEM **)calloc(8, sizeof(ITEM *));
607 items[0] = new_item(opciones[0], "Elimina espacio no utilizado.");
608 items[1] = new_item(opciones[1], "Elimina espacio no utilizado.");
609 items[2] = new_item(opciones[2], "Elimina espacio no utilizado.");
610 items[3] = new_item(opciones[3], "Permite cambiar el tipo del archivo.");
611 items[4] = new_item(opciones[4], "Permite cambiar el tipo del archivo.");
612 items[5] = new_item(opciones[5], "Permite cambiar el tipo del archivo.");
613 items[6] = new_item(opciones[6], "Volver al menu anterior.");
616 menu = new_menu((ITEM **)items);
617 menu_win = newwin(12, COLS-2, 3, 1);
618 keypad(menu_win, TRUE);
619 set_menu_mark(menu, " > ");
620 set_menu_win(menu, menu_win);
621 set_menu_sub(menu, derwin(menu_win, 8, COLS-4, 3, 1));
624 mvwaddch(menu_win, 2, 0, ACS_LTEE);
625 mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
626 mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
627 wattron(menu_win, COLOR_PAIR(COLOR_RED));
628 mvwaddstr(menu_win, 1, 1, "Menu Mantenimiento");
629 wattroff(menu_win, COLOR_PAIR(COLOR_RED));
635 while((!salir) && (c = getch()) != KEY_F(3)) {
638 menu_driver(menu, REQ_DOWN_ITEM);
641 menu_driver(menu, REQ_UP_ITEM);
648 cur = current_item(menu);
649 if (strcmp(item_name(cur), opciones[6]) == 0) {
652 if (strcmp(item_name(cur), opciones[0]) == 0) {
653 art_get_lst()->fp->compactar(art_get_lst()->fp);
655 if (strcmp(item_name(cur), opciones[1]) == 0) {
656 fact_get_lst()->fp->compactar(fact_get_lst()->fp);
658 if (strcmp(item_name(cur), opciones[2]) == 0) {
659 fact_get_lst()->fp_texto->compactar(fact_get_lst()->fp_texto);
661 if (strcmp(item_name(cur), opciones[3]) == 0) {
663 nuevo_tam_registro = -1; /* No permito cambiar el tamaño de registro */
664 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
665 dlg = msg_box(stdscr, COLS, LINES, "Cambiando el formato de archivo .... Aguarde");
666 art_reformatear(nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro);
667 msg_box_free(stdscr, dlg);
671 if (strcmp(item_name(cur), opciones[4]) == 0) {
673 nuevo_tam_registro = 0;
674 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
678 if (strcmp(item_name(cur), opciones[5]) == 0) {
680 nuevo_tam_registro = -2;
681 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
703 void preguntar_nuevo_tipo(int *tipo, int *tam_bloque, int *tam_reg)
710 win = newwin(LINES/2, COLS/2, LINES/4, COLS/4);
713 form = form_crear(win);
714 form_agregar_widget(form, RADIO, "Tipo de archivo", 3, "T1,T2,T3");
715 form_ejecutar(form, 1,1);
717 s = form_obtener_valor_char(form, "Tipo de archivo");
718 if (strcmp(s, "T1") == 0) n = T1;
719 if (strcmp(s, "T2") == 0) n = T2;
720 if (strcmp(s, "T3") == 0) n = T3;
731 form = form_crear(win);
732 form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
735 form_set_valor(form, "Tamaño de bloque", "");
736 form_ejecutar(form, 1,1);
737 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
739 (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
745 if (((*tam_reg) != -1) && ((*tam_reg) != -2)) {
746 mvwaddstr(win, LINES/2-3, 1, "Nota: El tamaño de registro puede");
747 mvwaddstr(win, LINES/2-2, 1, "llegar a ser redondeado por el sistema.");
749 form = form_crear(win);
750 form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
751 if ((*tam_reg) != -1)
752 form_agregar_widget(form, INPUT, "Tamaño de registro", 8, "");
755 form_set_valor(form, "Tamaño de bloque", "");
756 if ((*tam_reg) != -1)
757 form_set_valor(form, "Tamaño de registro", "");
758 form_ejecutar(form, 1,1);
759 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
760 if ((*tam_reg) != -1) {
761 if (form_obtener_valor_int(form, "Tamaño de registro") > 0) is_ok = 1; else is_ok = 0;
764 (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
765 if ((*tam_reg) != -1)
766 (*tam_reg) = form_obtener_valor_int(form, "Tamaño de registro");
774 void ver_estadisticas(EMUFS *fp)
777 EMUFS_Estadisticas stats;
781 stats = fp->leer_estadisticas(fp);
783 win = newwin(LINES-4, COLS-2, 2, 1);
785 mvwaddstr(win, 1, 1, "Tipo de Archivo : ");
788 waddstr(win, "Registro long. variable con bloque parametrizado");
791 waddstr(win, "Registro long. variable sin bloques");
794 waddstr(win, "Registro long. fija con bloque parametrizado");
797 mvwaddstr(win, i++, 1, "Cant. Registros : ");
798 sprintf(s, "%lu", stats.tam_archivo);
801 mvwaddstr(win, i++, 1, "Tamaño de Archivo (bytes) : ");
802 sprintf(s, "%lu", stats.tam_archivo_bytes);
805 mvwaddstr(win, i++, 1, "Tamaño de Info de Control (bytes) : ");
806 sprintf(s, "%lu", stats.info_control);
809 mvwaddstr(win, i++, 1, "Media de espacio libre : ");
810 sprintf(s, "%lu", stats.media_fs);
813 mvwaddstr(win, i++, 1, "Espacio Libre : ");
814 sprintf(s, "%lu", stats.total_fs);
817 mvwaddstr(win, i++, 1, "Maximo de Espacio libre : ");
818 sprintf(s, "%lu", stats.max_fs);
821 mvwaddstr(win, i++, 1, "Minimo de Espacio libre : ");
822 sprintf(s, "%lu", stats.min_fs);
825 mvwaddstr(win, i++, 1, "Cantidad de bloques : ");
826 sprintf(s, "%lu", stats.cant_bloques);