-/* $Id$
- *
+/*
* Copyright (c) 1987-2009 by the citadel.org team
*
* This program is free software; you can redistribute it and/or modify
int client_read_sslblob(StrBuf *Target, long bytes, int timeout)
{
- long bufremain;
long baselen;
+ long RemainRead;
int retval = 0;
CitContext *CCC = CC;
baselen = StrLength(Target);
- if (CCC->Pos == NULL)
- CCC->Pos = ChrPtr(CCC->ReadBuf);
- bufremain = StrLength(CCC->ReadBuf) -
- (CCC->Pos - ChrPtr(CCC->ReadBuf));
+ if (StrLength(CCC->RecvBuf.Buf) > 0)
+ {
+ long RemainLen;
+ long TotalLen;
+ const char *pchs;
+
+ if (CCC->RecvBuf.ReadWritePointer == NULL)
+ CCC->RecvBuf.ReadWritePointer = ChrPtr(CCC->RecvBuf.Buf);
+ pchs = ChrPtr(CCC->RecvBuf.Buf);
+ TotalLen = StrLength(CCC->RecvBuf.Buf);
+ RemainLen = TotalLen - (pchs - CCC->RecvBuf.ReadWritePointer);
+ if (RemainLen > bytes)
+ RemainLen = bytes;
+ if (RemainLen > 0)
+ {
+ StrBufAppendBufPlain(Target,
+ CCC->RecvBuf.ReadWritePointer,
+ RemainLen, 0);
+ CCC->RecvBuf.ReadWritePointer += RemainLen;
+ }
+ if ((ChrPtr(CCC->RecvBuf.Buf) + StrLength(CCC->RecvBuf.Buf)) <= CCC->RecvBuf.ReadWritePointer)
+ {
+ CCC->RecvBuf.ReadWritePointer = NULL;
+ FlushStrBuf(CCC->RecvBuf.Buf);
+ }
+ }
+
+ if (StrLength(Target) >= bytes + baselen)
+ return 1;
- if (bytes < bufremain)
- bufremain = bytes;
- StrBufAppendBufPlain(Target, CCC->Pos, bufremain, 0);
- StrBufCutLeft(CCC->ReadBuf, bufremain);
- CCC->Pos = NULL;
+ CCC->RecvBuf.ReadWritePointer = NULL;
- if (bytes > bufremain)
+ while ((StrLength(Target) < bytes + baselen) &&
+ (retval >= 0))
{
- while ((StrLength(CCC->ReadBuf) + StrLength(Target) < bytes + baselen) &&
- (retval >= 0))
- retval = client_read_sslbuffer(CCC->ReadBuf, timeout);
+ retval = client_read_sslbuffer(CCC->RecvBuf.Buf, timeout);
if (retval >= 0) {
- StrBufAppendBuf(Target, CCC->ReadBuf, 0); /* todo: Buf > bytes? */
- return 1;
+ RemainRead = bytes - (StrLength (Target) - baselen);
+ if (RemainRead < StrLength(CCC->RecvBuf.Buf))
+ {
+ StrBufAppendBufPlain(
+ Target,
+ ChrPtr(CCC->RecvBuf.Buf),
+ RemainRead, 0);
+ CCC->RecvBuf.ReadWritePointer = ChrPtr(CCC->RecvBuf.Buf) + RemainRead;
+ break;
+ }
+ StrBufAppendBuf(Target, CCC->RecvBuf.Buf, 0); /* todo: Buf > bytes? */
+ FlushStrBuf(CCC->RecvBuf.Buf);
}
- else {
+ else
+ {
+ FlushStrBuf(CCC->RecvBuf.Buf);
return -1;
+
}
}
- else
- return 1;
+ return 1;
}