3
* Copyright (C) 2015 Christian Hergert <christian@hergert.me>
5
* This program is free software: you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation, either version 3 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19
#define G_LOG_DOMAIN "ide-doap"
21
#include <glib/gi18n.h>
24
#include "ide-macros.h"
26
#include "xml-reader.h"
29
* TODO: We don't do any XMLNS checking or anything here.
34
GObject parent_instance;
48
G_DEFINE_QUARK (ide_doap_error, ide_doap_error)
49
G_DEFINE_TYPE (IdeDoap, ide_doap, G_TYPE_OBJECT)
64
static GParamSpec *gParamSpecs [LAST_PROP];
69
return g_object_new (IDE_TYPE_DOAP, NULL);
73
ide_doap_get_name (IdeDoap *self)
75
g_return_val_if_fail (IDE_IS_DOAP (self), NULL);
81
ide_doap_get_shortdesc (IdeDoap *self)
83
g_return_val_if_fail (IDE_IS_DOAP (self), NULL);
85
return self->shortdesc;
89
ide_doap_get_description (IdeDoap *self)
91
g_return_val_if_fail (IDE_IS_DOAP (self), NULL);
93
return self->description;
97
ide_doap_get_bug_database (IdeDoap *self)
99
g_return_val_if_fail (IDE_IS_DOAP (self), NULL);
101
return self->bug_database;
105
ide_doap_get_download_page (IdeDoap *self)
107
g_return_val_if_fail (IDE_IS_DOAP (self), NULL);
109
return self->download_page;
113
ide_doap_get_homepage (IdeDoap *self)
115
g_return_val_if_fail (IDE_IS_DOAP (self), NULL);
117
return self->homepage;
121
ide_doap_get_category (IdeDoap *self)
123
g_return_val_if_fail (IDE_IS_DOAP (self), NULL);
125
return self->category;
129
* ide_doap_get_languages:
131
* Returns: (transfer none): A #GStrv.
134
ide_doap_get_languages (IdeDoap *self)
136
g_return_val_if_fail (IDE_IS_DOAP (self), NULL);
138
if (self->languages != NULL)
139
return (gchar **)self->languages->pdata;
145
ide_doap_set_bug_database (IdeDoap *self,
146
const gchar *bug_database)
148
g_return_if_fail (IDE_IS_DOAP (self));
150
if (!ide_str_equal0 (self->bug_database, bug_database))
152
g_free (self->bug_database);
153
self->bug_database = g_strdup (bug_database);
154
g_object_notify_by_pspec (G_OBJECT (self), gParamSpecs [PROP_BUG_DATABASE]);
159
ide_doap_set_category (IdeDoap *self,
160
const gchar *category)
162
g_return_if_fail (IDE_IS_DOAP (self));
164
if (!ide_str_equal0 (self->category, category))
166
g_free (self->category);
167
self->category = g_strdup (category);
168
g_object_notify_by_pspec (G_OBJECT (self), gParamSpecs [PROP_CATEGORY]);
173
ide_doap_set_description (IdeDoap *self,
174
const gchar *description)
176
g_return_if_fail (IDE_IS_DOAP (self));
178
if (!ide_str_equal0 (self->description, description))
180
g_free (self->description);
181
self->description = g_strdup (description);
182
g_object_notify_by_pspec (G_OBJECT (self), gParamSpecs [PROP_DESCRIPTION]);
187
ide_doap_set_download_page (IdeDoap *self,
188
const gchar *download_page)
190
g_return_if_fail (IDE_IS_DOAP (self));
192
if (!ide_str_equal0 (self->download_page, download_page))
194
g_free (self->download_page);
195
self->download_page = g_strdup (download_page);
196
g_object_notify_by_pspec (G_OBJECT (self), gParamSpecs [PROP_DOWNLOAD_PAGE]);
201
ide_doap_set_homepage (IdeDoap *self,
202
const gchar *homepage)
204
g_return_if_fail (IDE_IS_DOAP (self));
206
if (!ide_str_equal0 (self->homepage, homepage))
208
g_free (self->homepage);
209
self->homepage = g_strdup (homepage);
210
g_object_notify_by_pspec (G_OBJECT (self), gParamSpecs [PROP_HOMEPAGE]);
215
ide_doap_set_name (IdeDoap *self,
218
g_return_if_fail (IDE_IS_DOAP (self));
220
if (!ide_str_equal0 (self->name, name))
223
self->name = g_strdup (name);
224
g_object_notify_by_pspec (G_OBJECT (self), gParamSpecs [PROP_NAME]);
229
ide_doap_set_shortdesc (IdeDoap *self,
230
const gchar *shortdesc)
232
g_return_if_fail (IDE_IS_DOAP (self));
234
if (!ide_str_equal0 (self->shortdesc, shortdesc))
236
g_free (self->shortdesc);
237
self->shortdesc = g_strdelimit (g_strdup (shortdesc), "\n", ' ');
238
g_object_notify_by_pspec (G_OBJECT (self), gParamSpecs [PROP_SHORTDESC]);
243
* ide_doap_get_maintainers:
247
* Returns: (transfer none) (element-type IdeDoapPerson*): A #GList of #IdeDoapPerson.
250
ide_doap_get_maintainers (IdeDoap *self)
252
g_return_val_if_fail (IDE_IS_DOAP (self), NULL);
254
return self->maintainers;
258
ide_doap_add_language (IdeDoap *self,
259
const gchar *language)
261
g_return_if_fail (IDE_IS_DOAP (self));
262
g_return_if_fail (language != NULL);
264
if (self->languages == NULL)
266
self->languages = g_ptr_array_new_with_free_func (g_free);
267
g_ptr_array_add (self->languages, NULL);
270
g_assert (self->languages->len > 0);
272
g_ptr_array_index (self->languages, self->languages->len - 1) = g_strdup (language);
273
g_ptr_array_add (self->languages, NULL);
275
g_object_notify_by_pspec (G_OBJECT (self), gParamSpecs [PROP_LANGUAGES]);
279
ide_doap_set_languages (IdeDoap *self,
284
g_return_if_fail (IDE_IS_DOAP (self));
286
if ((self->languages != NULL) && (self->languages->len > 0))
287
g_ptr_array_remove_range (self->languages, 0, self->languages->len);
289
g_object_freeze_notify (G_OBJECT (self));
290
for (i = 0; languages [i]; i++)
291
ide_doap_add_language (self, languages [i]);
292
g_object_thaw_notify (G_OBJECT (self));
296
ide_doap_finalize (GObject *object)
298
IdeDoap *self = (IdeDoap *)object;
300
g_clear_pointer (&self->bug_database, g_free);
301
g_clear_pointer (&self->category, g_free);
302
g_clear_pointer (&self->description, g_free);
303
g_clear_pointer (&self->download_page, g_free);
304
g_clear_pointer (&self->homepage, g_free);
305
g_clear_pointer (&self->languages, g_ptr_array_unref);
306
g_clear_pointer (&self->name, g_free);
307
g_clear_pointer (&self->shortdesc, g_free);
309
g_list_free_full (self->maintainers, g_object_unref);
310
self->maintainers = NULL;
312
G_OBJECT_CLASS (ide_doap_parent_class)->finalize (object);
316
ide_doap_get_property (GObject *object,
321
IdeDoap *self = IDE_DOAP (object);
325
case PROP_BUG_DATABASE:
326
g_value_set_string (value, ide_doap_get_bug_database (self));
330
g_value_set_string (value, ide_doap_get_category (self));
333
case PROP_DESCRIPTION:
334
g_value_set_string (value, ide_doap_get_description (self));
337
case PROP_DOWNLOAD_PAGE:
338
g_value_set_string (value, ide_doap_get_download_page (self));
342
g_value_set_string (value, ide_doap_get_homepage (self));
346
g_value_set_boxed (value, ide_doap_get_languages (self));
350
g_value_set_string (value, ide_doap_get_name (self));
354
g_value_set_string (value, ide_doap_get_shortdesc (self));
358
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
363
ide_doap_set_property (GObject *object,
368
IdeDoap *self = IDE_DOAP (object);
372
case PROP_BUG_DATABASE:
373
ide_doap_set_bug_database (self, g_value_get_string (value));
377
ide_doap_set_category (self, g_value_get_string (value));
380
case PROP_DESCRIPTION:
381
ide_doap_set_description (self, g_value_get_string (value));
384
case PROP_DOWNLOAD_PAGE:
385
ide_doap_set_download_page (self, g_value_get_string (value));
389
ide_doap_set_homepage (self, g_value_get_string (value));
393
ide_doap_set_languages (self, g_value_get_boxed (value));
397
ide_doap_set_name (self, g_value_get_string (value));
401
ide_doap_set_shortdesc (self, g_value_get_string (value));
405
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
410
ide_doap_class_init (IdeDoapClass *klass)
412
GObjectClass *object_class = G_OBJECT_CLASS (klass);
414
object_class->finalize = ide_doap_finalize;
415
object_class->get_property = ide_doap_get_property;
416
object_class->set_property = ide_doap_set_property;
418
gParamSpecs [PROP_BUG_DATABASE] =
419
g_param_spec_string ("bug-database",
423
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
425
gParamSpecs [PROP_CATEGORY] =
426
g_param_spec_string ("category",
430
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
432
gParamSpecs [PROP_DESCRIPTION] =
433
g_param_spec_string ("description",
437
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
439
gParamSpecs [PROP_DOWNLOAD_PAGE] =
440
g_param_spec_string ("download-page",
444
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
446
gParamSpecs [PROP_HOMEPAGE] =
447
g_param_spec_string ("homepage",
451
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
453
gParamSpecs [PROP_LANGUAGES] =
454
g_param_spec_string ("languages",
458
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
460
gParamSpecs [PROP_NAME] =
461
g_param_spec_string ("name",
465
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
467
gParamSpecs [PROP_SHORTDESC] =
468
g_param_spec_string ("shortdesc",
472
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
474
g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
478
ide_doap_init (IdeDoap *self)
483
ide_doap_parse_maintainer (IdeDoap *self,
486
g_assert (IDE_IS_DOAP (self));
487
g_assert (XML_IS_READER (reader));
489
if (!xml_reader_read (reader))
494
if (xml_reader_is_a_local (reader, "Person") && xml_reader_read (reader))
496
g_autoptr(IdeDoapPerson) person = ide_doap_person_new ();
500
if (xml_reader_is_a_local (reader, "name"))
502
ide_doap_person_set_name (person, xml_reader_read_string (reader));
504
else if (xml_reader_is_a_local (reader, "mbox"))
508
str = xml_reader_get_attribute (reader, "rdf:resource");
509
if (!ide_str_empty0 (str) && g_str_has_prefix (str, "mailto:"))
510
ide_doap_person_set_email (person, str + strlen ("mailto:"));
514
while (xml_reader_read_to_next (reader));
516
if (ide_doap_person_get_name (person) || ide_doap_person_get_email (person))
517
self->maintainers = g_list_append (self->maintainers, g_object_ref (person));
520
while (xml_reader_read_to_next (reader));
526
ide_doap_load_from_file (IdeDoap *self,
528
GCancellable *cancellable,
531
g_autoptr(XmlReader) reader = NULL;
533
g_return_val_if_fail (IDE_IS_DOAP (self), FALSE);
534
g_return_val_if_fail (G_IS_FILE (file), FALSE);
535
g_return_val_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable), FALSE);
537
reader = xml_reader_new ();
539
if (!xml_reader_load_from_file (reader, file, cancellable, error))
542
if (!xml_reader_read_start_element (reader, "Project"))
546
IDE_DOAP_ERROR_INVALID_FORMAT,
547
"Project element is missing from doap.");
551
g_object_freeze_notify (G_OBJECT (self));
553
xml_reader_read (reader);
557
const gchar *element_name;
559
element_name = xml_reader_get_local_name (reader);
561
if (ide_str_equal0 (element_name, "name") ||
562
ide_str_equal0 (element_name, "shortdesc") ||
563
ide_str_equal0 (element_name, "description"))
567
str = xml_reader_read_string (reader);
569
g_object_set (self, element_name, g_strstrip (str), NULL);
572
else if (ide_str_equal0 (element_name, "category") ||
573
ide_str_equal0 (element_name, "homepage") ||
574
ide_str_equal0 (element_name, "download-page") ||
575
ide_str_equal0 (element_name, "bug-database"))
579
str = xml_reader_get_attribute (reader, "rdf:resource");
581
g_object_set (self, element_name, g_strstrip (str), NULL);
584
else if (ide_str_equal0 (element_name, "programming-language"))
588
str = xml_reader_read_string (reader);
589
if (!ide_str_empty0 (str))
590
ide_doap_add_language (self, g_strstrip (str));
593
else if (ide_str_equal0 (element_name, "maintainer"))
595
if (!ide_doap_parse_maintainer (self, reader))
599
while (xml_reader_read_to_next (reader));
601
g_object_thaw_notify (G_OBJECT (self));