File: pps-backend-info.c

package info (click to toggle)
papers 49.2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 21,140 kB
  • sloc: ansic: 37,721; sh: 197; xml: 127; makefile: 112
file content (123 lines) | stat: -rw-r--r-- 2,926 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// SPDX-License-Identifier: GPL-2.0-or-later
/* this file is part of papers, a gnome document viewer
 *
 *  Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
 */

#include <config.h>

#include "pps-backend-info.h"

#define PPS_BACKENDS_GROUP "Papers Backend"
#define PPS_BACKENDS_EXTENSION ".papers-backend"

void
_pps_backend_info_free (PpsBackendInfo *info)
{
	if (info == NULL)
		return;

	g_free (info->module_name);
	g_free (info->type_desc);
	g_strfreev (info->mime_types);
	g_free (info);
}

/**
 * _pps_backend_info_new_from_file:
 * @path: path to the backends file
 * @error: a location to store a #GError, or %NULL
 *
 * Loads backend information from @path.
 *
 * Returns: a new #PpsBackendInfo, or %NULL on error with @error filled in
 */
static PpsBackendInfo *
_pps_backend_info_new_from_file (const char *file,
                                 GError **error)
{
	PpsBackendInfo *info = NULL;
	g_autoptr (GKeyFile) backend_file = NULL;

	backend_file = g_key_file_new ();
	if (!g_key_file_load_from_file (backend_file, file, G_KEY_FILE_NONE, error))
		goto err;

	info = g_new0 (PpsBackendInfo, 1);

	info->module_name = g_key_file_get_string (backend_file, PPS_BACKENDS_GROUP,
	                                           "Module", error);
	if (!info->module_name)
		goto err;

	info->resident = g_key_file_get_boolean (backend_file, PPS_BACKENDS_GROUP,
	                                         "Resident", NULL);

	info->type_desc = g_key_file_get_locale_string (backend_file, PPS_BACKENDS_GROUP,
	                                                "TypeDescription", NULL, error);
	if (!info->type_desc)
		goto err;

	info->mime_types = g_key_file_get_string_list (backend_file, PPS_BACKENDS_GROUP,
	                                               "MimeType", NULL, error);
	if (!info->mime_types)
		goto err;

	return info;

err:
	if (info)
		_pps_backend_info_free (info);

	return NULL;
}

/*
 * _pps_backend_info_load_from_dir:
 * @path: a directory name
 *
 * Load all backend infos from @path.
 *
 * Returns: a newly allocated #GList containing newly allocated
 *   #PpsBackendInfo objects
 */
GList *
_pps_backend_info_load_from_dir (const char *path)
{
	GList *list = NULL;
	GDir *dir;
	const gchar *dirent;
	g_autoptr (GError) error = NULL;

	dir = g_dir_open (path, 0, &error);
	if (!dir) {
		g_warning ("%s", error->message);
		return FALSE;
	}

	while ((dirent = g_dir_read_name (dir))) {
		PpsBackendInfo *info;
		gchar *file;

		if (!g_str_has_suffix (dirent, PPS_BACKENDS_EXTENSION))
			continue;

		file = g_build_filename (path, dirent, NULL);
		info = _pps_backend_info_new_from_file (file, &error);
		if (error != NULL) {
			g_warning ("Failed to load backend info from '%s': %s\n",
			           file, error->message);
			g_clear_error (&error);
		}
		g_free (file);

		if (info == NULL)
			continue;

		list = g_list_prepend (list, info);
	}

	g_dir_close (dir);

	return list;
}