]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/crypto/serv_crypto.c
Use IOBuffer with its StrBuf + const char* inside instead of having two of them
[citadel.git] / citadel / modules / crypto / serv_crypto.c
index a5b5632398e4bd7370feb63b52f12b9cefba7fe4..66693a7927c8669737bf3b83597c7499b72ee4d2 100644 (file)
@@ -1,5 +1,4 @@
-/* $Id$
- *
+/*
  * Copyright (c) 1987-2009 by the citadel.org team
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -559,39 +558,71 @@ int client_readline_sslbuffer(StrBuf *Line, StrBuf *IOBuf, const char **Pos, int
 
 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;
 }