aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcorvid <corvid@lavabit.com>2011-07-27 01:23:54 +0000
committercorvid <corvid@lavabit.com>2011-07-27 01:23:54 +0000
commit9e78fae13580d8c97cb1f9781c491fca6f6ce88c (patch)
treef461c84c5198aaae8c8d34c86b635b099aa085bc
parent038bb372cd0400e71b47b156e39dabaa01b599d4 (diff)
escape '@' in wget log output shown in downloads dpi tooltip
There are opportunities for optimizations and cleverness, but it's nice to think of workarounds as something simple and minimally intrusive that you will get to rip out again someday. I'll have to check whether I've ever complained to the FLTK people about this specific problem.
-rw-r--r--dpi/downloads.cc40
1 files changed, 35 insertions, 5 deletions
diff --git a/dpi/downloads.cc b/dpi/downloads.cc
index d565001b..1b1d8f46 100644
--- a/dpi/downloads.cc
+++ b/dpi/downloads.cc
@@ -108,7 +108,8 @@ class DLItem {
int LogPipe[2];
char *shortname, *fullname;
char *target_dir;
- int log_len, log_max, log_state;
+ size_t log_len, log_max;
+ int log_state;
char *log_text;
time_t init_time;
char **dl_argv;
@@ -190,6 +191,28 @@ public:
DLAction check_filename(char **p_dl_dest);
};
+/*
+ * FLTK cannot be dissuaded from interpreting '@' in a tooltip
+ * as indicating a symbol unless we escape it.
+ */
+static char *escape_tooltip(const char *buf, ssize_t len)
+{
+ if (len < 0)
+ len = 0;
+
+ char *ret = (char *) malloc(2 * len + 1);
+ char *dest = ret;
+
+ while (len-- > 0) {
+ if (*buf == '@')
+ *dest++ = *buf;
+ *dest++ = *buf++;
+ }
+ *dest = '\0';
+
+ return ret;
+}
+
/*
* Global variables
@@ -476,11 +499,16 @@ void DLItem::update_prSize(int newsize)
void DLItem::log_text_add(const char *buf, ssize_t st)
{
const char *p;
- char *q, *d, num[64];
+ char *esc_str, *q, *d, num[64];
+ size_t esc_len;
+
+ // WORKAROUND: We have to escape '@' in FLTK tooltips.
+ esc_str = escape_tooltip(buf, st);
+ esc_len = strlen(esc_str);
// Make room...
- if (log_len + st >= log_max) {
- log_max = log_len + st + 1024;
+ if (log_len + esc_len >= log_max) {
+ log_max = log_len + esc_len + 1024;
log_text = (char *) realloc (log_text, log_max);
log_text[log_len] = 0;
prTitle->tooltip(log_text);
@@ -488,7 +516,7 @@ void DLItem::log_text_add(const char *buf, ssize_t st)
// FSM to remove wget's "dot-progress" (i.e. "^ " || "^[0-9]+K")
q = log_text + log_len;
- for (p = buf; (p - buf) < st; ++p) {
+ for (p = esc_str; (p - esc_str) < esc_len; ++p) {
switch (log_state) {
case ST_newline:
if (*p == ' ') {
@@ -523,6 +551,8 @@ void DLItem::log_text_add(const char *buf, ssize_t st)
*q = 0;
log_len = strlen(log_text);
+ free(esc_str);
+
// Now scan for the length of the file
if (total_bytesize == -1) {
p = strstr(log_text, "\nLength: ");