/* * Toxic -- Tox Curses Client */ #include #include #include #include #include #include "../../core/Messenger.h" #include "../../core/network.h" #include "windows.h" extern ToxWindow new_prompt(); extern ToxWindow new_friendlist(); extern int friendlist_onFriendAdded(int num); extern int add_req(uint8_t* public_key); // XXX #define TOXWINDOWS_MAX_NUM 32 static ToxWindow windows[TOXWINDOWS_MAX_NUM]; static int w_num; static int w_active; static ToxWindow* prompt; // CALLBACKS START void on_request(uint8_t* public_key, uint8_t* data, uint16_t length) { size_t i; int n = add_req(public_key); wprintw(prompt->window, "\nFriend request from:\n"); for(i=0; i<32; i++) { wprintw(prompt->window, "%02x", public_key[i] & 0xff); } wprintw(prompt->window, "\n"); wprintw(prompt->window, "Use \"accept %d\" to accept it.\n", n); for(i=0; iwindow, "\n(message) %d: %s!\n", friendnumber, string); for(i=0; iwindow, "\n(nickchange) %d: %s!\n", friendnumber, string); for(i=0; iwindow, "\n(statuschange) %d: %s!\n", friendnumber, string); for(i=0; i= w_num || num < 0) return -1; w_active = num; return 0; } static void init_windows() { w_num = 0; w_active = 0; if(add_window(new_prompt()) == -1 || add_window(new_friendlist()) == -1) { fprintf(stderr, "add_window() failed.\n"); endwin(); exit(1); } prompt = &windows[0]; } static void do_tox() { static bool dht_on = false; if(!dht_on && DHT_isconnected()) { dht_on = true; wprintw(prompt->window, "\nDHT connected!\n"); } else if(dht_on && !DHT_isconnected()) { dht_on = false; wprintw(prompt->window, "\nDHT disconnected!\n"); } doMessenger(); } static void load_data() { FILE* fd; size_t len; uint8_t* buf; if((fd = fopen("data", "r")) != NULL) { fseek(fd, 0, SEEK_END); len = ftell(fd); fseek(fd, 0, SEEK_SET); buf = malloc(len); if(buf == NULL) { fprintf(stderr, "malloc() failed.\n"); fclose(fd); endwin(); exit(1); } if(fread(buf, len, 1, fd) != 1){ fprintf(stderr, "fread() failed.\n"); free(buf); fclose(fd); endwin(); exit(1); } Messenger_load(buf, len); } else { len = Messenger_size(); buf = malloc(len); if(buf == NULL) { fprintf(stderr, "malloc() failed.\n"); endwin(); exit(1); } Messenger_save(buf); fd = fopen("data", "w"); if(fd == NULL) { fprintf(stderr, "fopen() failed.\n"); free(buf); endwin(); exit(1); } if(fwrite(buf, len, 1, fd) != 1){ fprintf(stderr, "fwrite() failed.\n"); free(buf); fclose(fd); endwin(); exit(1); } } free(buf); fclose(fd); } static void draw_bar() { static int odd = 0; size_t i; attron(COLOR_PAIR(4)); mvhline(LINES - 2, 0, '_', COLS); attroff(COLOR_PAIR(4)); move(LINES - 1, 0); attron(COLOR_PAIR(4) | A_BOLD); printw(" TOXIC 1.0 |"); attroff(COLOR_PAIR(4) | A_BOLD); for(i=0; iwindow); a->blink = false; a->onDraw(a); draw_bar(); // Handle input. ch = getch(); if(ch == '\t') { w_active = (w_active + 1) % w_num; } else if(ch != ERR) { a->onKey(a, ch); } } return 0; }