Magick++  6.9.3
Blob.cpp
Go to the documentation of this file.
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 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 
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 
29  : _blobRef(blob_._blobRef)
30 {
31  // Increase reference count
32  Lock lock(&_blobRef->_mutexLock);
33  ++_blobRef->_refCount;
34 }
35 
37 {
38  bool doDelete=false;
39  {
40  Lock lock(&_blobRef->_mutexLock);
41  if (--_blobRef->_refCount == 0)
42  doDelete=true;
43  }
44 
45  if (doDelete)
46  {
47  // Delete old blob reference with associated data
48  delete _blobRef;
49  }
50  _blobRef=0;
51 }
52 
54 {
55  bool
56  doDelete;
57 
58  if (this != &blob_)
59  {
60  {
61  Lock lock(&blob_._blobRef->_mutexLock);
62  ++blob_._blobRef->_refCount;
63  }
64  doDelete=false;
65  {
66  Lock lock(&_blobRef->_mutexLock);
67  if (--_blobRef->_refCount == 0)
68  doDelete=true;
69  }
70  if (doDelete)
71  {
72  delete _blobRef;
73  }
74  _blobRef=blob_._blobRef;
75  }
76  return(*this);
77 }
78 
79 void Magick::Blob::base64(const std::string base64_)
80 {
81  size_t
82  length;
83 
84  unsigned char
85  *decoded;
86 
87  decoded=Base64Decode(base64_.c_str(),&length);
88  if (decoded)
89  updateNoCopy(static_cast<void*>(decoded),length,
91 }
92 
93 std::string Magick::Blob::base64(void)
94 {
95  char
96  *encoded;
97 
98  size_t
99  encoded_length;
100 
101  std::string
102  result;
103 
104  encoded_length=0;
105  encoded=Base64Encode(static_cast<const unsigned char*>(data()),length(),
106  &encoded_length);
107 
108  if (encoded)
109  {
110  result=std::string(encoded,encoded_length);
111  encoded=(char *) RelinquishMagickMemory(encoded);
112  return result;
113  }
114 
115  return(std::string());
116 }
117 
118 const void* Magick::Blob::data(void) const
119 {
120  return(_blobRef->_data);
121 }
122 
123 size_t Magick::Blob::length(void) const
124 {
125  return(_blobRef->_length);
126 }
127 
128 void Magick::Blob::update(const void* data_,const size_t length_)
129 {
130  bool
131  doDelete;
132 
133  doDelete=false;
134  {
135  Lock lock( &_blobRef->_mutexLock );
136  if (--_blobRef->_refCount == 0)
137  doDelete=true;
138  }
139  if (doDelete)
140  {
141  // Delete old blob reference with associated data
142  delete _blobRef;
143  }
144 
145  _blobRef=new Magick::BlobRef(data_,length_);
146 }
147 
148 void Magick::Blob::updateNoCopy(void* data_,const size_t length_,
149  Magick::Blob::Allocator allocator_)
150 {
151  bool
152  doDelete;
153 
154  doDelete=false;
155  {
156  Lock lock(&_blobRef->_mutexLock);
157  if (--_blobRef->_refCount == 0)
158  doDelete=true;
159  }
160 
161  if (doDelete)
162  {
163  // Delete old blob reference with associated data
164  delete _blobRef;
165  }
166  _blobRef=new Magick::BlobRef(0,0);
167  _blobRef->_data=data_;
168  _blobRef->_length=length_;
169  _blobRef->_allocator=allocator_;
170 }
Blob & operator=(const Blob &blob_)
Definition: Blob.cpp:53
MutexLock _mutexLock
Definition: BlobRef.h:34
Blob(void)
Definition: Blob.cpp:18
virtual ~Blob()
Definition: Blob.cpp:36
std::string base64(void)
Definition: Blob.cpp:93
void updateNoCopy(void *data_, const size_t length_, Allocator allocator_=NewAllocator)
Definition: Blob.cpp:148
::ssize_t _refCount
Definition: BlobRef.h:33
void update(const void *data_, const size_t length_)
Definition: Blob.cpp:128
size_t length(void) const
Definition: Blob.cpp:123
const void * data(void) const
Definition: Blob.cpp:118