X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=clients%2Fgui-shell%2Fdsh.c;h=b6886680c6390bec2cbd65718e485ec929f643f2;hb=31a01fddb038535690783feb3e76bcd35c1edb16;hp=85f06bff337c8af9b6ed5b8aec73ec749b595385;hpb=34d45a1577a7696d68d683964d891b73fccfca50;p=doldaconnect.git diff --git a/clients/gui-shell/dsh.c b/clients/gui-shell/dsh.c index 85f06bf..b688668 100644 --- a/clients/gui-shell/dsh.c +++ b/clients/gui-shell/dsh.c @@ -46,10 +46,13 @@ struct trinfo { int ostate; + int opos; + time_t lastprog; }; void updatewrite(void); +int remote = 0; GtkStatusIcon *tray; pid_t dpid = 0, dcpid = 0; int connected = 0; @@ -132,6 +135,8 @@ void inittr(struct dc_transfer *tr) tr->udata = tri = memset(smalloc(sizeof(*tri)), 0, sizeof(*tri)); tr->destroycb = destroytr; tri->ostate = tr->state; + tri->opos = tr->curpos; + tri->lastprog = time(NULL); } #ifdef HAVE_NOTIFY @@ -153,16 +158,29 @@ void notify(NotifyNotification **n, char *cat, char *title, char *body, ...) } #endif +/* XXX: Achtung! Too DC-specific! */ +wchar_t *getfilename(wchar_t *path) +{ + wchar_t *p; + + if((p = wcsrchr(path, L'\\')) == NULL) + return(path); + else + return(p + 1); +} + void trstatechange(struct dc_transfer *tr, int ostate) { - if(ostate == DC_TRNS_MAIN) { + if((ostate == DC_TRNS_MAIN) && (tr->dir == DC_TRNSD_DOWN)) { if(tr->state == DC_TRNS_DONE) { #ifdef HAVE_NOTIFY - notify(&trnote, "transfer.complete", _("Transfer complete"), _("Finished downloading %ls from %ls"), tr->path, tr->peernick); + if(dcpid == 0) + notify(&trnote, "transfer.complete", _("Transfer complete"), _("Finished downloading %ls from %ls"), getfilename(tr->path), tr->peernick); #endif } else { #ifdef HAVE_NOTIFY - notify(&trnote, "transfer.error", _("Transfer interrupted"), _("The transfer of %ls from %ls was interrupted from the other side"), tr->path, tr->peernick); + if(dcpid == 0) + notify(&trnote, "transfer.error", _("Transfer interrupted"), _("The transfer of %ls from %ls was interrupted from the other side"), getfilename(tr->path), tr->peernick); #endif } } @@ -172,7 +190,9 @@ void updatetrinfo(void) { struct dc_transfer *tr; struct trinfo *tri; + time_t now; + now = time(NULL); for(tr = dc_transfers; tr != NULL; tr = tr->next) { if(tr->udata == NULL) { inittr(tr); @@ -182,6 +202,16 @@ void updatetrinfo(void) trstatechange(tr, tri->ostate); tri->ostate = tr->state; } + if(tri->opos != tr->curpos) { + tri->opos = tr->curpos; + tri->lastprog = now; + } +#ifdef NOTIFY + if((tr->state = DC_TRNS_MAIN) && (now - tri->lastprog > 600)) { + if(dcpid == 0) + notify(&trnote, "transfer.error", _("Transfer stalled"), _("The transfer of %ls from %ls has not made progress for 10 minutes"), getfilename(tr->path), tr->peernick); + } +#endif } } } @@ -254,7 +284,7 @@ void updatewrite(void) void connectdc(void) { - if((dcfd = dc_connect(dc_srv_local)) < 0) { + if((dcfd = dc_connect(remote?NULL:dc_srv_local)) < 0) { msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Could not connect to server: %s"), strerror(errno)); exit(1); } @@ -337,12 +367,28 @@ void dolcon(void) if((dcpid = fork()) == 0) { for(i = 3; i < FD_SETSIZE; i++) close(i); - execlp("dolcon", "dolcon", NULL); + if(remote) + execlp("dolcon", "dolcon", NULL); + else + execlp("dolcon", "dolcon", "-l", NULL); perror("dolcon"); exit(127); } } +void cb_shm_dolconf_activate(GtkWidget *uu1, gpointer uu2) +{ + int i; + + if((dcpid = fork()) == 0) { + for(i = 3; i < FD_SETSIZE; i++) + close(i); + execlp("dolconf", "dolconf", NULL); + perror("dolconf"); + exit(127); + } +} + void cb_shm_dolcon_activate(GtkWidget *uu1, gpointer uu2) { dolcon(); @@ -396,6 +442,8 @@ void inittray(void) int main(int argc, char **argv) { + int c; + setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); @@ -405,12 +453,30 @@ int main(int argc, char **argv) #ifdef HAVE_NOTIFY notify_init("Dolda Connect"); #endif + while((c = getopt(argc, argv, "rh")) != -1) { + switch(c) { + case 'r': + remote = 1; + break; + case 'h': + printf("usage: doldacond-shell [-hr]\n"); + printf("\t-h\tDisplay this help message\n"); + printf("\t-r\tConnect to a remote host\n"); + exit(0); + default: + fprintf(stderr, "usage: doldacond-shell [-hr]\n"); + exit(1); + } + } create_shm_wnd(); dcicon = gdk_pixbuf_new_from_xpm_data((const char **)dolda_icon_xpm); gtk_window_set_default_icon(dcicon); inittray(); - startdaemon(); + if(remote) + connectdc(); + else + startdaemon(); gtk_main();