From 0ea5ecb238b932c533413b912b7981a737af56cf Mon Sep 17 00:00:00 2001 From: danoloan10 Date: Thu, 19 Sep 2019 18:25:59 +0200 Subject: [PATCH] Basic integrated downloads via console display --- config.def.h | 16 ++++--- surf.c | 118 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 101 insertions(+), 33 deletions(-) diff --git a/config.def.h b/config.def.h index 34265f6..375be93 100644 --- a/config.def.h +++ b/config.def.h @@ -6,6 +6,8 @@ static char *styledir = "~/.surf/styles/"; static char *certdir = "~/.surf/certificates/"; static char *cachedir = "~/.surf/cache/"; static char *cookiefile = "~/.surf/cookies.txt"; +static char *dldir = "~/dl/"; +static char *dlstatus = "~/.surf/dlstatus/"; /* Webkit default features */ /* Highest priority value will be used. @@ -76,13 +78,12 @@ static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | } \ } -/* DOWNLOAD(URI, referer) */ -#define DOWNLOAD(u, r) { \ +#define DLSTATUS { \ .v = (const char *[]){ "st", "-e", "/bin/sh", "-c",\ - "curl -g -L -J -O -A \"$1\" -b \"$2\" -c \"$2\"" \ - " -e \"$3\" \"$4\"; read", \ - "surf-download", useragent, cookiefile, r, u, NULL \ - } \ + "while true; do cat $1/* 2>/dev/null || echo \"no hay descargas\";"\ + "A=; read A; "\ + "if [ $A = \"clean\" ]; then rm $1/*; fi; clear; done",\ + "surf-dlstatus", dlstatus, NULL } \ } /* PLUMB(URI) */ @@ -180,6 +181,9 @@ static Key keys[] = { { MODKEY|GDK_SHIFT_MASK, GDK_KEY_b, toggle, { .i = ScrollBars } }, { MODKEY|GDK_SHIFT_MASK, GDK_KEY_t, toggle, { .i = StrictTLS } }, { MODKEY|GDK_SHIFT_MASK, GDK_KEY_m, toggle, { .i = Style } }, + + /* download-console */ + { MODKEY, GDK_KEY_d, spawndls, { 0 } }, }; /* button definitions */ diff --git a/surf.c b/surf.c index 2b54e3c..771858e 100644 --- a/surf.c +++ b/surf.c @@ -205,10 +205,6 @@ static void decidenewwindow(WebKitPolicyDecision *d, Client *c); static void decideresource(WebKitPolicyDecision *d, Client *c); static void insecurecontent(WebKitWebView *v, WebKitInsecureContentEvent e, Client *c); -static void downloadstarted(WebKitWebContext *wc, WebKitDownload *d, - Client *c); -static void responsereceived(WebKitDownload *d, GParamSpec *ps, Client *c); -static void download(Client *c, WebKitURIResponse *r); static void webprocessterminated(WebKitWebView *v, WebKitWebProcessTerminationReason r, Client *c); @@ -237,6 +233,17 @@ static void clicknavigate(Client *c, const Arg *a, WebKitHitTestResult *h); static void clicknewwindow(Client *c, const Arg *a, WebKitHitTestResult *h); static void clickexternplayer(Client *c, const Arg *a, WebKitHitTestResult *h); +/* download-console */ +static void downloadstarted(WebKitWebContext *wc, WebKitDownload *d, + Client *c); +static void downloadfailed(WebKitDownload *d, GParamSpec *ps, void *arg); +static void downloadfinished(WebKitDownload *d, GParamSpec *ps, void *arg); +static gboolean decidedestination(WebKitDownload *d, + gchar *suggested_filename, void *arg); +static void printprogress(WebKitDownload *d, GParamSpec *ps, void *arg); +static void logdownload(WebKitDownload *d, gchar *tail); +static void spawndls(Client *c, const Arg *a); + static char winid[64]; static char togglestats[12]; static char pagestats[2]; @@ -340,6 +347,8 @@ setup(void) scriptfile = buildfile(scriptfile); cachedir = buildpath(cachedir); certdir = buildpath(certdir); + dlstatus = buildpath(dlstatus); + dldir = buildpath(dldir); gdkkb = gdk_seat_get_keyboard(gdk_display_get_default_seat(gdpy)); @@ -1079,6 +1088,8 @@ cleanup(void) g_free(scriptfile); g_free(stylefile); g_free(cachedir); + g_free(dldir); + g_free(dlstatus); XCloseDisplay(dpy); } @@ -1710,8 +1721,7 @@ decideresource(WebKitPolicyDecision *d, Client *c) if (webkit_response_policy_decision_is_mime_type_supported(r)) { webkit_policy_decision_use(d); } else { - webkit_policy_decision_ignore(d); - download(c, res); + webkit_policy_decision_download(d); } } @@ -1721,27 +1731,6 @@ insecurecontent(WebKitWebView *v, WebKitInsecureContentEvent e, Client *c) c->insecure = 1; } -void -downloadstarted(WebKitWebContext *wc, WebKitDownload *d, Client *c) -{ - g_signal_connect(G_OBJECT(d), "notify::response", - G_CALLBACK(responsereceived), c); -} - -void -responsereceived(WebKitDownload *d, GParamSpec *ps, Client *c) -{ - download(c, webkit_download_get_response(d)); - webkit_download_cancel(d); -} - -void -download(Client *c, WebKitURIResponse *r) -{ - Arg a = (Arg)DOWNLOAD(webkit_uri_response_get_uri(r), geturi(c)); - spawn(c, &a); -} - void webprocessterminated(WebKitWebView *v, WebKitWebProcessTerminationReason r, Client *c) @@ -1971,6 +1960,81 @@ clickexternplayer(Client *c, const Arg *a, WebKitHitTestResult *h) spawn(c, &arg); } +/* download-console */ + +void +downloadstarted(WebKitWebContext *wc, WebKitDownload *d, Client *c) +{ + webkit_download_set_allow_overwrite(d, TRUE); + g_signal_connect(G_OBJECT(d), "decide-destination", + G_CALLBACK(decidedestination), NULL); + g_signal_connect(G_OBJECT(d), "notify::estimated-progress", + G_CALLBACK(printprogress), NULL); + g_signal_connect(G_OBJECT(d), "failed", + G_CALLBACK(downloadfailed), NULL); + g_signal_connect(G_OBJECT(d), "finished", + G_CALLBACK(downloadfinished), NULL); +} + +void +downloadfailed(WebKitDownload *d, GParamSpec *ps, void *arg) +{ + logdownload(d, " -- FAILED"); +} + +void +downloadfinished(WebKitDownload *d, GParamSpec *ps, void *arg) +{ + logdownload(d, " -- COMPLETED"); +} + +gboolean +decidedestination(WebKitDownload *d, gchar *suggested_filename, void *arg) +{ + gchar *dest; + dest = g_strdup_printf("file://%s/%s", dldir, suggested_filename); + webkit_download_set_destination(d, dest); + return TRUE; +} + +void +printprogress(WebKitDownload *d, GParamSpec *ps, void *arg) +{ + logdownload(d, ""); +} + +void +logdownload(WebKitDownload *d, gchar *tail) +{ + gchar *filename, *statfile; + FILE *stat; + + filename = g_path_get_basename(webkit_download_get_destination(d)); + statfile = g_strdup_printf("%s/%s", dlstatus, filename); + + if ((stat = fopen(statfile, "w")) == NULL) { + perror("dlstatus"); + } else { + fprintf(stat, "%s: %d%% (%d.%ds)%s\n", + filename, + (int)(webkit_download_get_estimated_progress(d) * 100), + (int) webkit_download_get_elapsed_time(d), + (int)(webkit_download_get_elapsed_time(d) * 100), + tail); + fclose(stat); + } + + g_free(statfile); + g_free(filename); +} + +void +spawndls(Client *c, const Arg *a) +{ + Arg arg = (Arg)DLSTATUS; + spawn(c, &arg); +} + int main(int argc, char *argv[]) { -- 2.22.1