dataprovider.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifdef HAVE_CONFIG_H
00023 #include <config.h>
00024 #endif
00025
00026 #include <qgpgme/dataprovider.h>
00027
00028 #include <string.h>
00029 #include <errno.h>
00030 #include <assert.h>
00031 #include <unistd.h>
00032
00033 static bool resizeAndInit( QByteArray & ba, size_t newSize ) {
00034 const size_t oldSize = ba.size();
00035 bool ok = ba.resize( newSize );
00036 if ( ok )
00037 memset( ba.data() + oldSize, 0, newSize - oldSize );
00038 return ok;
00039 }
00040
00041 QGpgME::QByteArrayDataProvider::QByteArrayDataProvider()
00042 : GpgME::DataProvider(), mOff( 0 ) {}
00043
00044 QGpgME::QByteArrayDataProvider::QByteArrayDataProvider( const QByteArray & initialData )
00045 : GpgME::DataProvider(), mArray( initialData ), mOff( 0 ) {}
00046
00047 QGpgME::QByteArrayDataProvider::~QByteArrayDataProvider() {}
00048
00049 ssize_t QGpgME::QByteArrayDataProvider::read( void * buffer, size_t bufSize ) {
00050
00051 if ( bufSize == 0 )
00052 return 0;
00053 if ( mOff >= mArray.size() )
00054 return 0;
00055 size_t amount = QMIN( bufSize, mArray.size() - mOff );
00056 assert( amount > 0 );
00057 memcpy( buffer, mArray.data() + mOff, amount );
00058 mOff += amount;
00059 return amount;
00060 }
00061
00062 ssize_t QGpgME::QByteArrayDataProvider::write( const void * buffer, size_t bufSize ) {
00063 qDebug( "QGpgME::QByteArrayDataProvider::write( %p, %d )", buffer, bufSize );
00064 if ( bufSize == 0 )
00065 return 0;
00066 if ( mOff >= mArray.size() )
00067 resizeAndInit( mArray, mOff + bufSize );
00068 if ( mOff >= mArray.size() ) {
00069 errno = EIO;
00070 return -1;
00071 }
00072 assert( bufSize <= mArray.size() - mOff );
00073 memcpy( mArray.data() + mOff, buffer, bufSize );
00074 mOff += bufSize;
00075 return bufSize;
00076 }
00077
00078 off_t QGpgME::QByteArrayDataProvider::seek( off_t offset, int whence ) {
00079 qDebug( "QGpgME::QByteArrayDataProvider::seek( %d, %d )", int(offset), whence );
00080 int newOffset = mOff;
00081 switch ( whence ) {
00082 case SEEK_SET:
00083 newOffset = offset;
00084 break;
00085 case SEEK_CUR:
00086 newOffset += offset;
00087 break;
00088 case SEEK_END:
00089 newOffset = mArray.size() + offset;
00090 break;
00091 default:
00092 errno = EINVAL;
00093 return (off_t)-1;
00094 }
00095 return mOff = newOffset;
00096 }
00097
00098 void QGpgME::QByteArrayDataProvider::release() {
00099 qDebug( "QGpgME::QByteArrayDataProvider::release()" );
00100 mArray = QByteArray();
00101 }
This file is part of the documentation for libkdenetwork Library Version 3.3.2.