From 6118a96005c4fda63eedefa9b0ac03b520f56999 Mon Sep 17 00:00:00 2001 From: Michael Hampton Date: Tue, 15 Oct 2002 06:47:11 +0000 Subject: [PATCH] * IPC support for resumable downloads --- citadel/ChangeLog | 4 ++++ citadel/citadel_ipc.c | 28 +++++++++++++++------------- citadel/citadel_ipc.h | 17 ++++++++++------- citadel/rooms.c | 4 ++-- 4 files changed, 31 insertions(+), 22 deletions(-) diff --git a/citadel/ChangeLog b/citadel/ChangeLog index e0f0483b1..cef2bd98b 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -1,4 +1,7 @@ $Log$ + Revision 601.27 2002/10/15 06:47:11 error + * IPC support for resumable downloads + Revision 601.26 2002/10/15 06:44:55 error * configure.ac check for malloc.h header file (Mac OS X needs this) @@ -4073,3 +4076,4 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant Fri Jul 10 1998 Art Cancro * Initial CVS import + diff --git a/citadel/citadel_ipc.c b/citadel/citadel_ipc.c index 93ad9ce65..fb5633203 100644 --- a/citadel/citadel_ipc.c +++ b/citadel/citadel_ipc.c @@ -1093,7 +1093,8 @@ int CtdlIPCOnlineUsers(CtdlIPC *ipc, char **listing, time_t *stamp, char *cret) /* OPEN */ int CtdlIPCFileDownload(CtdlIPC *ipc, const char *filename, void **buf, - void (*progress_gauge_callback)(long, long), char *cret) + size_t resume, void (*progress_gauge_callback)(long, long), + char *cret) { register int ret; size_t bytes; @@ -1118,8 +1119,8 @@ int CtdlIPCFileDownload(CtdlIPC *ipc, const char *filename, void **buf, bytes = extract_long(cret, 0); last_mod = extract_int(cret, 1); extract(mimetype, cret, 2); - ret = CtdlIPCReadDownload(ipc, buf, bytes, progress_gauge_callback, cret); -/* ret = CtdlIPCHighSpeedReadDownload(ipc, buf, bytes, progress_gauge_callback, cret); */ + ret = CtdlIPCReadDownload(ipc, buf, bytes, resume, progress_gauge_callback, cret); +/* ret = CtdlIPCHighSpeedReadDownload(ipc, buf, bytes, resume, progress_gauge_callback, cret); */ ret = CtdlIPCEndDownload(ipc, cret); if (ret / 100 == 2) sprintf(cret, "%d|%ld|%s|%s", bytes, last_mod, @@ -1158,7 +1159,7 @@ int CtdlIPCAttachmentDownload(CtdlIPC *ipc, long msgnum, const char *part, void bytes = extract_long(cret, 0); last_mod = extract_int(cret, 1); extract(mimetype, cret, 2); - ret = CtdlIPCHighSpeedReadDownload(ipc, buf, bytes, progress_gauge_callback, cret); + ret = CtdlIPCHighSpeedReadDownload(ipc, buf, bytes, 0, progress_gauge_callback, cret); ret = CtdlIPCEndDownload(ipc, cret); if (ret / 100 == 2) sprintf(cret, "%d|%ld|%s|%s", bytes, last_mod, @@ -1195,7 +1196,7 @@ int CtdlIPCImageDownload(CtdlIPC *ipc, const char *filename, void **buf, bytes = extract_long(cret, 0); last_mod = extract_int(cret, 1); extract(mimetype, cret, 2); - ret = CtdlIPCReadDownload(ipc, buf, bytes, progress_gauge_callback, cret); + ret = CtdlIPCReadDownload(ipc, buf, bytes, 0, progress_gauge_callback, cret); ret = CtdlIPCEndDownload(ipc, cret); if (ret / 100 == 2) sprintf(cret, "%d|%ld|%s|%s", bytes, last_mod, @@ -2074,7 +2075,7 @@ int CtdlIPCSpecifyPreferredFormats(CtdlIPC *ipc, char *cret, char *formats) { /* READ */ -int CtdlIPCReadDownload(CtdlIPC *ipc, void **buf, size_t bytes, +int CtdlIPCReadDownload(CtdlIPC *ipc, void **buf, size_t bytes, size_t resume, void (*progress_gauge_callback)(long, long), char *cret) { register size_t len; @@ -2084,7 +2085,7 @@ int CtdlIPCReadDownload(CtdlIPC *ipc, void **buf, size_t bytes, if (*buf) return -1; if (!ipc->downloading) return -1; - len = 0; + len = resume; if (progress_gauge_callback) progress_gauge_callback(len, bytes); while (len < bytes) { @@ -2105,7 +2106,8 @@ int CtdlIPCReadDownload(CtdlIPC *ipc, void **buf, size_t bytes, /* READ - pipelined */ int CtdlIPCHighSpeedReadDownload(CtdlIPC *ipc, void **buf, size_t bytes, - void (*progress_gauge_callback)(long, long), char *cret) + size_t resume, void (*progress_gauge_callback)(long, long), + char *cret) { register size_t len; register int calls; /* How many calls in the pipeline */ @@ -2117,7 +2119,7 @@ int CtdlIPCHighSpeedReadDownload(CtdlIPC *ipc, void **buf, size_t bytes, if (*buf) return -1; if (!ipc->downloading) return -1; - *buf = (void *)realloc(*buf, bytes); + *buf = (void *)realloc(*buf, bytes - resume); if (!*buf) return -1; len = 0; @@ -2126,12 +2128,12 @@ int CtdlIPCHighSpeedReadDownload(CtdlIPC *ipc, void **buf, size_t bytes, progress_gauge_callback(len, bytes); /* How many calls will be in the pipeline? */ - calls = bytes / 4096; - if (bytes % 4096) calls++; + calls = (bytes - resume) / 4096; + if ((bytes - resume) % 4096) calls++; /* Send all requests at once */ for (i = 0; i < calls; i++) { - sprintf(aaa, "READ %d|4096", i * 4096); + sprintf(aaa, "READ %d|4096", i * 4096 + resume); CtdlIPC_putline(ipc, aaa); } @@ -2775,7 +2777,7 @@ CtdlIPC* CtdlIPC_new(int argc, char **argv, char *hostbuf, char *portbuf) /* If we're using a unix domain socket we can do a bunch of stuff */ if (!strcmp(cithost, UDS)) { - snprintf(sockpath, sizeof sockpath, "citadel.socket"); + snprintf(sockpath, sizeof sockpath, BBSDIR "/citadel.socket"); ipc->sock = uds_connectsock(&(ipc->isLocal), sockpath); if (ipc->sock == -1) { ifree(ipc); diff --git a/citadel/citadel_ipc.h b/citadel/citadel_ipc.h index 25667072c..e1705acdc 100644 --- a/citadel/citadel_ipc.h +++ b/citadel/citadel_ipc.h @@ -164,7 +164,8 @@ int CtdlIPCMoveFile(CtdlIPC *ipc, const char *filename, const char *destroom, ch int CtdlIPCNetSendFile(CtdlIPC *ipc, const char *filename, const char *destnode, char *cret); int CtdlIPCOnlineUsers(CtdlIPC *ipc, char **listing, time_t *stamp, char *cret); int CtdlIPCFileDownload(CtdlIPC *ipc, const char *filename, void **buf, - void (*progress_gauge_callback)(long, long), char *cret); + size_t resume, void (*progress_gauge_callback)(long, long), + char *cret); int CtdlIPCAttachmentDownload(CtdlIPC *ipc, long msgnum, const char *part, void **buf, void (*progress_gauge_callback)(long, long), char *cret); int CtdlIPCImageDownload(CtdlIPC *ipc, const char *filename, void **buf, @@ -227,17 +228,19 @@ inline void CtdlIPC_lock(CtdlIPC *ipc); inline void CtdlIPC_unlock(CtdlIPC *ipc); char *CtdlIPCReadListing(CtdlIPC *ipc, char *dest); int CtdlIPCSendListing(CtdlIPC *ipc, const char *listing); -size_t CtdlIPCPartialRead(CtdlIPC *ipc, void **buf, size_t offset, size_t bytes, char *cret); +size_t CtdlIPCPartialRead(CtdlIPC *ipc, void **buf, size_t offset, + size_t bytes, char *cret); int CtdlIPCEndUpload(CtdlIPC *ipc, int discard, char *cret); int CtdlIPCWriteUpload(CtdlIPC *ipc, const char *path, void (*progress_gauge_callback)(long, long), char *cret); int CtdlIPCEndDownload(CtdlIPC *ipc, char *cret); -int CtdlIPCReadDownload(CtdlIPC *ipc, void **buf, size_t bytes, - void (*progress_gauge_callback)(long, long), char *cret); +int CtdlIPCReadDownload(CtdlIPC *ipc, void **buf, size_t bytes, size_t resume, + void (*progress_gauge_callback)(long, long), char *cret); int CtdlIPCHighSpeedReadDownload(CtdlIPC *ipc, void **buf, size_t bytes, - void (*progress_gauge_callback)(long, long), char *cret); -int CtdlIPCGenericCommand(CtdlIPC *ipc, const char *command, const char *to_send, - size_t bytes_to_send, char **to_receive, + size_t resume, void (*progress_gauge_callback)(long, long), + char *cret); +int CtdlIPCGenericCommand(CtdlIPC *ipc, const char *command, + const char *to_send, size_t bytes_to_send, char **to_receive, size_t *bytes_to_receive, char *proto_response); /* Internals */ diff --git a/citadel/rooms.c b/citadel/rooms.c index c97533a84..c843ea265 100644 --- a/citadel/rooms.c +++ b/citadel/rooms.c @@ -673,7 +673,7 @@ void download(CtdlIPC *ipc, int proto) /* Save to local disk, for folks with their own copy of the client */ if (proto == 5) { destination_directory(tempname, filename); - r = CtdlIPCFileDownload(ipc, filename, &file, progress, buf); + r = CtdlIPCFileDownload(ipc, filename, &file, 0, progress, buf); if (r / 100 != 2) { scr_printf("%s\n", buf); return; @@ -683,7 +683,7 @@ void download(CtdlIPC *ipc, int proto) return; } - r = CtdlIPCFileDownload(ipc, filename, &file, progress, buf); + r = CtdlIPCFileDownload(ipc, filename, &file, 0, progress, buf); if (r / 100 != 2) { scr_printf("%s\n", buf); return; -- 2.39.2