From c4cf066956da0754d3383e60a6ff9f4e7abc9bca Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Sun, 13 Mar 2011 21:43:30 +0000 Subject: Début du codage de la partie ncurses. Suppression des printf de debug qui pollue l'écran. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///var/svn/2011-ddhardrescue/trunk@13 d3078510-dda0-49f1-841c-895ef4b7ec81 --- inc/utils.h | 3 ++- src/ddhardrescue.c | 46 ++++++++++++++++++++++++++-------- src/essais/test2.c | 3 ++- src/recover.c | 6 ++--- src/utils.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 116 insertions(+), 15 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index c045b83..0149aaf 100755 --- a/inc/utils.h +++ b/inc/utils.h @@ -1,6 +1,7 @@ #ifndef UTILS_H #define UTILS_H +#include #include "slices.h" struct progArgs { @@ -9,7 +10,7 @@ struct progArgs { }; int parseArgs(int argc, char **argv, struct progArgs *args); - void usage(char *progname); +int cursesInit(WINDOW *wins[], PANEL *panels[], int count); #endif /*UTILS_H*/ diff --git a/src/ddhardrescue.c b/src/ddhardrescue.c index 9f355b3..de89c26 100644 --- a/src/ddhardrescue.c +++ b/src/ddhardrescue.c @@ -4,7 +4,7 @@ #include #include #include - + #include "slices_evt.h" #include "recover.h" #include "utils.h" @@ -24,15 +24,17 @@ void sigHookAbrt() { end=1; } -//TODO : remove that when procViewer is done +/*TODO : remove that when procViewer is done void dumper(slices_evt_t *slicesEvt, slice_t *modifiedSlice) { address_t blockSize=0; char *dump; - dump=slicesDump(slicesEvt->data, &blockSize, 1000, 0, 21474836480ULL); + dump=slicesDump(slicesEvt->data, &blockSize, 3000, 0, 21474836480ULL); + system("clear"); puts(dump); free(dump); } +*/ void *procWorker(void *a); void *procViewer(void *a); @@ -40,7 +42,7 @@ void *procViewer(void *a); int main(int argc, char **argv) { // System structures struct sigaction sa; - pthread_t tWorker, tViewer; + pthread_t tWorker; // Main data structures slices_evt_t slices; @@ -74,7 +76,7 @@ int main(int argc, char **argv) { // Data structure initialization memset(&slices, 0, sizeof(slices)); slices.data=slicesNewSingleton(args.beginSector, args.endSector, S_UNKNOWN); - slices.eventListener=dumper; +// slices.eventListener=dumper; res=pthread_mutex_init(&(slices.mutex), NULL); if (res!=0) { return 3; @@ -90,14 +92,11 @@ int main(int argc, char **argv) { return 4; } - res=pthread_create(&tViewer, NULL, procViewer, &tArgs); - if (res!=0) { - return 5; - } + // Ncurses interface run in the main thread + (void) procViewer((void*)&tArgs); // Thread join point (void) pthread_join(tWorker, NULL); - (void) pthread_join(tViewer, NULL); /*Final dump of datas address_t blockSize=0; @@ -138,7 +137,34 @@ void * procWorker(void *a) { return a; } +#define CURSESWIN_COUNT 3 void *procViewer(void *a) { + WINDOW *wins[CURSESWIN_COUNT]; + PANEL *panels[CURSESWIN_COUNT]; + int ch; + //struct threadArgs *tArgs = (struct threadArgs *)a; + + cursesInit(wins, panels, CURSESWIN_COUNT); + + /* Show it on the screen */ + attron(COLOR_PAIR(4)); + mvprintw(LINES - 2, 0, "Use tab to browse through the windows (F2 to Exit)"); + attroff(COLOR_PAIR(4)); + doupdate(); + + while((ch = getch()) != KEY_F(2)) { + switch(ch) { + case 1: + case 2: + case 3: + top_panel(panels[ch]); + break; + } + + update_panels(); + doupdate(); + } + endwin(); return a; } diff --git a/src/essais/test2.c b/src/essais/test2.c index 3a34414..3512329 100644 --- a/src/essais/test2.c +++ b/src/essais/test2.c @@ -66,7 +66,8 @@ int main() /* Put all the windows */ void init_wins(WINDOW **wins, int n) -{ int x, y, i; +{ + int x, y, i; char label[80]; y = 2; diff --git a/src/recover.c b/src/recover.c index b4f0da7..9b1719b 100644 --- a/src/recover.c +++ b/src/recover.c @@ -76,7 +76,7 @@ void recover(slices_evt_t *slicesEvt, char *src, char *dst, char *ddOpts) { int tryRecoverUntilError(slice_t *sliceToRead, address_t *firstError, char *src, char *dst, char*ddOpts) { //TODO : implement realy that - char ddinvocation[256]; +// char ddinvocation[256]; int res; address_t seek, count; @@ -84,8 +84,8 @@ int tryRecoverUntilError(slice_t *sliceToRead, address_t *firstError, char *src, seek=sliceToRead->begin; count=sliceToRead->end - seek + 1; - res=snprintf(ddinvocation, 255, "dd %s %s %s seek=%lld skip=%lld count=%lld", src, dst, ddOpts, seek, seek, count); - puts(ddinvocation); +// res=snprintf(ddinvocation, 255, "dd %s %s %s seek=%lld skip=%lld count=%lld", src, dst, ddOpts, seek, seek, count); +//TODO : listener to put that info on the interface puts(ddinvocation); /* // Simulate that we have systematically a read error at first sector diff --git a/src/utils.c b/src/utils.c index a19b021..e4fdbc0 100755 --- a/src/utils.c +++ b/src/utils.c @@ -1,4 +1,6 @@ #include +#include + #include "utils.h" int parseArgs(int argc, char **argv, struct progArgs *args) { @@ -22,3 +24,74 @@ void usage(char *progname) { \t\n\ ", progname); } + +void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color) +{ int length, x, y; + float temp; + + if(win == NULL) + win = stdscr; + getyx(win, y, x); + if(startx != 0) + x = startx; + if(starty != 0) + y = starty; + if(width == 0) + width = 80; + + length = strlen(string); + temp = (width - length)/ 2; + x = startx + (int)temp; + wattron(win, color); + mvwprintw(win, y, x, "%s", string); + wattroff(win, color); + refresh(); +} + + +void makeWin(WINDOW *win, PANEL *panel, int h, int w, int y, int x, char title[]) { + int i; + win = newwin(h, w, y, x); + mvwprintw(win, 0, 0, "%s", title); + mvwchgat(win, 0, 0, -1, A_BOLD, 2, NULL); + for(i=1;i