summaryrefslogtreecommitdiffstats
path: root/src/uscxml/messages/Blob.h
blob: 835c73a05478361e0119fb0288111a05fe0a81d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/**
 *  @file
 *  @author     2012-2014 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de)
 *  @copyright  Simplified BSD
 *
 *  @cond
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the FreeBSD license as published by the FreeBSD
 *  project.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 *  You should have received a copy of the FreeBSD license along with this
 *  program. If not, see <http://www.opensource.org/licenses/bsd-license>.
 *  @endcond
 */

#ifndef BLOB_H_E1B6D2C3
#define BLOB_H_E1B6D2C3

#include <string>
#include <boost/shared_ptr.hpp>

#include "uscxml/Common.h"

namespace uscxml {

class USCXML_API BlobImpl {
public:
	BlobImpl(size_t size);
	BlobImpl(const char* data, size_t size, const std::string& mimeType, bool adopt = false);
	virtual ~BlobImpl();

	std::string base64() const;
	std::string md5() const;
	static BlobImpl* fromBase64(const std::string base64, const std::string& mimeType);

	char* getData() const {
		return data;
	}

	size_t getSize() const {
		return size;
	}

	std::string getMimeType() const {
		return mimeType;
	}

	void setMimeType(const std::string& mimeType) {
		this->mimeType = mimeType;
	}

#ifdef SWIGIMPORTED
protected:
#endif

	char* data;
	size_t size;
	std::string mimeType;
};

class USCXML_API Blob {
public:

	Blob() : _impl() {}
	Blob(const boost::shared_ptr<BlobImpl> impl) : _impl(impl) { }
	Blob(const Blob& other) : _impl(other._impl) { }
	Blob(size_t size) : _impl(boost::shared_ptr<BlobImpl>(new BlobImpl(size))) {}
	Blob(const char* data,
	     size_t size,
	     const std::string& mimeType = "application/octet-stream",
	     bool adopt = false) :
		_impl(boost::shared_ptr<BlobImpl>(new BlobImpl(data, size, mimeType, adopt))) {}
	virtual ~Blob() {};

	operator bool()                    const     {
		return !!_impl;
	}
	bool operator< (const Blob& other) const     {
		return _impl < other._impl;
	}
	bool operator==(const Blob& other) const     {
		return _impl == other._impl;
	}
	bool operator!=(const Blob& other) const     {
		return _impl != other._impl;
	}
	Blob& operator= (const Blob& other)          {
		_impl = other._impl;
		return *this;
	}

	static Blob fromBase64(const std::string base64, const std::string& mimeType = "application/octet-stream") {
		return Blob(boost::shared_ptr<BlobImpl>(BlobImpl::fromBase64(base64, mimeType)));
	}

	std::string base64() const {
		return _impl->base64();
	}

	std::string md5() const {
		return _impl->md5();
	}

	char* getData() const {
		return _impl->getData();
	}

	size_t getSize() const {
		return _impl->getSize();
	}

	std::string getMimeType() const {
		return _impl->getMimeType();
	}

	void setMimeType(const std::string& mimeType) {
		_impl->setMimeType(mimeType);
	}

#ifdef SWIGIMPORTED
protected:
#endif
	boost::shared_ptr<BlobImpl> _impl;

};

}

#endif /* end of include guard: BLOB_H_E1B6D2C3 */