Blob


1 /*
2 * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
17 #include "compat.h"
19 #include <stdlib.h>
20 #include <string.h>
22 #include "telescope.h"
23 #include "ui.h"
25 struct downloads downloads = STAILQ_HEAD_INITIALIZER(downloads);
27 static void
28 no_downloads()
29 {
30 struct line *l;
32 if ((l = calloc(1, sizeof(*l))) == NULL)
33 abort();
35 l->type = LINE_DOWNLOAD_INFO;
36 l->line = strdup("No downloads");
38 TAILQ_INSERT_TAIL(&downloadwin.page.head, l, lines);
39 }
41 void
42 recompute_downloads(void)
43 {
44 struct download *d;
45 struct line *l;
46 char buf[FMT_SCALED_STRSIZE];
48 downloadwin.page.name = "*Downloads*";
49 erase_buffer(&downloadwin);
51 if (STAILQ_EMPTY(&downloads)) {
52 no_downloads();
53 goto end;
54 }
56 STAILQ_FOREACH(d, &downloads, entries) {
57 if ((l = calloc(1, sizeof(*l))) == NULL)
58 abort();
60 fmt_scaled(d->bytes, buf);
62 l->type = LINE_DOWNLOAD;
63 if (d->fd == -1)
64 l->type = LINE_DOWNLOAD_DONE;
66 l->line = strdup(buf);
67 l->alt = strdup(d->path);
69 TAILQ_INSERT_TAIL(&downloadwin.page.head, l, lines);
70 }
72 end:
73 wrap_page(&downloadwin, download_lines);
74 }
76 void
77 enqueue_download(uint32_t id, const char *path)
78 {
79 struct download *d;
81 if ((d = calloc(1, sizeof(*d))) == NULL)
82 abort();
84 d->id = id;
85 d->fd = -1;
86 d->path = strdup(path);
88 STAILQ_INSERT_TAIL(&downloads, d, entries);
89 }
91 struct download *
92 download_by_id(uint32_t id)
93 {
94 struct download *d;
96 STAILQ_FOREACH(d, &downloads, entries) {
97 if (d->id == id)
98 return d;
99 }
101 return NULL;