File kdepim3-gentoo-fix-imap4.patch of Package kdepim3

--- a/kioslaves/imap4/imap4.cc
+++ b/kioslaves/imap4/imap4.cc
@@ -167,9 +167,7 @@
 {
   outputBufferIndex = 0;
   mySSL = isSSL;
-  readBuffer[0] = 0x00;
   relayEnabled = false;
-  readBufferLen = 0;
   cacheOutput = false;
   decodeContent = false;
   mTimeOfLastNoop = QDateTime();
@@ -702,66 +700,60 @@
 
 bool IMAP4Protocol::parseReadLine (QByteArray & buffer, ulong relay)
 {
-  if (myHost.isEmpty()) return FALSE;
-
-  while (true) {
-    ssize_t copyLen = 0;
-    if (readBufferLen > 0)
-    {
-      while (copyLen < readBufferLen && readBuffer[copyLen] != '\n') copyLen++;
-      if (copyLen < readBufferLen) copyLen++;
-      if (relay > 0)
-      {
-        QByteArray relayData;
-
-        if (copyLen < (ssize_t) relay)
-          relay = copyLen;
-        relayData.setRawData (readBuffer, relay);
-        parseRelay (relayData);
-        relayData.resetRawData (readBuffer, relay);
-//        kdDebug(7116) << "relayed : " << relay << "d" << endl;
-      }
-      // append to buffer
-      {
-        QBuffer stream (buffer);
-
-        stream.open (IO_WriteOnly);
-        stream.at (buffer.size ());
-        stream.writeBlock (readBuffer, copyLen);
-        stream.close ();
-//        kdDebug(7116) << "appended " << copyLen << "d got now " << buffer.size() << endl;
-      }
-
-      readBufferLen -= copyLen;
-      if (readBufferLen)
-        memmove(readBuffer, &readBuffer[copyLen], readBufferLen);
-      if (buffer[buffer.size() - 1] == '\n') return TRUE;
-    }
+  // FIXME (Serghei): i'm not sure about role of "relay"
+
+  if(myHost.isEmpty())
+    return false;
+
+  // default error
+  int errorStatus = ERR_CONNECTION_BROKEN;
+
+  // open buffer stream
+  QBuffer stream(buffer);
+  stream.open(IO_WriteOnly);
+  stream.at(buffer.size());
+
+  for (;;)
+  {
     if (!isConnectionValid())
     {
       kdDebug(7116) << "parseReadLine - connection broken" << endl;
-      error (ERR_CONNECTION_BROKEN, myHost);
-      setState(ISTATE_CONNECT);
-      closeConnection();
-      return FALSE;
-    }
-    if (!waitForResponse( responseTimeout() ))
-    {
-      error(ERR_SERVER_TIMEOUT, myHost);
-      setState(ISTATE_CONNECT);
-      closeConnection();
-      return FALSE;
-    }
-    readBufferLen = read(readBuffer, IMAP_BUFFER - 1);
-    if (readBufferLen == 0)
-    {
-      kdDebug(7116) << "parseReadLine: readBufferLen == 0 - connection broken" << endl;
-      error (ERR_CONNECTION_BROKEN, myHost);
-      setState(ISTATE_CONNECT);
-      closeConnection();
-      return FALSE;
-    }
-  }
+      break;
+    }
+
+    if (!waitForResponse(responseTimeout()))
+    {
+      kdDebug(7116) << "parseReadLine - connection timeout" << endl;
+      errorStatus = ERR_SERVER_TIMEOUT;
+      break;
+    }
+
+    char buf[4096];
+    int len = readLine(buf, sizeof(buf));
+
+    if (0 >= len)
+    {
+      kdDebug(7116) << "parseReadLine - read line error" << endl;
+      break;
+    }
+
+    stream.writeBlock(buf, len);
+
+    // len is always bigger than zero,
+    // is safe to substract it by 1
+    if ('\n' == buf[len - 1])
+    {
+      stream.close();
+      return true;
+    }
+  }
+
+  // error
+  stream.close();
+  error(errorStatus, myHost);
+  setState(ISTATE_CONNECT);
+  closeConnection();
+  return false;
 }
 
 void
@@ -2008,7 +2000,6 @@
   sentQueue.clear();
   lastHandled = 0;
   currentBox = QString::null;
-  readBufferLen = 0;
 }
 
 bool IMAP4Protocol::makeLogin ()
@@ -2640,16 +2631,12 @@
 
 ssize_t IMAP4Protocol::myRead(void *data, ssize_t len)
 {
-  if (readBufferLen)
-  {
-    ssize_t copyLen = (len < readBufferLen) ? len : readBufferLen;
-    memcpy(data, readBuffer, copyLen);
-    readBufferLen -= copyLen;
-    if (readBufferLen) memcpy(readBuffer, &readBuffer[copyLen], readBufferLen);
-    return copyLen;
-  }
-  if (!isConnectionValid()) return 0;
-  waitForResponse( responseTimeout() );
+  if (!isConnectionValid())
+    return 0;
+
+  if (!waitForResponse(responseTimeout()))
+    return 0;
+
   return read(data, len);
 }
 
openSUSE Build Service is sponsored by