1/*
2 * Copyright 2009,2011, Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _PACKAGE__HPKG__PACKAGE_ATTRIBUTE_VALUE_H_
6#define _PACKAGE__HPKG__PACKAGE_ATTRIBUTE_VALUE_H_
7
8
9#include <string.h>
10
11#include <package/hpkg/HPKGDefs.h>
12
13
14namespace BPackageKit {
15
16namespace BHPKG {
17
18
19struct BPackageAttributeValue {
20			union {
21				int64			signedInt;
22				uint64			unsignedInt;
23				const char*		string;
24				struct {
25					uint64		size;
26					union {
27						uint64	offset;
28						uint8	raw[B_HPKG_MAX_INLINE_DATA_SIZE];
29					};
30				} data;
31			};
32			uint8				type;
33			uint8				encoding;
34
35public:
36	inline						BPackageAttributeValue();
37
38	inline	void				SetTo(int8 value);
39	inline	void				SetTo(uint8 value);
40	inline	void				SetTo(int16 value);
41	inline	void				SetTo(uint16 value);
42	inline	void				SetTo(int32 value);
43	inline	void				SetTo(uint32 value);
44	inline	void				SetTo(int64 value);
45	inline	void				SetTo(uint64 value);
46	inline	void				SetTo(const char* value);
47	inline	void				SetToData(uint64 size, uint64 offset);
48	inline	void				SetToData(uint64 size, const void* rawData);
49};
50
51
52BPackageAttributeValue::BPackageAttributeValue()
53	:
54	type(B_HPKG_ATTRIBUTE_TYPE_INVALID)
55{
56}
57
58
59void
60BPackageAttributeValue::SetTo(int8 value)
61{
62	signedInt = value;
63	type = B_HPKG_ATTRIBUTE_TYPE_INT;
64}
65
66
67void
68BPackageAttributeValue::SetTo(uint8 value)
69{
70	unsignedInt = value;
71	type = B_HPKG_ATTRIBUTE_TYPE_UINT;
72}
73
74
75void
76BPackageAttributeValue::SetTo(int16 value)
77{
78	signedInt = value;
79	type = B_HPKG_ATTRIBUTE_TYPE_INT;
80}
81
82
83void
84BPackageAttributeValue::SetTo(uint16 value)
85{
86	unsignedInt = value;
87	type = B_HPKG_ATTRIBUTE_TYPE_UINT;
88}
89
90
91void
92BPackageAttributeValue::SetTo(int32 value)
93{
94	signedInt = value;
95	type = B_HPKG_ATTRIBUTE_TYPE_INT;
96}
97
98
99void
100BPackageAttributeValue::SetTo(uint32 value)
101{
102	unsignedInt = value;
103	type = B_HPKG_ATTRIBUTE_TYPE_UINT;
104}
105
106
107void
108BPackageAttributeValue::SetTo(int64 value)
109{
110	signedInt = value;
111	type = B_HPKG_ATTRIBUTE_TYPE_INT;
112}
113
114
115void
116BPackageAttributeValue::SetTo(uint64 value)
117{
118	unsignedInt = value;
119	type = B_HPKG_ATTRIBUTE_TYPE_UINT;
120}
121
122
123void
124BPackageAttributeValue::SetTo(const char* value)
125{
126	string = value;
127	type = B_HPKG_ATTRIBUTE_TYPE_STRING;
128}
129
130
131void
132BPackageAttributeValue::SetToData(uint64 size, uint64 offset)
133{
134	data.size = size;
135	data.offset = offset;
136	type = B_HPKG_ATTRIBUTE_TYPE_RAW;
137	encoding = B_HPKG_ATTRIBUTE_ENCODING_RAW_HEAP;
138}
139
140
141void
142BPackageAttributeValue::SetToData(uint64 size, const void* rawData)
143{
144	data.size = size;
145	if (size > 0)
146		memcpy(data.raw, rawData, size);
147	type = B_HPKG_ATTRIBUTE_TYPE_RAW;
148	encoding = B_HPKG_ATTRIBUTE_ENCODING_RAW_INLINE;
149}
150
151
152}	// namespace BHPKG
153
154}	// namespace BPackageKit
155
156
157#endif	// _PACKAGE__HPKG__PACKAGE_ATTRIBUTE_VALUE_H_
158