1 // This may look like C code, but it is really -*- C++ -*- 2 // 3 // Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2004 4 // Copyright Dirk Lemstra 2013-2015 5 // 6 // Implementation of Blob 7 // 8 9 #define MAGICKCORE_IMPLEMENTATION 1 10 #define MAGICK_PLUSPLUS_IMPLEMENTATION 1 11 12 #include "Magick++/Include.h" 13 #include "Magick++/Blob.h" 14 #include "Magick++/BlobRef.h" 15 16 #include <string.h> 17 18 Magick::Blob::Blob(void) 19 : _blobRef(new Magick::BlobRef(0,0)) 20 { 21 } 22 23 Magick::Blob::Blob(const void* data_,const size_t length_) 24 : _blobRef(new Magick::BlobRef(data_, length_)) 25 { 26 } 27 28 Magick::Blob::Blob(const Magick::Blob& blob_) 29 : _blobRef(blob_._blobRef) 30 { 31 // Increase reference count 32 _blobRef->increase(); 33 } 34 35 Magick::Blob::~Blob() 36 { 37 if (_blobRef->decrease() == 0) 38 delete _blobRef; 39 40 _blobRef=(Magick::BlobRef *) NULL; 41 } 42 43 Magick::Blob& Magick::Blob::operator=(const Magick::Blob& blob_) 44 { 45 if (this != &blob_) 46 { 47 blob_._blobRef->increase(); 48 if (_blobRef->decrease() == 0) 49 delete _blobRef; 50 51 _blobRef=blob_._blobRef; 52 } 53 return(*this); 54 } 55 56 void Magick::Blob::base64(const std::string base64_) 57 { 58 size_t 59 length; 60 61 unsigned char 62 *decoded; 63 64 decoded=Base64Decode(base64_.c_str(),&length); 65 66 if(decoded) 67 updateNoCopy(static_cast<void*>(decoded),length, 68 Magick::Blob::MallocAllocator); 69 } 70 71 std::string Magick::Blob::base64(void) const 72 { 73 size_t 74 encoded_length; 75 76 char 77 *encoded; 78 79 std::string 80 result; 81 82 encoded_length=0; 83 encoded=Base64Encode(static_cast<const unsigned char*>(data()),length(), 84 &encoded_length); 85 86 if(encoded) 87 { 88 result=std::string(encoded,encoded_length); 89 encoded=(char *) RelinquishMagickMemory(encoded); 90 return result; 91 } 92 93 return(std::string()); 94 } 95 96 const void* Magick::Blob::data(void) const 97 { 98 return(_blobRef->data); 99 } 100 101 size_t Magick::Blob::length(void) const 102 { 103 return(_blobRef->length); 104 } 105 106 void Magick::Blob::update(const void* data_,size_t length_) 107 { 108 if (_blobRef->decrease() == 0) 109 delete _blobRef; 110 111 _blobRef=new Magick::BlobRef(data_,length_); 112 } 113 114 void Magick::Blob::updateNoCopy(void* data_,size_t length_, 115 Magick::Blob::Allocator allocator_) 116 { 117 if (_blobRef->decrease() == 0) 118 delete _blobRef; 119 120 _blobRef=new Magick::BlobRef((const void*) NULL,0); 121 _blobRef->data=data_; 122 _blobRef->length=length_; 123 _blobRef->allocator=allocator_; 124 } 125 126