/*
* Dolda Connect - Modular multiuser Direct Connect-style client
- * Copyright (C) 2004 Fredrik Tolf (fredrik@dolda2000.com)
+ * Copyright (C) 2004 Fredrik Tolf <fredrik@dolda2000.com>
*
* 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
#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;
};
struct srchsize
{
- int size;
+ gint64 size;
int num;
int slots;
double resptime;
{
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;
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);
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);
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);
int id;
char *buf;
char *peerid, *peernick, *path, *hash;
- int state, dir, size, curpos, error;
+ int state, dir, error;
+ gint64 size, curpos;
time_t errortime;
GtkListStore *stores[3];
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);
}
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,
ksquerytag = dc_queuecmd(NULL, NULL, L"filtercmd", L"userspeeda", L"%a", users, NULL);
dc_freewcsarr(users);
}
+ updatewrite();
return(TRUE);
}
{
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;
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);
}
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)) {
lsrestag = dc_queuecmd(NULL, NULL, L"filtercmd", L"lsres", NULL);
gtk_widget_set_sensitive(reslist_reload, FALSE);
}
+ updatewrite();
}
void dcconnect(char *host)
fetchhublist(pubhubaddr, filter);
}
+void cb_main_pubhubabort_clicked(GtkWidget *widget, gpointer data)
+{
+ aborthublist();
+}
+
void cb_main_dcnctbtn_clicked(GtkWidget *widget, gpointer data)
{
GtkTreeIter iter;
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;
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);
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)
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;
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");
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);
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 */
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_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 */
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);