diff options
author | corvid <corvid@lavabit.com> | 2011-07-27 01:23:54 +0000 |
---|---|---|
committer | corvid <corvid@lavabit.com> | 2011-07-27 01:23:54 +0000 |
commit | 9e78fae13580d8c97cb1f9781c491fca6f6ce88c (patch) | |
tree | f461c84c5198aaae8c8d34c86b635b099aa085bc /dpi/downloads.cc | |
parent | 038bb372cd0400e71b47b156e39dabaa01b599d4 (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.
Diffstat (limited to 'dpi/downloads.cc')
-rw-r--r-- | dpi/downloads.cc | 40 |
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: "); |