Annotation of embedaddon/strongswan/src/libimcv/pts/components/pts_component_manager.c, revision 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>