android: New release after improving connectivity/scheduling
[strongswan.git] / src / libimcv / swima / swima_record.c
1 /*
2 * Copyright (C) 2017 Andreas Steffen
3 * HSR Hochschule fuer Technik Rapperswil
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * for more details.
14 */
15
16 #include "swima_record.h"
17 #include "swima_data_model.h"
18
19 typedef struct private_swima_record_t private_swima_record_t;
20
21 /**
22 * Private data of a swima_record_t object.
23 *
24 */
25 struct private_swima_record_t {
26
27 /**
28 * Public swima_record_t interface.
29 */
30 swima_record_t public;
31
32 /**
33 * Record ID
34 */
35 uint32_t record_id;
36
37 /**
38 * Software Identity
39 */
40 chunk_t sw_id;
41
42 /**
43 * Optional Software Locator
44 */
45 chunk_t sw_locator;
46
47 /**
48 * Data Model
49 */
50 pen_type_t data_model;
51
52 /**
53 * Source ID
54 */
55 uint8_t source_id;
56
57 /**g
58 * Optional Software Inventory Evidence Record
59 */
60 chunk_t record;
61
62 /**
63 * Reference count
64 */
65 refcount_t ref;
66 };
67
68 METHOD(swima_record_t, get_record_id, uint32_t,
69 private_swima_record_t *this)
70 {
71 return this->record_id;
72 }
73
74 METHOD(swima_record_t, get_sw_id, chunk_t,
75 private_swima_record_t *this, chunk_t *sw_locator)
76 {
77 if (sw_locator)
78 {
79 *sw_locator = this->sw_locator;
80 }
81 return this->sw_id;
82 }
83
84 METHOD(swima_record_t, set_data_model, void,
85 private_swima_record_t *this, pen_type_t data_model)
86 {
87 this->data_model = data_model;
88 }
89
90 METHOD(swima_record_t, get_data_model, pen_type_t,
91 private_swima_record_t *this)
92 {
93 return this->data_model;
94 }
95
96 METHOD(swima_record_t, set_source_id, void,
97 private_swima_record_t *this, uint8_t source_id)
98 {
99 this->source_id = source_id;
100 }
101
102 METHOD(swima_record_t, get_source_id, uint8_t,
103 private_swima_record_t *this)
104 {
105 return this->source_id;
106 }
107
108 METHOD(swima_record_t, set_record, void,
109 private_swima_record_t *this, chunk_t record)
110 {
111 chunk_free(&this->record);
112 this->record = chunk_clone(record);
113 }
114
115 METHOD(swima_record_t, get_record, chunk_t,
116 private_swima_record_t *this)
117 {
118 return this->record;
119 }
120
121 METHOD(swima_record_t, get_ref, swima_record_t*,
122 private_swima_record_t *this)
123 {
124 ref_get(&this->ref);
125 return &this->public;
126 }
127
128 METHOD(swima_record_t, destroy, void,
129 private_swima_record_t *this)
130 {
131 if (ref_put(&this->ref))
132 {
133 free(this->sw_id.ptr);
134 free(this->sw_locator.ptr);
135 free(this->record.ptr);
136 free(this);
137 }
138 }
139
140 /**
141 * See header
142 */
143 swima_record_t *swima_record_create(uint32_t record_id, chunk_t sw_id,
144 chunk_t sw_locator)
145 {
146 private_swima_record_t *this;
147
148 INIT(this,
149 .public = {
150 .get_record_id = _get_record_id,
151 .get_sw_id = _get_sw_id,
152 .set_data_model = _set_data_model,
153 .get_data_model = _get_data_model,
154 .set_source_id = _set_source_id,
155 .get_source_id = _get_source_id,
156 .set_record = _set_record,
157 .get_record = _get_record,
158 .get_ref = _get_ref,
159 .destroy = _destroy,
160 },
161 .record_id = record_id,
162 .data_model = swima_data_model_iso_2015_swid_xml,
163 .sw_id = chunk_clone(sw_id),
164 .ref = 1,
165 );
166
167 if (sw_locator.len > 0)
168 {
169 this->sw_locator = chunk_clone(sw_locator);
170 }
171
172 return &this->public;
173 }
174