Annotation of embedaddon/strongswan/src/libimcv/imv/imv_remediation_string.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 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 "imv_remediation_string.h"
                     17: 
                     18: #include <utils/debug.h>
                     19: 
                     20: typedef struct private_imv_remediation_string_t private_imv_remediation_string_t;
                     21: 
                     22: /**
                     23:  * Private data of an imv_remediation_string_t object.
                     24:  */
                     25: struct private_imv_remediation_string_t {
                     26: 
                     27:        /**
                     28:         * Public members of imv_remediation_string_t
                     29:         */
                     30:        imv_remediation_string_t public;
                     31: 
                     32:        /**
                     33:         * XML or plaintext encoding
                     34:         */
                     35:        bool as_xml;
                     36: 
                     37:        /**
                     38:         * Preferred language
                     39:         */
                     40:        char *lang;
                     41: 
                     42:        /**
                     43:         * Contains the concatenated remediation instructions
                     44:         */
                     45:        chunk_t instructions;
                     46: 
                     47: };
                     48: 
                     49: METHOD(imv_remediation_string_t, add_instruction, void,
                     50:        private_imv_remediation_string_t *this, imv_lang_string_t title[],
                     51:        imv_lang_string_t description[], imv_lang_string_t itemsheader[],
                     52:        linked_list_t *item_list)
                     53: {
                     54:        char xml_format[] = "  <instruction>\n"
                     55:                                                "    <title>%s</title>\n"
                     56:                                                "    <description>%s</description>\n"
                     57:                                                "%s%s"
                     58:                                                "  </instruction>\n";
                     59:        char *instruction, *format, *item, *pos, *header, *items;
                     60:        char *s_title, *s_description, *s_itemsheader;
                     61:        size_t len;
                     62: 
                     63:        s_title = imv_lang_string_select_string(title, this->lang);
                     64:        s_description = imv_lang_string_select_string(description, this->lang);
                     65:        s_itemsheader = imv_lang_string_select_string(itemsheader, this->lang);
                     66:        header = NULL;
                     67:        items = NULL;
                     68: 
                     69:        if (s_itemsheader)
                     70:        {
                     71:                int header_len = strlen(s_itemsheader);
                     72:                char *header_format;
                     73: 
                     74:                if (this->as_xml)
                     75:                {
                     76:                        header_format = "    <itemsheader>%s</itemsheader>\n";
                     77:                        header_len +=  strlen(header_format) - 2;
                     78:                }
                     79:                else
                     80:                {
                     81:                        header_format = "\n  %s";
                     82:                        header_len += 3;
                     83:                }
                     84:                header = malloc(header_len + 1);
                     85:                sprintf(header, header_format, s_itemsheader);
                     86:        }
                     87: 
                     88:        if (item_list && item_list->get_count(item_list))
                     89:        {
                     90:                enumerator_t *enumerator;
                     91:                int items_len = 0;
                     92: 
                     93:                /* compute total length of all items */
                     94:                enumerator = item_list->create_enumerator(item_list);
                     95:                while (enumerator->enumerate(enumerator, &item))
                     96:                {
                     97:                        items_len += strlen(item);
                     98:                }
                     99:                enumerator->destroy(enumerator);
                    100: 
                    101:                if (this->as_xml)
                    102:                {
                    103:                        items_len += 12 + 20 * item_list->get_count(item_list) + 13;
                    104: 
                    105:                        pos = items = malloc(items_len + 1);
                    106:                        pos += sprintf(pos, "    <items>\n");
                    107: 
                    108:                        enumerator = item_list->create_enumerator(item_list);
                    109:                        while (enumerator->enumerate(enumerator, &item))
                    110:                        {
                    111:                                pos += sprintf(pos, "      <item>%s</item>\n", item);
                    112:                        }
                    113:                        enumerator->destroy(enumerator);
                    114: 
                    115:                        pos += sprintf(pos, "    </items>\n");
                    116:                }
                    117:                else
                    118:                {
                    119:                        items_len += 5 * item_list->get_count(item_list);
                    120: 
                    121:                        pos = items = malloc(items_len + 1);
                    122: 
                    123:                        enumerator = item_list->create_enumerator(item_list);
                    124:                        while (enumerator->enumerate(enumerator, &item))
                    125:                        {
                    126:                                pos += sprintf(pos, "\n    %s", item);
                    127:                        }
                    128:                        enumerator->destroy(enumerator);
                    129:                }
                    130:        }
                    131: 
                    132:        len = strlen(s_title) + strlen(s_description);
                    133:        if (header)
                    134:        {
                    135:                len += strlen(header);
                    136:        }
                    137:        if (items)
                    138:        {
                    139:                len += strlen(items);
                    140:        }
                    141: 
                    142:        if (this->as_xml)
                    143:        {
                    144:                format = xml_format;
                    145:                len += strlen(xml_format) - 8;
                    146:        }
                    147:        else
                    148:        {
                    149:                format = this->instructions.len ? "\n%s\n  %s%s%s" : "%s\n  %s%s%s";
                    150:                len += 4;
                    151:        }
                    152:        instruction = malloc(len + 1);
                    153:        sprintf(instruction, format, s_title, s_description, header ? header : "",
                    154:                        items ? items : "");
                    155:        free(header);
                    156:        free(items);
                    157:        this->instructions = chunk_cat("mm", this->instructions,
                    158:                                                        chunk_create(instruction, strlen(instruction)));
                    159: }
                    160: 
                    161: METHOD(imv_remediation_string_t, get_encoding, chunk_t,
                    162:        private_imv_remediation_string_t *this)
                    163: {
                    164:        char xml_header[]  = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                    165:                                                 "<remediationinstructions>\n";
                    166:        char xml_trailer[] = "</remediationinstructions>";
                    167: 
                    168:        if (!this->instructions.len)
                    169:        {
                    170:                return chunk_empty;
                    171:        }
                    172:        if (this->as_xml)
                    173:        {
                    174:                this->instructions = chunk_cat("cmc",
                    175:                                                                chunk_create(xml_header, strlen(xml_header)),
                    176:                                                                this->instructions,
                    177:                                                                chunk_create(xml_trailer, strlen(xml_trailer))
                    178:                                                         );
                    179:        }
                    180:        return this->instructions;
                    181: }
                    182: 
                    183: METHOD(imv_remediation_string_t, destroy, void,
                    184:        private_imv_remediation_string_t *this)
                    185: {
                    186:        free(this->instructions.ptr);
                    187:        free(this);
                    188: }
                    189: 
                    190: /**
                    191:  * Described in header.
                    192:  */
                    193: imv_remediation_string_t *imv_remediation_string_create(bool as_xml, char *lang)
                    194: {
                    195:        private_imv_remediation_string_t *this;
                    196: 
                    197:        INIT(this,
                    198:                .public = {
                    199:                        .add_instruction = _add_instruction,
                    200:                        .get_encoding = _get_encoding,
                    201:                        .destroy = _destroy,
                    202:                },
                    203:                .as_xml = as_xml,
                    204:                .lang = lang,
                    205:        );
                    206: 
                    207:        return &this->public;
                    208: }
                    209: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>