00001
00002
00003
00004
00005
00006
00007
00008 #define MAGICK_IMPLEMENTATION 1
00009
00010
#include "Magick++/Include.h"
00011
#include "Magick++/Blob.h"
00012
#include "Magick++/BlobRef.h"
00013
00014
#include <string.h>
00015
00016
00017
00018
00019
00020
00021 Magick::Blob::Blob (
void )
00022 : _blobRef(new Magick::
BlobRef( 0, 0 ))
00023 {
00024 }
00025
00026
00027 Magick::Blob::Blob (
const void* data_, size_t length_ )
00028 : _blobRef(new Magick::
BlobRef( data_, length_ ))
00029 {
00030 }
00031
00032
00033 Magick::Blob::Blob (
const Magick::Blob& blob_ )
00034 : _blobRef(blob_._blobRef)
00035 {
00036
00037
Lock( &
_blobRef->
_mutexLock );
00038 ++
_blobRef->
_refCount;
00039 }
00040
00041
00042 Magick::Blob::~Blob ()
00043 {
00044
bool doDelete =
false;
00045 {
00046
Lock( &
_blobRef->
_mutexLock );
00047
if ( --
_blobRef->
_refCount == 0 )
00048 doDelete =
true;
00049 }
00050
00051
if ( doDelete )
00052 {
00053
00054
delete _blobRef;
00055 }
00056
_blobRef=0;
00057 }
00058
00059
00060 Magick::Blob& Magick::Blob::operator= (
const Magick::Blob& blob_ )
00061 {
00062
if(
this != &blob_)
00063 {
00064 {
00065
Lock( &blob_.
_blobRef->
_mutexLock );
00066 ++blob_.
_blobRef->
_refCount;
00067 }
00068
bool doDelete =
false;
00069 {
00070
Lock( &
_blobRef->
_mutexLock );
00071
if ( --
_blobRef->
_refCount == 0 )
00072 doDelete =
true;
00073 }
00074
if ( doDelete )
00075 {
00076
delete _blobRef;
00077 }
00078
_blobRef = blob_.
_blobRef;
00079 }
00080
return *
this;
00081 }
00082
00083
00084 void Magick::Blob::base64 (
const std::string base64_ )
00085 {
00086 size_t
length;
00087
00088
unsigned char *decoded =
00089
Base64Decode( base64_.c_str(), &length );
00090
00091
if(decoded)
00092
updateNoCopy( static_cast<void*>(decoded), length,
00093
Magick::Blob::MallocAllocator );
00094 }
00095
00096
00097 std::string
Magick::Blob::base64 (
void )
00098 {
00099 size_t encoded_length = 0;
00100
00101
char *encoded =
00102
Base64Encode(static_cast<const unsigned char*>(
data()),
length(), &encoded_length);
00103
00104
if(encoded)
00105 {
00106 std::string result(encoded,encoded_length);
00107 encoded=(
char *)
RelinquishMagickMemory(encoded);
00108
return result;
00109 }
00110
00111
return std::string();
00112 }
00113
00114
00115
00116 void Magick::Blob::update (
const void* data_, size_t length_ )
00117 {
00118
bool doDelete =
false;
00119 {
00120
Lock( &
_blobRef->
_mutexLock );
00121
if ( --
_blobRef->
_refCount == 0 )
00122 doDelete =
true;
00123 }
00124
if ( doDelete )
00125 {
00126
00127
delete _blobRef;
00128 }
00129
00130
_blobRef =
new Magick::BlobRef( data_, length_ );
00131 }
00132
00133
00134
00135
00136
00137 void Magick::Blob::updateNoCopy (
void* data_, size_t length_,
00138 Magick::Blob::Allocator allocator_ )
00139 {
00140
bool doDelete =
false;
00141 {
00142
Lock( &
_blobRef->
_mutexLock );
00143
if ( --
_blobRef->
_refCount == 0 )
00144 doDelete =
true;
00145 }
00146
if ( doDelete )
00147 {
00148
00149
delete _blobRef;
00150 }
00151
_blobRef =
new Magick::BlobRef( 0, 0 );
00152
_blobRef->
_data = data_;
00153
_blobRef->
_length = length_;
00154
_blobRef->
_allocator = allocator_;
00155 }
00156
00157
00158 const void*
Magick::Blob::data(
void )
const
00159
{
00160
return _blobRef->
_data;
00161 }
00162
00163
00164 size_t
Magick::Blob::length(
void )
const
00165
{
00166
return _blobRef->
_length;
00167 }
00168