/*
- * 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
}
-
-/**
- * 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);
}