1// This may look like C code, but it is really -*- C++ -*-
2//
3// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002
4// Copyright Dirk Lemstra 2015
5//
6// Reference counted container class for Binary Large Objects (BLOBs)
7//
8
9#if !defined(Magick_BlobRef_header)
10#define Magick_BlobRef_header
11
12#include "Magick++/Include.h"
13#include <string>
14
15namespace Magick
16{
17  // Forward decl
18  class BlobRef;
19
20  class MagickPPExport Blob
21  {
22  public:
23
24    enum Allocator
25    {
26      MallocAllocator,
27      NewAllocator
28    };
29
30    // Default constructor
31    Blob(void);
32
33    // Construct object with data, making a copy of the supplied data.
34    Blob(const void* data_,const size_t length_);
35
36    // Copy constructor (reference counted)
37    Blob(const Blob& blob_);
38
39    // Destructor (reference counted)
40    virtual ~Blob();
41
42    // Assignment operator (reference counted)
43    Blob& operator=(const Blob& blob_);
44
45    // Update object contents from Base64-encoded string representation.
46    void base64(const std::string base64_);
47    // Return Base64-encoded string representation.
48    std::string base64(void) const;
49
50    // Obtain pointer to data. The user should never try to modify or
51    // free this data since the Blob class manages its own data. The
52    // user must be finished with the data before allowing the Blob to
53    // be destroyed since the pointer is invalid once the Blob is
54    // destroyed.
55    const void* data(void) const;
56
57    // Obtain data length
58    size_t length(void) const;
59
60    // Update object contents, making a copy of the supplied data.
61    // Any existing data in the object is deallocated.
62    void update(const void* data_,const size_t length_);
63
64    // Update object contents, using supplied pointer directly (no
65    // copy). Any existing data in the object is deallocated.  The user
66    // must ensure that the pointer supplied is not deleted or
67    // otherwise modified after it has been supplied to this method.
68    // Specify allocator_ as "MallocAllocator" if memory is allocated
69    // via the C language malloc() function, or "NewAllocator" if
70    // memory is allocated via C++ 'new'.
71    void updateNoCopy(void* data_,const size_t length_,
72      const Allocator allocator_=NewAllocator);
73
74  private:
75    BlobRef *_blobRef;
76  };
77
78} // namespace Magick
79
80#endif // Magick_BlobRef_header
81