X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=clients%2Fgtk2%2Fdolcon.c;h=a5adc12fc0893751367abbe0ae5e4cb4a0b74354;hb=4f0d9ba6afe60e0b0091baa188026000b206ebc4;hp=02a24230f4cc741beb53168b7354ba3e1ab05e5f;hpb=d05758f6eda21695e6215d60d28b9747d0b8aaa3;p=doldaconnect.git diff --git a/clients/gtk2/dolcon.c b/clients/gtk2/dolcon.c index 02a2423..a5adc12 100644 --- a/clients/gtk2/dolcon.c +++ b/clients/gtk2/dolcon.c @@ -1,6 +1,6 @@ /* * Dolda Connect - Modular multiuser Direct Connect-style client - * Copyright (C) 2004 Fredrik Tolf (fredrik@dolda2000.com) + * Copyright (C) 2004 Fredrik Tolf * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -41,19 +41,19 @@ #include #include #include +#include #ifdef HAVE_CONFIG_H #include #endif #include "dolcon.h" #include "hublist.h" -#include "progressbar.h" #define TRHISTSIZE 10 struct trdata { - size_t poshist[TRHISTSIZE]; + dc_lnum_t poshist[TRHISTSIZE]; double timehist[TRHISTSIZE]; int hc; }; @@ -65,7 +65,7 @@ struct fndata struct srchsize { - int size; + gint64 size; int num; int slots; double resptime; @@ -279,26 +279,40 @@ char *bytes2si(long long bytes) { int i; double b; - char *sd; static char ret[64]; + static char pfx[] = {'k', 'M', 'G', 'T'}; b = bytes; - for(i = 0; (b >= 1024) && (i < 4); i++) + for(i = 0; (b >= 1024) && (i < sizeof(pfx)); i++) b /= 1024; if(i == 0) - sd = "B"; - else if(i == 1) - sd = "kiB"; - else if(i == 2) - sd = "MiB"; - else if(i == 3) - sd = "GiB"; + snprintf(ret, 64, "%.1f B", b); else - sd = "TiB"; - snprintf(ret, 64, "%.1f %s", b, sd); + snprintf(ret, 64, "%.1f %ciB", b, pfx[i - 1]); return(ret); } +void progressfunc(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) +{ + int totalc, curc; + gint64 total, cur; + char buf[64]; + + totalc = (GPOINTER_TO_INT(data) & 0xff00) >> 8; + curc = GPOINTER_TO_INT(data) & 0xff; + gtk_tree_model_get(model, iter, totalc, &total, curc, &cur, -1); + if(total < 1) + g_object_set(rend, "value", GINT_TO_POINTER(0), NULL); + else + g_object_set(rend, "value", GINT_TO_POINTER((int)(((double)cur / (double)total) * 100)), NULL); + if(cur < 0) { + g_object_set(rend, "text", "", NULL); + } else { + snprintf(buf, 64, "%'ji", (intmax_t)cur); + g_object_set(rend, "text", buf, NULL); + } +} + void percentagefunc(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { int colnum; @@ -313,13 +327,14 @@ void percentagefunc(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel void transnicebytefunc(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { - int colnum, val; + int colnum; + gint64 val; char buf[64]; colnum = GPOINTER_TO_INT(data); gtk_tree_model_get(model, iter, colnum, &val, -1); if(val >= 0) - snprintf(buf, 64, "%'i", val); + snprintf(buf, 64, "%'ji", (intmax_t)val); else strcpy(buf, _("Unknown")); g_object_set(rend, "text", buf, NULL); @@ -328,7 +343,7 @@ void transnicebytefunc(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeMod void transnicebytefunc2(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { int colnum; - long long val; + gint64 val; char buf[64]; colnum = GPOINTER_TO_INT(data); @@ -356,7 +371,8 @@ void hidezerofunc(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel *m void speedtimefunc(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { - int speed, size, time; + int speed, time; + gint64 size; char buf[64]; gtk_tree_model_get(model, iter, 4, &size, 8, &speed, -1); @@ -405,7 +421,7 @@ void transspeedinfo(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel void transerrorinfo(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { int error; - time_t errortime; + gint64 errortime; char finbuf[64], tbuf[64], *errstr; gtk_tree_model_get(model, iter, 10, &error, 11, &errortime, -1); @@ -415,7 +431,7 @@ void transerrorinfo(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel errstr = _("Not found"); else if(error == DC_TRNSE_NOSLOTS) errstr = _("No slots"); - strftime(tbuf, 64, _("%H:%M:%S"), localtime(&errortime)); + strftime(tbuf, 64, _("%H:%M:%S"), localtime((const time_t[]){errortime})); snprintf(finbuf, 64, _("%s (reported at %s)"), errstr, tbuf); } else { *finbuf = 0; @@ -463,8 +479,8 @@ void updatetransferlists(void) int id; char *buf; char *peerid, *peernick, *path, *hash; - int state, dir, size, curpos, error; - time_t errortime; + int state, dir, error; + gint64 size, curpos, errortime; GtkListStore *stores[3]; for(transfer = dc_transfers; transfer != NULL; transfer = transfer->next) @@ -496,10 +512,10 @@ void updatetransferlists(void) if(state != transfer->state) gtk_list_store_set(stores[i], &iter, 2, transfer->state, 8, gettrstatestock(transfer->state), -1); if(size != transfer->size) - gtk_list_store_set(stores[i], &iter, 6, transfer->size, -1); + gtk_list_store_set(stores[i], &iter, 6, (gint64)transfer->size, -1); if(curpos != transfer->curpos) { - gtk_list_store_set(stores[i], &iter, 7, transfer->curpos, -1); + gtk_list_store_set(stores[i], &iter, 7, (gint64)transfer->curpos, -1); if(transfer->udata != NULL) updatetrdata(transfer); } @@ -548,12 +564,12 @@ void updatetransferlists(void) 3, peerid, 4, peernick, 5, path, - 6, transfer->size, - 7, transfer->curpos, + 6, (gint64)transfer->size, + 7, (gint64)transfer->curpos, 8, gettrstatestock(transfer->state), 9, 0.0, 10, transfer->error, - 11, transfer->errortime, + 11, (gint64)transfer->errortime, 12, hash, -1); free(peerid); @@ -813,7 +829,7 @@ void logincallback(int err, wchar_t *reason, void *data) switch(err) { case DC_LOGIN_ERR_SUCCESS: - dc_queuecmd(NULL, NULL, L"notify", L"all", L"on", NULL); + dc_queuecmd(NULL, NULL, L"notify", L"all", L"on", L"fn:peer", L"off", NULL); dc_getfnlistasync(getfnlistcallback, NULL); dc_gettrlistasync(gettrlistcallback, NULL); updatesbar("Authenticated"); @@ -988,6 +1004,7 @@ gint ksupdatecb(gpointer data) ksquerytag = dc_queuecmd(NULL, NULL, L"filtercmd", L"userspeeda", L"%a", users, NULL); dc_freewcsarr(users); } + updatewrite(); return(TRUE); } @@ -1110,13 +1127,13 @@ void handleresps(void) { for(i = 0; i < numsizes; i++) { - if(srchsizes[i].size == ires->argv[4].val.num) + if(srchsizes[i].size == ires->argv[4].val.lnum) break; } if(i == numsizes) { srchsizes = srealloc(srchsizes, sizeof(*srchsizes) * ++numsizes); - srchsizes[i].size = ires->argv[4].val.num; + srchsizes[i].size = (gint64)ires->argv[4].val.lnum; srchsizes[i].num = 1; srchsizes[i].slots = ires->argv[5].val.num; srchsizes[i].resptime = ires->argv[7].val.flnum; @@ -1148,9 +1165,8 @@ void handleresps(void) if((buf = icwcstombs(ires->argv[1].val.str, "UTF-8")) != NULL) { p = buf; - /* XXX: Too NMDC-specific! */ - if(strrchr(p, '\\') != NULL) - p = strrchr(p, '\\') + 1; + if(strrchr(p, '/') != NULL) + p = strrchr(p, '/') + 1; gtk_tree_store_set(srchmodel, &piter, 3, p, -1); free(buf); } @@ -1188,7 +1204,7 @@ void handleresps(void) gtk_tree_store_set(srchmodel, &titer, 9, buf, -1); free(buf); } - gtk_tree_store_set(srchmodel, &titer, 4, ires->argv[4].val.num, 5, ires->argv[5].val.num, 6, ires->argv[7].val.flnum, 8, -1, -1); + gtk_tree_store_set(srchmodel, &titer, 4, (gint64)ires->argv[4].val.lnum, 5, ires->argv[5].val.num, 6, ires->argv[7].val.flnum, 8, -1, -1); } dc_freeires(ires); } @@ -1216,9 +1232,9 @@ void handleresps(void) gtk_list_store_append(reslist, &titer); gtk_list_store_set(reslist, &titer, 0, icswcstombs(resp->rlines[i].argv[1] + 3, "UTF-8", NULL), -1); } else if(!wcsncmp(resp->rlines[i].argv[1], L"size:", 5)) { - gtk_list_store_set(reslist, &titer, 1, wcstol(resp->rlines[i].argv[1] + 5, NULL, 10), -1); + gtk_list_store_set(reslist, &titer, 1, (gint64)wcstoll(resp->rlines[i].argv[1] + 5, NULL, 10), -1); } else if(!wcsncmp(resp->rlines[i].argv[1], L"prog:", 5)) { - gtk_list_store_set(reslist, &titer, 2, wcstol(resp->rlines[i].argv[1] + 5, NULL, 10), -1); + gtk_list_store_set(reslist, &titer, 2, (gint64)wcstoll(resp->rlines[i].argv[1] + 5, NULL, 10), -1); } else if(!wcsncmp(resp->rlines[i].argv[1], L"name:", 5)) { gtk_list_store_set(reslist, &titer, 3, icswcstombs(resp->rlines[i].argv[1] + 5, "UTF-8", NULL), -1); } else if(!wcsncmp(resp->rlines[i].argv[1], L"lock:", 5)) { @@ -1303,6 +1319,7 @@ void cb_main_lsres_activate(GtkWidget *widget, gpointer data) lsrestag = dc_queuecmd(NULL, NULL, L"filtercmd", L"lsres", NULL); gtk_widget_set_sensitive(reslist_reload, FALSE); } + updatewrite(); } void dcconnect(char *host) @@ -1445,6 +1462,11 @@ void cb_main_pubhubfilter_activate(GtkWidget *widget, gpointer data) fetchhublist(pubhubaddr, filter); } +void cb_main_pubhubabort_clicked(GtkWidget *widget, gpointer data) +{ + aborthublist(); +} + void cb_main_dcnctbtn_clicked(GtkWidget *widget, gpointer data) { GtkTreeIter iter; @@ -1738,7 +1760,8 @@ void cb_main_srchres_activate(GtkWidget *widget, GtkTreePath *path, GtkTreeViewC struct dc_response *resp; GtkTreeIter iter; GtkTreeModel *model; - int size, num; + int num; + gint64 size; char *tfnet, *tpeerid, *tfilename, *thash, *arg; wchar_t *fnet, *peerid, *filename, *hash; @@ -1780,9 +1803,9 @@ void cb_main_srchres_activate(GtkWidget *widget, GtkTreePath *path, GtkTreeViewC g_free(tfilename); arg = (char *)gtk_entry_get_text(GTK_ENTRY(main_dlarg)); if(*arg) - tag = dc_queuecmd(NULL, NULL, L"download", fnet, L"%ls", peerid, L"%ls", filename, L"%i", size, L"hash", L"%ls", (hash == NULL)?L"":hash, L"user", L"%s", arg, NULL); + tag = dc_queuecmd(NULL, NULL, L"download", fnet, L"%ls", peerid, L"%ls", filename, L"%li", (dc_lnum_t)size, L"hash", L"%ls", (hash == NULL)?L"":hash, L"user", L"%s", arg, NULL); else - tag = dc_queuecmd(NULL, NULL, L"download", fnet, L"%ls", peerid, L"%ls", filename, L"%i", size, L"hash", L"%ls", (hash == NULL)?L"":hash, NULL); + tag = dc_queuecmd(NULL, NULL, L"download", fnet, L"%ls", peerid, L"%ls", filename, L"%li", (dc_lnum_t)size, L"hash", L"%ls", (hash == NULL)?L"":hash, NULL); free(fnet); free(peerid); free(filename); @@ -2037,6 +2060,7 @@ void cb_reslist_reload_clicked(GtkWidget *widget, gpointer data) gtk_list_store_clear(reslist); lsrestag = dc_queuecmd(NULL, NULL, L"filtercmd", L"lsres", NULL); gtk_widget_set_sensitive(reslist_reload, FALSE); + updatewrite(); } int rmres(char *id) @@ -2195,8 +2219,11 @@ void initchattags(void) gtk_text_tag_table_add(chattags, tag); } +#include "../dolda-icon.xpm" + int main(int argc, char **argv) { + int c, connlocal; GtkWidget *wnd; PangoFontDescription *monospacefont; GtkTreeModel *sortmodel; @@ -2206,9 +2233,29 @@ int main(int argc, char **argv) bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); gtk_init(&argc, &argv); + connlocal = 0; + while((c = getopt(argc, argv, "lhV")) != -1) { + switch(c) { + case 'l': + connlocal = 1; + break; + case 'h': + printf("usage: dolcon [-hlV]\n"); + printf("\t-h\tDisplay this help message\n"); + printf("\t-l\tConnect to the locally running daemon\n"); + printf("\t-V\tDisplay version info and exit\n"); + exit(0); + case 'V': + printf("%s", RELEASEINFO); + exit(0); + default: + fprintf(stderr, "usage: dolcon [-hlV]\n"); + exit(1); + } + } dc_init(); signal(SIGCHLD, SIG_IGN); - pubhubaddr = sstrdup("http://www.hublist.org/PublicHubList.xml.bz2"); + pubhubaddr = sstrdup("http://dchublist.com/hublist.xml.bz2"); dcserver = sstrdup(""); if((pwent = getpwuid(getuid())) == NULL) { @@ -2216,6 +2263,7 @@ int main(int argc, char **argv) exit(1); } connectas = sstrdup(pwent->pw_name); + gtk_window_set_default_icon(gdk_pixbuf_new_from_xpm_data((const char **)dolda_icon_xpm)); wnd = create_main_wnd(); create_reslist_wnd(); gtk_window_resize(GTK_WINDOW(reslist_wnd), 600, 400); @@ -2225,7 +2273,7 @@ int main(int argc, char **argv) gtk_tree_view_set_model(GTK_TREE_VIEW(main_fnetnodes), GTK_TREE_MODEL(fnmodel)); gtk_tree_view_set_model(GTK_TREE_VIEW(main_chatnodes), GTK_TREE_MODEL(fnmodel)); - reslist = gtk_list_store_new(6, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING); + reslist = gtk_list_store_new(6, G_TYPE_STRING, G_TYPE_INT64, G_TYPE_INT64, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING); gtk_tree_view_set_model(GTK_TREE_VIEW(reslist_list), GTK_TREE_MODEL(reslist)); dlmodel = gtk_list_store_new(13, G_TYPE_INT, /* id */ @@ -2234,23 +2282,23 @@ int main(int argc, char **argv) G_TYPE_STRING, /* peerid */ G_TYPE_STRING, /* peernick */ G_TYPE_STRING, /* path */ - G_TYPE_INT, /* size */ - G_TYPE_INT, /* curpos */ + G_TYPE_INT64, /* size */ + G_TYPE_INT64, /* curpos */ G_TYPE_STRING, /* stock */ G_TYPE_FLOAT, /* percentage */ G_TYPE_INT, /* error */ - G_TYPE_INT, /* errortime */ + G_TYPE_INT64, /* errortime */ G_TYPE_STRING); /* hash */ gtk_tree_view_set_model(GTK_TREE_VIEW(main_downloads), GTK_TREE_MODEL(dlmodel)); - ulmodel = gtk_list_store_new(13, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_FLOAT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING); + ulmodel = gtk_list_store_new(13, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT64, G_TYPE_INT64, G_TYPE_STRING, G_TYPE_FLOAT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING); gtk_tree_view_set_model(GTK_TREE_VIEW(main_uploads), GTK_TREE_MODEL(ulmodel)); srchmodel = gtk_tree_store_new(10, G_TYPE_STRING, /* fnetname */ G_TYPE_STRING, /* peerid */ G_TYPE_STRING, /* peername */ G_TYPE_STRING, /* filename */ - G_TYPE_INT, /* size */ + G_TYPE_INT64, /* size */ G_TYPE_INT, /* slots */ G_TYPE_DOUBLE, /* resptime */ G_TYPE_INT, /* sizenum */ @@ -2269,7 +2317,9 @@ int main(int argc, char **argv) readconfigfile(); updatesbar(_("Disconnected")); gtk_widget_show(wnd); - if(autoconn) + if(connlocal) + dcconnect(dc_srv_local); + else if(autoconn) dcconnect(dcserver); g_timeout_add(500, srchstatupdatecb, NULL); g_timeout_add(5000, ksupdatecb, NULL);