[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