Hey everyone,
because I hit a nasty bug with https and the wget
downloader("Not authorized") I ported the internal
downloader patch to surf 0.5. I tried to improve
the interface a bit and add a progress bar.Feel free to improve the code. Some ideas would include - cancel button (a bit tricky I suppose) - /one/ window for all downloads - when multiple downloads are open only some of them recieve callbacks for some reason - fix frontend for <1K files. The download is finished, before the window is rendered. The JS misses the finish signal. - reasonable default window sizes for non-tiling WM? - further improve layout v4hn
diff --git a/config.def.h b/config.def.h
index 1cba4d7..3065c73 100644
--- a/config.def.h
+++ b/config.def.h
@@ -11,6 +11,7 @@ static char *progress_proxy_untrust = "#FF6600";
static char *stylefile = "~/.surf/style.css";
static char *scriptfile = "~/.surf/script.js";
static char *cookiefile = "~/.surf/cookies.txt";
+static char *downdir = "/tmp";
static time_t sessiontime = 3600;
static char *cafile = "/etc/ssl/certs/ca-certificates.crt";
static char *strictssl = FALSE; /* Refuse untrusted SSL connections */
diff --git a/surf.c b/surf.c
index c9fa08d..6c95f6e 100644
--- a/surf.c
+++ b/surf.c
@@ -114,6 +114,7 @@ static void destroyclient(Client *c);
static void destroywin(GtkWidget* w, Client *c);
static void die(const char *errstr, ...);
static void drawindicator(Client *c);
+static void download(WebKitDownload *o, GParamSpec *pspec, Client *c);
static void eval(Client *c, const Arg *arg);
static gboolean exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *c);
static void find(Client *c, const Arg *arg);
@@ -290,6 +291,29 @@ cookiejar_set_property(GObject *self, guint prop_id, const
GValue *value,
}
static void
+download(WebKitDownload *o, GParamSpec *pspec, Client *c) {
+ WebKitDownloadStatus status;
+ char script[2048]; char* s= script;
+
+ status = webkit_download_get_status(o);
+ if(status == WEBKIT_DOWNLOAD_STATUS_STARTED || status ==
WEBKIT_DOWNLOAD_STATUS_CREATED) {
+ snprintf(script, 2048, "u(%d, %d, %d)",
+ (gint)webkit_download_get_current_size(o),
+ (gint)webkit_download_get_total_size(o),
+ (gint)(webkit_download_get_progress(o) * 100));
+ const Arg a= {.v = (void*) &s};
+ eval(c, &a);
+ }
+ else if (status == WEBKIT_DOWNLOAD_STATUS_FINISHED){
+ snprintf(script, 2048, "c(%d, %d)",
+ (gint)webkit_download_get_current_size(o),
+ (gint)webkit_download_get_total_size(o));
+ const Arg a= {.v = (void*) &s};
+ eval(c, &a);
+ }
+}
+
+static void
evalscript(JSContextRef js, char *script, char* scriptname) {
JSStringRef jsscript, jsscriptname;
JSValueRef exception = NULL;
@@ -496,12 +520,104 @@ geturi(Client *c) {
static gboolean
initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) {
- Arg arg;
+ gchar *uri, *path;
+ const gchar *filename;
+ Client *n;
+ const char template[] =
+"<html>" \
+"<head>" \
+"<title>Download - %s</title>" \
+"<script>" \
+"function formText(x){" \
+" if(x >= 1073741824) { return (Math.floor(x/10737418.24)/100) + \"G\"; }" \
+" else if(x >= 1048576){ return (Math.floor(x/10485.76)/100) + \"M\"; }" \
+" else if(x >= 1024) { return (Math.floor(x/10.24)/100) + \"k\"; }" \
+" else { return x+\"b\"; }" \
+"}" \
+"function updateText(c,t){" \
+" txt= formText(c) + \"/\" + formText(t);" \
+" DLTEXT.textContent= txt;" \
+" /* center text in bar */" \
+" DLTEXT.setAttribute('x', 102-4.4*txt.length)" \
+"}" \
+"function c(c, t){" \
+" DLGRAD.setAttribute('x2', 230);" \
+" DLGRAD.setAttribute('x1', 205);" \
+" updateText(c,t);" \
+" document.getElementById('stop1').setAttribute('style',
\"stop-color:#2020ff;\");" \
+"}" \
+"function u(c,t,p){" \
+" DLGRAD.setAttribute('x2', Math.floor(p*205/100) + 25);" \
+" DLGRAD.setAttribute('x1', Math.floor(p*205/100));" \
+" updateText(c,t);" \
+"}" \
+"</script>" \
+"</head>" \
+"<body>" \
+"<center>" \
+"<h2>Downloading</h2>" \
+"<h3>%s</h3>" \
+"to %s<br/>" \
+"<svg" \
+" xmlns:cc=\"http://creativecommons.org/ns#\"" \
+" xmlns:svg=\"http://www.w3.org/2000/svg\"" \
+" xmlns=\"http://www.w3.org/2000/svg\"" \
+" xmlns:xlink=\"http://www.w3.org/1999/xlink\"" \
+" width=\"210\"" \
+" height=\"60\"" \
+" id=\"download\">" \
+" <defs>" \
+" <linearGradient" \
+" id=\"dlgradient\"" \
+" x1=\"0\"" \
+" y1=\"0\"" \
+" x2=\"25\"" \
+" y2=\"0\"" \
+" gradientUnits=\"userSpaceOnUse\">" \
+" <stop style=\"stop-color:#00ff00;\" offset=\"0\" id=\"stop1\" />" \
+" <stop style=\"stop-color:#00ff00;stop-opacity:0;\" offset=\"1\"
id=\"stop2\" />" \
+" </linearGradient>" \
+" </defs>" \
+" <rect" \
+" style=\"fill:url(#dlgradient);stroke:#000000;stroke-width:3\"" \
+" id=\"rect2985\"" \
+" width=\"200\"" \
+" height=\"50\"" \
+" x=\"5\"" \
+" y=\"5\"" \
+" ry=\"25\" />" \
+" <text id=\"dltext\" x=\"92\" y=\"35\">0/0</text>" \
+"</svg>" \
+"</center>" \
+"<script>" \
+"DLGRAD= document.getElementById('dlgradient');" \
+"DLTEXT= document.getElementById('dltext');" \
+"</script>" \
+"</body>" \
+"</html>";
+ char html[sizeof(template)+2048];
+ n = newclient();
+ filename = webkit_download_get_suggested_filename(o);
+
+ path = g_build_filename(downdir, filename, NULL);
+ uri = g_filename_to_uri(path, NULL, NULL);
+
+ snprintf(html, sizeof(template)+2048, template, filename, filename,
path);
+ webkit_web_view_load_string(n->view, html, NULL, NULL, NULL);
+
+ g_signal_connect(o, "notify::progress", G_CALLBACK(download), n);
+ g_signal_connect(o, "notify::status", G_CALLBACK(download), n);
+ n->title = g_strdup_printf("Downloading %s", filename);
+ n->progress = 0;
+ update(n);
+
+ webkit_download_set_destination_uri(o, uri);
+ g_free(path);
+ g_free(uri);
- updatewinid(c);
- arg = (Arg)DOWNLOAD((char *)webkit_download_get_uri(o), geturi(c));
- spawn(c, &arg);
- return FALSE;
+ webkit_download_start(o);
+
+ return TRUE;
}
static void
pgpgS43LCdKuF.pgp
Description: PGP signature
