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 qDebug(
"QGpgME::QByteArrayDataProvider::read( %p, %d )", buffer, bufSize );
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 }