X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fmain.c;h=a3e8647d10740e00c149574ad50f6f46b3b30970;hb=52d7763743e415b0a374a9845a7d9a67b9f8e321;hp=611508d44f85a08405a393aee070b284f64bb6db;hpb=4577dd26b3ecbf7ccc5ff55efa991334136866e1;p=oftp diff --git a/src/main.c b/src/main.c index 611508d..a3e8647 100644 --- a/src/main.c +++ b/src/main.c @@ -1,28 +1,41 @@ +#include +#include #include #include +#include #include #include "tgfx.h" #include "input.h" +#include "util.h" #include "tui.h" #include "ftp.h" +void updateui(void); int proc_input(void); int keypress(int key); +int parse_args(int argc, char **argv); -struct ftp *ftp; -struct tui_widget *uilist; +static struct ftp *ftp; +static struct tui_widget *uilist; -int main(void) +static char *host = "localhost"; +static int port = 21; + +int main(int argc, char **argv) { int i, numsock, maxfd; int ftpsock[16]; fd_set rdset; struct timeval tv; + if(parse_args(argc, argv) == -1) { + return 1; + } + if(!(ftp = ftp_alloc())) { return 1; } - if(ftp_connect(ftp, "192.168.0.4", 21) == -1) { + if(ftp_connect(ftp, host, port) == -1) { ftp_free(ftp); return 1; } @@ -35,10 +48,6 @@ int main(void) tg_clear(); uilist = tui_list("Remote", 0, 0, 40, 23, 0, 0); - tui_add_list_item(uilist, "first item"); - tui_add_list_item(uilist, "second item"); - tui_add_list_item(uilist, "another item"); - tui_add_list_item(uilist, "foo"); tg_setcursor(0, 23); @@ -79,6 +88,8 @@ int main(void) ftp_handle(ftp, ftpsock[i]); } } + + updateui(); } tg_cleanup(); @@ -88,6 +99,45 @@ int main(void) return 0; } +void updateui(void) +{ + int i, num; + struct ftp_dirent *ent; + unsigned int upd = 0; + char buf[128]; + const char *remdir; + + remdir = ftp_curdir(ftp, FTP_REMOTE); + if(remdir && strcmp(tui_get_title(uilist), remdir) != 0) { + tui_set_title(uilist, remdir); + upd |= 1; + } + + if(ftp->modified & FTP_MOD_REMDIR) { + tui_clear_list(uilist); + + num = ftp_num_dirent(ftp, FTP_REMOTE); + for(i=0; itype == FTP_DIR) { + sprintf(buf, "%s/", ent->name); + tui_add_list_item(uilist, buf); + } else { + tui_add_list_item(uilist, ent->name); + } + } + + tui_list_select(uilist, 0); + + ftp->modified &= ~FTP_MOD_REMDIR; + upd |= 1; + } + + if(tui_isdirty(uilist) || upd & 1) { + tui_draw(uilist); + } +} + int proc_input(void) { union event ev; @@ -109,13 +159,87 @@ int proc_input(void) int keypress(int key) { + int sel; + const char *name; + switch(key) { case 27: case 'q': return -1; + case KB_UP: + tui_list_sel_prev(uilist); + break; + case KB_DOWN: + tui_list_sel_next(uilist); + break; + case KB_LEFT: + tui_list_sel_start(uilist); + break; + case KB_RIGHT: + tui_list_sel_end(uilist); + break; + + case '\n': + sel = tui_get_list_sel(uilist); + name = ftp_dirent(ftp, FTP_REMOTE, sel)->name; + ftp_queue(ftp, FTP_CHDIR, name); + break; + + case '\b': + ftp_queue(ftp, FTP_CDUP, 0); + break; + default: break; } return 0; } + +static const char *usage = "Usage: %s [options] [hostname] [port]\n" + "Options:\n" + " -h: print usage information and exit\n"; + +int parse_args(int argc, char **argv) +{ + int i, argidx = 0; + + for(i=1; i