[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    kdepim/kioslaves/sieve
From:       Marc Mutz <Marc.Mutz () uni-bielefeld ! de>
Date:       2004-10-24 17:10:38
Message-ID: 20041024171038.934099908 () office ! kde ! org
[Download RAW message or body]

CVS commit by mutz: 

From KDE_3_3_BRANCH:
BUG:76314
Patch as posted here, plus a limitation of the receive buffer to 64K


  M +32 -15    sieve.cpp   1.15


--- kdepim/kioslaves/sieve/sieve.cpp  #1.14:1.15
@@ -39,4 +39,5 @@ extern "C" {
 #include <kurl.h>
 #include <kmdcodec.h>
+#include <kglobal.h>
 
 #include <qcstring.h>
@@ -647,23 +648,39 @@ void kio_sieveProtocol::get(const KURL& 
         if (receiveData() && r.getType() == kio_sieveResponse::QUANTITY) {
                 // determine script size
-                ssize_t bufLen = r.getQuantity();
-                totalSize( bufLen );
+                ssize_t total_len = r.getQuantity();
+                totalSize( total_len );
 
-                QByteArray dat( bufLen );
-                ssize_t readLen = read( dat.data(), dat.size() );
+                int recv_len = 0;
+                do {
+                  // wait for data...
+                  if ( !waitForResponse( 600 ) ) {
+                    error( KIO::ERR_SERVER_TIMEOUT, m_sServer );
+                    disconnect( true );
+                    return;
+                  }
                 
-                if (readLen != bufLen) {
-                        error(ERR_COULD_NOT_READ, i18n("Network error."));
-                        disconnect(true);
+                  // ...read data...
+                  // Only read as much as we need, otherwise we slurp in the OK that
+                  // operationSuccessful() is expecting below.
+                  QByteArray dat( kMin( total_len - recv_len, 64 * 1024 ) );
+                  ssize_t this_recv_len = read( dat.data(), dat.size() );
+
+                  if ( this_recv_len < 1 && !isConnectionValid() ) {
+                    error( KIO::ERR_CONNECTION_BROKEN, m_sServer );
+                    disconnect( true );
                         return;
                 }
 
+                  dat.resize( this_recv_len );
                 inplace_crlf2lf( dat );
                 // send data to slaveinterface
-                data(dat);
-                processedSize(readLen);
-                data(QByteArray());
+                  data( dat );
+
+                  recv_len += this_recv_len;
+                  processedSize( recv_len );
+                } while ( recv_len < total_len );
 
                 infoMessage(i18n("Finishing up...") );
+                data(QByteArray());
 
                 if (operationSuccessful())


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic