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

List:       kde-commits
Subject:    branches/kdepim/enterprise4/kdepimlibs/qgpgme
From:       Frank Osterfeld <frank.osterfeld () kdemail ! net>
Date:       2008-06-23 17:47:13
Message-ID: 1214243233.207190.9702.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 823589 by osterfeld:

atEnd obviously does not work, so let's use another workaround

 M  +22 -4     dataprovider.cpp  
 M  +1 -0      dataprovider.h  


--- branches/kdepim/enterprise4/kdepimlibs/qgpgme/dataprovider.cpp #823588:823589
@@ -133,7 +133,8 @@
 
 QIODeviceDataProvider::QIODeviceDataProvider( const boost::shared_ptr<QIODevice> & \
io )  : GpgME::DataProvider(),
-    mIO( io )
+    mIO( io ),
+    mErrorOccurred( false )
 {
   assert( mIO );
 }
@@ -150,6 +151,14 @@
     }
 }
 
+namespace {
+    struct Enabler {
+        explicit Enabler( bool* b_ ) : b( b_) {}
+        ~Enabler() { if ( b ) *b = true; }
+        bool* const b;
+    };
+}
+
 ssize_t QIODeviceDataProvider::read( void * buffer, size_t bufSize ) {
 #ifndef NDEBUG
   //qDebug( "QIODeviceDataProvider::read( %p, %d )", buffer, bufSize );
@@ -160,10 +169,18 @@
     errno = EINVAL;
     return -1;
   }
+  //workaround: some QIODevices (known example: QProcess) might not return 0 (EOF), \
but immediately -1 when finished. If no +  //errno is set, gpgme doesn't detect the \
error and loops forever. So return 0 on the very first -1 in case errno is 0  
-  if ( mIO->atEnd() ) //eof
-      return 0;
-  return mIO->read( static_cast<char*>(buffer), bufSize );
+  const qint64 numRead = mIO->read( static_cast<char*>(buffer), bufSize );
+
+  Enabler en( numRead < 0 ? &mErrorOccurred : 0 );
+  if ( numRead < 0 && errno == 0 )
+      if ( mErrorOccurred )
+          errno = EIO;
+      else
+          return 0;
+  return numRead;
 }
 
 ssize_t QIODeviceDataProvider::write( const void * buffer, size_t bufSize ) {
@@ -176,6 +193,7 @@
      errno = EINVAL;
      return -1;
   }
+
   return mIO->write( static_cast<const char*>(buffer), bufSize );
 }
 
--- branches/kdepim/enterprise4/kdepimlibs/qgpgme/dataprovider.h #823588:823589
@@ -83,6 +83,7 @@
 
   private:
     const boost::shared_ptr<QIODevice> mIO;
+    bool mErrorOccurred;
   };
 
 } // namespace QGpgME


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

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