Annotation of embedaddon/strongswan/src/libimcv/pts/components/pts_component_manager.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2011-2012 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 "pts/components/pts_component_manager.h"
17:
18: #include <collections/linked_list.h>
19: #include <utils/debug.h>
20:
21: typedef struct private_pts_component_manager_t private_pts_component_manager_t;
22: typedef struct vendor_entry_t vendor_entry_t;
23: typedef struct component_entry_t component_entry_t;
24:
25: #define PTS_QUALIFIER_SIZE 6
26:
27: /**
28: * Vendor-specific namespace information and list of registered components
29: */
30: struct vendor_entry_t {
31:
32: /**
33: * Vendor ID
34: */
35: pen_t vendor_id;
36:
37: /**
38: * Vendor-specific Component Functional names
39: */
40: enum_name_t *comp_func_names;
41:
42: /**
43: * Vendor-specific Qualifier Type names
44: */
45: enum_name_t *qualifier_type_names;
46:
47: /**
48: * Vendor-specific Qualifier Flag names
49: */
50: char *qualifier_flag_names;
51:
52: /**
53: * Vendor-specific size of Qualifier Type field
54: */
55: int qualifier_type_size;
56:
57: /**
58: * List of vendor-specific registered Functional Components
59: */
60: linked_list_t *components;
61: };
62:
63: /**
64: * Destroy a vendor_entry_t object
65: */
66: static void vendor_entry_destroy(vendor_entry_t *entry)
67: {
68: entry->components->destroy_function(entry->components, free);
69: free(entry);
70: }
71:
72: /**
73: * Creation method for a vendor-specific Functional Component
74: */
75: struct component_entry_t {
76:
77: /**
78: * Vendor-Specific Component Functional Name
79: */
80: uint32_t name;
81:
82: /**
83: * Functional Component creation method
84: */
85: pts_component_create_t create;
86: };
87:
88: /**
89: * Private data of a pts_component_manager_t object.
90: *
91: */
92: struct private_pts_component_manager_t {
93:
94: /**
95: * Public pts_component_manager_t interface.
96: */
97: pts_component_manager_t public;
98:
99: /**
100: * List of vendor-specific namespaces and registered components
101: */
102: linked_list_t *list;
103: };
104:
105: METHOD(pts_component_manager_t, add_vendor, void,
106: private_pts_component_manager_t *this, pen_t vendor_id,
107: enum_name_t *comp_func_names, int qualifier_type_size,
108: char *qualifier_flag_names, enum_name_t *qualifier_type_names)
109: {
110: vendor_entry_t *entry;
111:
112: entry = malloc_thing(vendor_entry_t);
113: entry->vendor_id = vendor_id;
114: entry->comp_func_names = comp_func_names;
115: entry->qualifier_type_size = qualifier_type_size;
116: entry->qualifier_flag_names = qualifier_flag_names;
117: entry->qualifier_type_names = qualifier_type_names;
118: entry->components = linked_list_create();
119:
120: this->list->insert_last(this->list, entry);
121: DBG2(DBG_PTS, "added %N functional component namespace",
122: pen_names, vendor_id);
123: }
124:
125: METHOD(pts_component_manager_t, get_comp_func_names, enum_name_t*,
126: private_pts_component_manager_t *this, pen_t vendor_id)
127: {
128: enumerator_t *enumerator;
129: vendor_entry_t *entry;
130: enum_name_t *names = NULL;
131:
132: enumerator = this->list->create_enumerator(this->list);
133: while (enumerator->enumerate(enumerator, &entry))
134: {
135: if (entry->vendor_id == vendor_id)
136: {
137: names = entry->comp_func_names;
138: break;
139: }
140: }
141: enumerator->destroy(enumerator);
142:
143: return names;
144: }
145:
146: METHOD(pts_component_manager_t, get_qualifier_type_names, enum_name_t*,
147: private_pts_component_manager_t *this, pen_t vendor_id)
148: {
149: enumerator_t *enumerator;
150: vendor_entry_t *entry;
151: enum_name_t *names = NULL;
152:
153: enumerator = this->list->create_enumerator(this->list);
154: while (enumerator->enumerate(enumerator, &entry))
155: {
156: if (entry->vendor_id == vendor_id)
157: {
158: names = entry->qualifier_type_names;
159: break;
160: }
161: }
162: enumerator->destroy(enumerator);
163:
164: return names;
165: }
166:
167: METHOD(pts_component_manager_t, add_component, void,
168: private_pts_component_manager_t *this, pen_t vendor_id, uint32_t name,
169: pts_component_create_t create)
170: {
171: enumerator_t *enumerator;
172: vendor_entry_t *entry;
173: component_entry_t *component;
174:
175: enumerator = this->list->create_enumerator(this->list);
176: while (enumerator->enumerate(enumerator, &entry))
177: {
178: if (entry->vendor_id == vendor_id)
179: {
180: component = malloc_thing(component_entry_t);
181: component->name = name;
182: component->create = create;
183:
184: entry->components->insert_last(entry->components, component);
185: DBG2(DBG_PTS, "added %N functional component '%N'",
186: pen_names, vendor_id,
187: get_comp_func_names(this, vendor_id), name);
188: }
189: }
190: enumerator->destroy(enumerator);
191: }
192:
193: METHOD(pts_component_manager_t, remove_vendor, void,
194: private_pts_component_manager_t *this, pen_t vendor_id)
195: {
196: enumerator_t *enumerator;
197: vendor_entry_t *entry;
198:
199: enumerator = this->list->create_enumerator(this->list);
200: while (enumerator->enumerate(enumerator, &entry))
201: {
202: if (entry->vendor_id == vendor_id)
203: {
204: this->list->remove_at(this->list, enumerator);
205: vendor_entry_destroy(entry);
206: DBG2(DBG_PTS, "removed %N functional component namespace",
207: pen_names, vendor_id);
208: }
209: }
210: enumerator->destroy(enumerator);
211: }
212:
213: METHOD(pts_component_manager_t, get_qualifier, uint8_t,
214: private_pts_component_manager_t *this, pts_comp_func_name_t *name,
215: char *flags)
216: {
217: enumerator_t *enumerator;
218: vendor_entry_t *entry;
219: uint8_t qualifier, size, flag, type = 0;
220: int i;
221:
222: enumerator = this->list->create_enumerator(this->list);
223: while (enumerator->enumerate(enumerator, &entry))
224: {
225: if (entry->vendor_id == name->get_vendor_id(name))
226: {
227: qualifier = name->get_qualifier(name);
228: size = entry->qualifier_type_size;
229:
230: /* mask qualifier type field */
231: type = qualifier & ((1 << size) - 1);
232:
233: /* determine flags */
234: size = PTS_QUALIFIER_SIZE - size;
235: flag = (1 << (PTS_QUALIFIER_SIZE - 1));
236: if (flags)
237: {
238: for (i = 0 ; i < size; i++)
239: {
240: flags[i] = (qualifier & flag) ?
241: entry->qualifier_flag_names[i] : '.';
242: flag >>= 1;
243: }
244: flags[size] = '\0';
245: }
246: }
247: }
248: enumerator->destroy(enumerator);
249:
250: return type;
251: }
252:
253: METHOD(pts_component_manager_t, create, pts_component_t*,
254: private_pts_component_manager_t *this,
255: pts_comp_func_name_t *name, uint32_t depth, pts_database_t *pts_db)
256: {
257: enumerator_t *enumerator, *e2;
258: vendor_entry_t *entry;
259: component_entry_t *entry2;
260: pts_component_t *component = NULL;
261:
262: enumerator = this->list->create_enumerator(this->list);
263: while (enumerator->enumerate(enumerator, &entry))
264: {
265: if (entry->vendor_id == name->get_vendor_id(name))
266: {
267: e2 = entry->components->create_enumerator(entry->components);
268: while (e2->enumerate(e2, &entry2))
269: {
270: if (entry2->name == name->get_name(name) && entry2->create)
271: {
272: component = entry2->create(depth, pts_db);
273: break;
274: }
275: }
276: e2->destroy(e2);
277: break;
278: }
279: }
280: enumerator->destroy(enumerator);
281:
282: return component;
283: }
284:
285: METHOD(pts_component_manager_t, destroy, void,
286: private_pts_component_manager_t *this)
287: {
288: this->list->destroy_function(this->list, (void *)vendor_entry_destroy);
289: free(this);
290: }
291:
292: /**
293: * See header
294: */
295: pts_component_manager_t *pts_component_manager_create(void)
296: {
297: private_pts_component_manager_t *this;
298:
299: INIT(this,
300: .public = {
301: .add_vendor = _add_vendor,
302: .add_component = _add_component,
303: .remove_vendor = _remove_vendor,
304: .get_comp_func_names = _get_comp_func_names,
305: .get_qualifier_type_names = _get_qualifier_type_names,
306: .get_qualifier = _get_qualifier,
307: .create = _create,
308: .destroy = _destroy,
309: },
310: .list = linked_list_create(),
311: );
312:
313: return &this->public;
314: }
315:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>