X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=webcit%2Ftcp_sockets.c;h=696dfc3ae76dd73357765e98aca5cbbc9dfadaee;hp=2ee3cb27e0b81e0289c766cdc70eadf97d1797a3;hb=d1dc3f670a90681177131b9fe656503c0f1a1147;hpb=49bc8625b31191cb87276fce46695f8badfe4105 diff --git a/webcit/tcp_sockets.c b/webcit/tcp_sockets.c index 2ee3cb27e..696dfc3ae 100644 --- a/webcit/tcp_sockets.c +++ b/webcit/tcp_sockets.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1987-2010 by the citadel.org team + * Copyright (c) 1987-2011 by the citadel.org team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -381,116 +381,45 @@ void serv_printf(const char *format,...) } - -/** - * Read binary data from server into memory using a series of - * server READ commands. - * \return the read content as StrBuf +/* + * Read binary data from server into memory using a series of server READ commands. + * returns the read content as StrBuf */ int serv_read_binary(StrBuf *Ret, size_t total_len, StrBuf *Buf) { wcsession *WCC = WC; - size_t bytes = 0; - size_t thisblock = 0; - - if (Ret == NULL) - return -1; + size_t bytes_read = 0; + size_t this_block = 0; + int rc; - if (MaxRead == -1) - { - serv_printf("READ %d|"SIZE_T_FMT, 0, total_len); - if (StrBuf_ServGetln(Buf) > 0) - { - long YetRead; - const char *ErrStr; - const char *pch; - int rc; - - if (GetServerStatus(Buf, NULL) == 6) - { - StrBufCutLeft(Buf, 4); - thisblock = StrTol(Buf); - if (WCC->serv_sock==-1) { - FlushStrBuf(Ret); - return -1; - } - - if (WCC->ReadPos != NULL) { - pch = ChrPtr(WCC->ReadBuf); - - YetRead = WCC->ReadPos - pch; - if (YetRead > 0) - { - long StillThere; - - StillThere = StrLength(WCC->ReadBuf) - - YetRead; - - StrBufPlain(Ret, - WCC->ReadPos, - StillThere); - total_len -= StillThere; - } - FlushStrBuf(WCC->ReadBuf); - WCC->ReadPos = NULL; - } - if (total_len > 0) - { - rc = StrBufReadBLOB(Ret, - &WCC->serv_sock, - 1, - total_len, - &ErrStr); - if (rc < 0) - { - lprintf(1, "Server connection broken: %s\n", - (ErrStr)?ErrStr:""); - wc_backtrace(); - WCC->serv_sock = (-1); - WCC->connected = 0; - WCC->logged_in = 0; - return rc; - } - else - return StrLength(Ret); - } - else - return StrLength(Ret); - } - } - else - return -1; + if (Ret == NULL) { + return -1; } - else while ((WCC->serv_sock!=-1) && - (bytes < total_len)) { - thisblock = MaxRead; - if ((total_len - bytes) < thisblock) { - thisblock = total_len - bytes; - if (thisblock == 0) { - FlushStrBuf(Ret); - return -1; - } + + while (bytes_read < total_len) { + + if (WCC->serv_sock==-1) { + FlushStrBuf(Ret); + return -1; } - serv_printf("READ %d|%d", (int)bytes, (int)thisblock); - if (StrBuf_ServGetln(Buf) > 0) - { - if (GetServerStatus(Buf, NULL) == 6) - { - StrBufCutLeft(Buf, 4); - thisblock = StrTol(Buf); - if (WCC->serv_sock==-1) { - FlushStrBuf(Ret); - return -1; - } - StrBuf_ServGetBLOBBuffered(Ret, thisblock); - bytes += thisblock; - } - else { - lprintf(3, "Error: %s\n", ChrPtr(Buf) + 4); - return -1; - } + + serv_printf("READ %d|%d", bytes_read, total_len-bytes_read); + if ( (StrBuf_ServGetln(Buf) > 0) && (GetServerStatus(Buf, NULL) == 6) ) { + StrBufCutLeft(Buf, 4); + this_block = StrTol(Buf); + rc = StrBuf_ServGetBLOBBuffered(Ret, this_block); + if (rc < 0) { + lprintf(1, "Server connection broken during download\n"); + wc_backtrace(); + WCC->serv_sock = (-1); + WCC->connected = 0; + WCC->logged_in = 0; + return rc; + } + bytes_read += rc; } } + return StrLength(Ret); }