Magick++ 7.0.10

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 2013-2017
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 #include "Magick++/Exception.h"
16
17 #include <string.h>
18
19 Magick::Blob::Blob(void)
20 : _blobRef(new Magick::BlobRef(0,0))
21 {
22 }
23
24 Magick::Blob::Blob(const void* data_,const size_t length_)
25 : _blobRef(new Magick::BlobRef(data_, length_))
26 {
27 }
28
29 Magick::Blob::Blob(const Magick::Blob& blob_)
30 : _blobRef(blob_._blobRef)
31 {
32 // Increase reference count
33 _blobRef->increase();
34 }
35
36 Magick::Blob::~Blob()
37 {
38 try
39 {
40 if (_blobRef->decrease() == 0)
41 delete _blobRef;
42 }
43 catch(Magick::Exception&)
44 {
45 }
46
47 _blobRef=(Magick::BlobRef *) NULL;
48 }
49
50 Magick::Blob& Magick::Blob::operator=(const Magick::Blob& blob_)
51 {
52 if (this != &blob_)
53 {
54 blob_._blobRef->increase();
55 if (_blobRef->decrease() == 0)
56 delete _blobRef;
57
58 _blobRef=blob_._blobRef;
59 }
60 return(*this);
61 }
62
63 void Magick::Blob::base64(const std::string base64_)
64 {
65 size_t
66 length;
67
68 unsigned char
69 *decoded;
70
71 decoded=Base64Decode(base64_.c_str(),&length);
72
73 if(decoded)
74 updateNoCopy(static_cast<void*>(decoded),length,
75 Magick::Blob::MallocAllocator);
76 }
77
78 std::string Magick::Blob::base64(void) const
79 {
80 size_t
81 encoded_length;
82
83 char
84 *encoded;
85
86 std::string
87 result;
88
89 encoded_length=0;
90 encoded=Base64Encode(static_cast<const unsigned char*>(data()),length(),
91 &encoded_length);
92
93 if(encoded)
94 {
95 result=std::string(encoded,encoded_length);
96 encoded=(char *) RelinquishMagickMemory(encoded);
97 return result;
98 }
99
100 return(std::string());
101 }
102
103 const void* Magick::Blob::data(void) const
104 {
105 return(_blobRef->data);
106 }
107
108 size_t Magick::Blob::length(void) const
109 {
110 return(_blobRef->length);
111 }
112
113 void Magick::Blob::update(const void* data_,size_t length_)
114 {
115 if (_blobRef->decrease() == 0)
116 delete _blobRef;
117
118 _blobRef=new Magick::BlobRef(data_,length_);
119 }
120
121 void Magick::Blob::updateNoCopy(void* data_,size_t length_,
122 Magick::Blob::Allocator allocator_)
123 {
124 if (_blobRef->decrease() == 0)
125 delete _blobRef;
126
127 _blobRef=new Magick::BlobRef((const void*) NULL,0);
128 _blobRef->data=data_;
129 _blobRef->length=length_;
130 _blobRef->allocator=allocator_;
131 }
132
BlobRef.h
Magick::Blob::MallocAllocator
Definition: Blob.h:26
Magick::Blob::operator=
Blob & operator=(const Blob &blob_)
Definition: Blob.cpp:50
Magick::Blob::Blob
Blob(void)
Definition: Blob.cpp:19
Magick::Blob::updateNoCopy
void updateNoCopy(void *data_, const size_t length_, const Allocator allocator_=NewAllocator)
Definition: Blob.cpp:121
Magick::Blob::~Blob
virtual ~Blob()
Definition: Blob.cpp:36
Magick::Blob
Definition: Blob.h:20
Magick::Exception
Definition: Exception.h:22
Magick::BlobRef::increase
void increase()
Definition: BlobRef.cpp:62
Magick::Blob::base64
std::string base64(void) const
Definition: Blob.cpp:78
Include.h
Magick::BlobRef
Definition: BlobRef.h:21
Magick::Blob::data
const void * data(void) const
Definition: Blob.cpp:103
Magick::Blob::update
void update(const void *data_, const size_t length_)
Definition: Blob.cpp:113
Magick::Blob::Allocator
Allocator
Definition: Blob.h:24
Magick
Definition: Blob.h:15
Magick::Blob::length
size_t length(void) const
Definition: Blob.cpp:108
Blob.h
Exception.h