libkdenetwork Library API Documentation

data.cpp

00001 /* data.cpp - wraps a gpgme data object
00002    Copyright (C) 2003 Klarälvdalens Datakonsult AB
00003 
00004    This file is part of GPGME++.
00005  
00006    GPGME++ is free software; you can redistribute it and/or modify it
00007    under the terms of the GNU General Public License as published by
00008    the Free Software Foundation; either version 2 of the License, or
00009    (at your option) any later version.
00010  
00011    GPGME++ is distributed in the hope that it will be useful, but
00012    WITHOUT ANY WARRANTY; without even the implied warranty of
00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014    General Public License for more details.
00015 
00016    You should have received a copy of the GNU General Public License
00017    along with GPGME++; if not, write to the Free Software Foundation,
00018    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA.
00019 */
00020 
00021 #ifdef HAVE_CONFIG_H
00022 #include <config.h>
00023 #endif
00024 
00025 #include <gpgmepp/context.h> // Error
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 }
KDE Logo
This file is part of the documentation for libkdenetwork Library Version 3.3.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu May 3 20:16:58 2007 by doxygen 1.4.2 written by Dimitri van Heesch, © 1997-2003