2 * Copyright (C) 2012 Andreas Steffen
3 * HSR Hochschule fuer Technik Rapperswil
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>.
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
16 #include "imv_remediation_string.h"
18 #include <utils/debug.h>
20 typedef struct private_imv_remediation_string_t private_imv_remediation_string_t
;
23 * Private data of an imv_remediation_string_t object.
25 struct private_imv_remediation_string_t
{
28 * Public members of imv_remediation_string_t
30 imv_remediation_string_t
public;
33 * XML or plaintext encoding
43 * Contains the concatenated remediation instructions
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
)
54 char xml_format
[] = " <instruction>\n"
55 " <title>%s</title>\n"
56 " <description>%s</description>\n"
59 char *instruction
, *format
, *item
, *pos
, *header
, *items
;
60 char *s_title
, *s_description
, *s_itemsheader
;
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
);
71 int header_len
= strlen(s_itemsheader
);
76 header_format
= " <itemsheader>%s</itemsheader>\n";
77 header_len
+= strlen(header_format
) - 2;
81 header_format
= "\n %s";
84 header
= malloc(header_len
+ 1);
85 sprintf(header
, header_format
, s_itemsheader
);
88 if (item_list
&& item_list
->get_count(item_list
))
90 enumerator_t
*enumerator
;
93 /* compute total length of all items */
94 enumerator
= item_list
->create_enumerator(item_list
);
95 while (enumerator
->enumerate(enumerator
, &item
))
97 items_len
+= strlen(item
);
99 enumerator
->destroy(enumerator
);
103 items_len
+= 12 + 20 * item_list
->get_count(item_list
) + 13;
105 pos
= items
= malloc(items_len
+ 1);
106 pos
+= sprintf(pos
, " <items>\n");
108 enumerator
= item_list
->create_enumerator(item_list
);
109 while (enumerator
->enumerate(enumerator
, &item
))
111 pos
+= sprintf(pos
, " <item>%s</item>\n", item
);
113 enumerator
->destroy(enumerator
);
115 pos
+= sprintf(pos
, " </items>\n");
119 items_len
+= 5 * item_list
->get_count(item_list
);
121 pos
= items
= malloc(items_len
+ 1);
123 enumerator
= item_list
->create_enumerator(item_list
);
124 while (enumerator
->enumerate(enumerator
, &item
))
126 pos
+= sprintf(pos
, "\n %s", item
);
128 enumerator
->destroy(enumerator
);
132 len
= strlen(s_title
) + strlen(s_description
);
135 len
+= strlen(header
);
139 len
+= strlen(items
);
145 len
+= strlen(xml_format
) - 8;
149 format
= this->instructions
.len
? "\n%s\n %s%s%s" : "%s\n %s%s%s";
152 instruction
= malloc(len
+ 1);
153 sprintf(instruction
, format
, s_title
, s_description
, header
? header
: "",
157 this->instructions
= chunk_cat("mm", this->instructions
,
158 chunk_create(instruction
, strlen(instruction
)));
161 METHOD(imv_remediation_string_t
, get_encoding
, chunk_t
,
162 private_imv_remediation_string_t
*this)
164 char xml_header
[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
165 "<remediationinstructions>\n";
166 char xml_trailer
[] = "</remediationinstructions>";
168 if (!this->instructions
.len
)
174 this->instructions
= chunk_cat("cmc",
175 chunk_create(xml_header
, strlen(xml_header
)),
177 chunk_create(xml_trailer
, strlen(xml_trailer
))
180 return this->instructions
;
183 METHOD(imv_remediation_string_t
, destroy
, void,
184 private_imv_remediation_string_t
*this)
186 free(this->instructions
.ptr
);
191 * Described in header.
193 imv_remediation_string_t
*imv_remediation_string_create(bool as_xml
, char *lang
)
195 private_imv_remediation_string_t
*this;
199 .add_instruction
= _add_instruction
,
200 .get_encoding
= _get_encoding
,
207 return &this->public;