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>