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;
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
}
#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
}
}
{
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);
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
}
}
}
dc_uimisc_handlenotify(resp);
updatetrinfo();
}
+ dc_freeresp(resp);
}
updatewrite();
}
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);
}
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();
int main(int argc, char **argv)
{
+ int c;
+
setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
#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();