data.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifdef HAVE_CONFIG_H
00022 #include <config.h>
00023 #endif
00024
00025 #include <gpgmepp/context.h>
00026 #include <gpgmepp/interfaces/dataprovider.h>
00027 #include "data_p.h"
00028
00029 #include <gpgme.h>
00030
00031 #ifndef NDEBUG
00032 #include <iostream>
00033 #endif
00034
00035 GpgME::Data::Private::~Private() {
00036 if ( data )
00037 gpgme_data_release( data );
00038 }
00039
00040 GpgME::Data GpgME::Data::null( (gpgme_data_t)0 );
00041
00042 GpgME::Data::Data() {
00043 gpgme_data_t data;
00044 const gpgme_error_t e = gpgme_data_new( &data );
00045 d = new Private( e ? 0 : data );
00046 d->ref();
00047 }
00048
00049 GpgME::Data::Data( gpgme_data_t data ) {
00050 d = new Private( data );
00051 d->ref();
00052 }
00053
00054 GpgME::Data::Data( const Data & other )
00055 : d( other.d )
00056 {
00057 d->ref();
00058 }
00059
00060 GpgME::Data::~Data() {
00061 d->unref(); d = 0;
00062 }
00063
00064
00065 const GpgME::Data & GpgME::Data::operator=( const Data & other ) {
00066 if ( this->d == other.d ) return *this;
00067
00068 if ( other.d )
00069 other.d->ref();
00070 if ( this->d )
00071 this->d->unref();
00072 this->d = other.d;
00073
00074 return *this;
00075 }
00076
00077 GpgME::Data::Data( const char * buffer, size_t size, bool copy ) {
00078 gpgme_data_t data;
00079 const gpgme_error_t e = gpgme_data_new_from_mem( &data, buffer, size, int( copy ) );
00080 d = new Private( e ? 0 : data );
00081 d->ref();
00082 }
00083
00084 GpgME::Data::Data( const char * filename ) {
00085 gpgme_data_t data;
00086 const gpgme_error_t e = gpgme_data_new_from_file( &data, filename, 1 );
00087 d = new Private( e ? 0 : data );
00088 d->ref();
00089 }
00090
00091 GpgME::Data::Data( const char * filename, off_t offset, size_t length ) {
00092 gpgme_data_t data;
00093 const gpgme_error_t e = gpgme_data_new_from_filepart( &data, filename, 0, offset, length );
00094 d = new Private( e ? 0 : data );
00095 d->ref();
00096 }
00097
00098 GpgME::Data::Data( FILE * fp ) {
00099 gpgme_data_t data;
00100 const gpgme_error_t e = gpgme_data_new_from_stream( &data, fp );
00101 d = new Private( e ? 0 : data );
00102 d->ref();
00103 }
00104
00105 GpgME::Data::Data( FILE * fp, off_t offset, size_t length ) {
00106 gpgme_data_t data;
00107 const gpgme_error_t e = gpgme_data_new_from_filepart( &data, 0, fp, offset, length );
00108 d = new Private( e ? 0 : data );
00109 d->ref();
00110 }
00111
00112 GpgME::Data::Data( int fd ) {
00113 gpgme_data_t data;
00114 const gpgme_error_t e = gpgme_data_new_from_fd( &data, fd );
00115 d = new Private( e ? 0 : data );
00116 d->ref();
00117 }
00118
00119 GpgME::Data::Data( DataProvider * dp ) {
00120 d = new Private();
00121 d->ref();
00122 if ( !dp )
00123 return;
00124 if ( !dp->isSupported( DataProvider::Read ) )
00125 d->cbs.read = 0;
00126 if ( !dp->isSupported( DataProvider::Write ) )
00127 d->cbs.write = 0;
00128 if ( !dp->isSupported( DataProvider::Seek ) )
00129 d->cbs.seek = 0;
00130 if ( !dp->isSupported( DataProvider::Release ) )
00131 d->cbs.release = 0;
00132 const gpgme_error_t e = gpgme_data_new_from_cbs( &d->data, &d->cbs, dp );
00133 if ( e )
00134 d->data = 0;
00135 #ifndef NDEBUG
00136 std::cerr << "GpgME::Data(): DataProvider supports: "
00137 << ( d->cbs.read ? "read" : "no read" ) << ", "
00138 << ( d->cbs.write ? "write" : "no write" ) << ", "
00139 << ( d->cbs.seek ? "seek" : "no seek" ) << ", "
00140 << ( d->cbs.release ? "release" : "no release" ) << std::endl;
00141 #endif
00142 }
00143
00144
00145
00146 bool GpgME::Data::isNull() const {
00147 return !d || !d->data;
00148 }
00149
00150 ssize_t GpgME::Data::read( void * buffer, size_t length ) {
00151 return gpgme_data_read( d->data, buffer, length );
00152 }
00153
00154 ssize_t GpgME::Data::write( const void * buffer, size_t length ) {
00155 return gpgme_data_write( d->data, buffer, length );
00156 }
00157
00158 off_t GpgME::Data::seek( off_t offset, int whence ) {
00159 return gpgme_data_seek( d->data, offset, whence );
00160 }
This file is part of the documentation for libkdenetwork Library Version 3.3.2.