1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3     header.c
4     Copyright (C) 2004 Sebastien Granjoux
5 
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19 */
20 
21 /*
22  * header data read in .wiz file, used in the first page (project selection)
23  *
24  *---------------------------------------------------------------------------*/
25 
26 #include <config.h>
27 #include <sys/wait.h>
28 #include <unistd.h>
29 #include <stdlib.h>
30 
31 #include "header.h"
32 
33 #include <glib.h>
34 #include <glib/gi18n.h>
35 
36 #include <libanjuta/anjuta-utils.h>
37 
38 /*---------------------------------------------------------------------------*/
39 
40 struct _NPWHeader {
41 	gchar* name;
42 	gint name_lang;
43 	gchar* description;
44 	gint description_lang;
45 	gchar* iconfile;
46 	gchar* category;
47 	guint  order;
48 	gchar* filename;
49 	GList* required_programs;
50 	GList* required_packages;
51 };
52 
53 /* Header
54  *---------------------------------------------------------------------------*/
55 
56 NPWHeader*
npw_header_new(void)57 npw_header_new (void)
58 {
59 	NPWHeader* self;
60 
61 	self = g_slice_new0(NPWHeader);
62 
63 	return self;
64 }
65 
66 void
npw_header_free(NPWHeader * self)67 npw_header_free (NPWHeader* self)
68 {
69 	if (self == NULL) return;
70 
71 	g_free (self->name);
72 	g_free (self->description);
73 	g_free (self->iconfile);
74 	g_free (self->category);
75 	g_free (self->filename);
76 	g_list_free (self->required_programs);
77 	g_list_free (self->required_packages);
78 	g_slice_free (NPWHeader, self);
79 }
80 
81 void
npw_header_set_name(NPWHeader * self,const gchar * name,gint lang)82 npw_header_set_name (NPWHeader* self, const gchar* name, gint lang)
83 {
84 	if (lang >= self->name_lang)
85 	{
86 		g_free (self->name);
87 		self->name = g_strdup (name);
88 		self->name_lang = lang;
89 	}
90 }
91 
92 const gchar*
npw_header_get_name(const NPWHeader * self)93 npw_header_get_name (const NPWHeader* self)
94 {
95 	return self->name_lang == 0 ? _(self->name) : self->name;
96 }
97 
98 void
npw_header_set_filename(NPWHeader * self,const gchar * filename)99 npw_header_set_filename (NPWHeader* self, const gchar* filename)
100 {
101 	g_free (self->filename);
102 	self->filename = g_strdup (filename);
103 }
104 
105 const gchar*
npw_header_get_filename(const NPWHeader * self)106 npw_header_get_filename (const NPWHeader* self)
107 {
108 	return self->filename;
109 }
110 
111 void
npw_header_set_category(NPWHeader * self,const gchar * category)112 npw_header_set_category (NPWHeader* self, const gchar* category)
113 {
114 	g_free (self->category);
115 	self->category =g_strdup (category);
116 }
117 
118 const gchar*
npw_header_get_category(const NPWHeader * self)119 npw_header_get_category (const NPWHeader* self)
120 {
121 	return self->category;
122 }
123 
124 void
npw_header_set_description(NPWHeader * self,const gchar * description,gint lang)125 npw_header_set_description (NPWHeader* self, const gchar* description, gint lang)
126 {
127 	if (lang >= self->description_lang)
128 	{
129 		g_free (self->description);
130 		self->description = g_strdup (description);
131 		self->description_lang = lang;
132 	}
133 }
134 
135 const gchar*
npw_header_get_description(const NPWHeader * self)136 npw_header_get_description (const NPWHeader* self)
137 {
138 	return self->description_lang == 0 ? _(self->description) : self->description;
139 }
140 
141 void
npw_header_set_iconfile(NPWHeader * self,const gchar * iconfile)142 npw_header_set_iconfile (NPWHeader* self, const gchar* iconfile)
143 {
144 	g_free (self->iconfile);
145 	self->iconfile = g_strdup (iconfile);
146 }
147 
148 const gchar*
npw_header_get_iconfile(const NPWHeader * self)149 npw_header_get_iconfile (const NPWHeader* self)
150 {
151 	return self->iconfile;
152 }
153 
154 void
npw_header_set_order(NPWHeader * self,const gchar * order)155 npw_header_set_order (NPWHeader* self, const gchar* order)
156 {
157 	self->order = strtoul (order, NULL, 10);
158 }
159 
160 const guint
npw_header_get_order(const NPWHeader * self)161 npw_header_get_order (const NPWHeader* self)
162 {
163 	return self->order;
164 }
165 
166 void
npw_header_add_required_program(NPWHeader * self,const gchar * program)167 npw_header_add_required_program (NPWHeader* self, const gchar* program)
168 {
169 	self->required_programs =
170 		g_list_prepend (self->required_programs,
171 						g_strdup (program));
172 
173 }
174 
175 void
npw_header_add_required_package(NPWHeader * self,const gchar * package)176 npw_header_add_required_package (NPWHeader* self, const gchar* package)
177 {
178 	self->required_packages =
179 		g_list_prepend (self->required_packages,
180 						g_strdup(package));
181 }
182 
183 GList*
npw_header_check_required_programs(NPWHeader * self)184 npw_header_check_required_programs (NPWHeader* self)
185 {
186 	GList *node = NULL;
187 	GList *failed_programs = NULL;
188 	for (node = self->required_programs; node; node = g_list_next (node))
189 	{
190 		if (!anjuta_util_prog_is_installed (node->data, FALSE))
191 		{
192 			const gchar *const prog = (const gchar *) node->data;
193 			failed_programs = g_list_prepend (failed_programs,
194 											  g_strdup (prog));
195 		}
196 	}
197 	return failed_programs;
198 }
199 
200 GList*
npw_header_check_required_packages(NPWHeader * self)201 npw_header_check_required_packages (NPWHeader* self)
202 {
203 	GList *node = NULL;
204 	GList *failed_packages = NULL;
205 	for (node = self->required_packages; node; node = g_list_next (node))
206 	{
207 		if (!anjuta_util_package_is_installed (node->data, FALSE))
208 		{
209 			const gchar *const pkg = (const gchar *) node->data;
210 			failed_packages = g_list_prepend (failed_packages,
211 											  g_strdup (pkg));
212 		}
213 	}
214 	return failed_packages;
215 }
216 
217 /* Header list
218  *---------------------------------------------------------------------------*/
219 
220 GList*
npw_header_list_new(void)221 npw_header_list_new (void)
222 {
223 	GList* list;
224 
225 	list = NULL;
226 
227 	return list;
228 }
229 
230 static void
remove_category(GList * list)231 remove_category (GList *list)
232 {
233 	g_list_foreach (list, (GFunc)npw_header_free, NULL);
234 	g_list_free (list);
235 }
236 
237 void
npw_header_list_free(GList * list)238 npw_header_list_free (GList* list)
239 {
240 	g_list_foreach (list, (GFunc)remove_category, NULL);
241 	g_list_free (list);
242 }
243 
244 static gint
compare_header_name(NPWHeader * a,NPWHeader * b)245 compare_header_name (NPWHeader *a, NPWHeader *b)
246 {
247 	if (npw_header_get_order (a) == npw_header_get_order (b))
248 	{
249 		return g_utf8_collate (npw_header_get_name (a), npw_header_get_name (b));
250 	}
251 	else if (npw_header_get_order (a) == 0)
252 	{
253 		return 1;
254 	}
255 	else if (npw_header_get_order (b) == 0)
256 	{
257 		return -1;
258 	}
259 	else
260 	{
261 		return npw_header_get_order (a) - npw_header_get_order (b);
262 	}
263 }
264 
265 GList *
npw_header_list_insert_header(GList * list,NPWHeader * header)266 npw_header_list_insert_header (GList *list, NPWHeader *header)
267 {
268 	GList *node;
269 	GList *template_list;
270 
271 	for (node = g_list_first (list); node != NULL; node = g_list_next (node))
272 	{
273 		NPWHeader* first;
274 		gint res;
275 
276 		template_list = (GList *)node->data;
277 		first = (NPWHeader *)template_list->data;
278 		res = g_ascii_strcasecmp (npw_header_get_category (first), npw_header_get_category (header));
279 		if (res == 0)
280 		{
281 			node->data = g_list_insert_sorted (template_list, header, (GCompareFunc) compare_header_name);
282 			return list;
283 		}
284 		else if (res > 0)
285 		{
286 			break;
287 		}
288 	}
289 
290 	template_list = g_list_prepend (NULL, header);
291 
292 	return g_list_insert_before (list, node, template_list);
293 }
294 
295 NPWHeader*
npw_header_list_find_header(GList * list,NPWHeader * header)296 npw_header_list_find_header (GList *list, NPWHeader *header)
297 {
298 	GList *node;
299 	GList *template_list;
300 
301 	for (node = g_list_first (list); node != NULL; node = g_list_next (node))
302 	{
303 		NPWHeader* first;
304 		gint res;
305 
306 		template_list = (GList *)node->data;
307 		first = (NPWHeader *)template_list->data;
308 		res = g_ascii_strcasecmp (npw_header_get_category (first), npw_header_get_category (header));
309 		if (res == 0)
310 		{
311 			GList *find;
312 
313 			find = g_list_find_custom (template_list, header, (GCompareFunc) compare_header_name);
314 			if (find != NULL)
315 			{
316 				return (NPWHeader *)find->data;
317 			}
318 
319 			break;
320 		}
321 		else if (res > 0)
322 		{
323 			break;
324 		}
325 	}
326 
327 	return NULL;
328 }
329