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