* IPC support for resumable downloads
authorMichael Hampton <io_error@uncensored.citadel.org>
Tue, 15 Oct 2002 06:47:11 +0000 (06:47 +0000)
committerMichael Hampton <io_error@uncensored.citadel.org>
Tue, 15 Oct 2002 06:47:11 +0000 (06:47 +0000)
citadel/ChangeLog
citadel/citadel_ipc.c
citadel/citadel_ipc.h
citadel/rooms.c

index e0f0483b123c972e88cd05e9e1aa1926376d85dc..cef2bd98bddeba1bcbf08a11cb62b20888744c15 100644 (file)
@@ -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 <bryant@cs.usm.maine.edu>
 
 Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
        * Initial CVS import
+
index 93ad9ce65a341c979a91e9176726577fa9458fe3..fb5633203c34de9a4f09ab998bac29960ff80c3a 100644 (file)
@@ -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);
index 25667072c8d8875370c666602bbfa7553f2283b3..e1705acdc758ce4cf593f23af80376e56bc27bec 100644 (file)
@@ -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 */
index c97533a840a80ad65ef9c47ed19ec9c55f9b2e03..c843ea265f33596acdffd97bf1996516874ddfb9 100644 (file)
@@ -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;