2 * this file is part of evince, a gnome document viewer
4 * Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
6 * Evince is free software; you can redistribute it and/or modify it
7 * 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.
11 * Evince is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
24 #include "ev-metadata.h"
33 struct _EvMetadataClass {
34 GObjectClass base_class;
37 G_DEFINE_TYPE (EvMetadata, ev_metadata, G_TYPE_OBJECT)
39 #define EV_METADATA_NAMESPACE "metadata::evince"
42 ev_metadata_finalize (GObject *object)
44 EvMetadata *metadata = EV_METADATA (object);
46 if (metadata->items) {
47 g_hash_table_destroy (metadata->items);
48 metadata->items = NULL;
52 g_object_unref (metadata->file);
53 metadata->file = NULL;
56 G_OBJECT_CLASS (ev_metadata_parent_class)->finalize (object);
60 ev_metadata_init (EvMetadata *metadata)
62 metadata->items = g_hash_table_new_full (g_str_hash,
69 ev_metadata_class_init (EvMetadataClass *klass)
71 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
73 gobject_class->finalize = ev_metadata_finalize;
77 ev_metadata_load (EvMetadata *metadata)
84 info = g_file_query_info (metadata->file, "metadata::*", 0, NULL, &error);
86 g_warning ("%s", error->message);
92 #if GLIB_CHECK_VERSION(2,22,0)
93 if (!g_file_info_has_namespace (info, "metadata")) {
94 g_object_unref (info);
100 attrs = g_file_info_list_attributes (info, "metadata");
101 for (i = 0; attrs[i]; i++) {
102 GFileAttributeType type;
106 if (!g_str_has_prefix (attrs[i], EV_METADATA_NAMESPACE))
109 if (!g_file_info_get_attribute_data (info, attrs[i],
110 &type, &value, NULL)) {
114 key = attrs[i] + strlen (EV_METADATA_NAMESPACE"::");
116 if (type == G_FILE_ATTRIBUTE_TYPE_STRING) {
117 g_hash_table_insert (metadata->items,
123 g_object_unref (info);
127 ev_metadata_new (GFile *file)
129 EvMetadata *metadata;
131 g_return_val_if_fail (G_IS_FILE (file), NULL);
133 metadata = EV_METADATA (g_object_new (EV_TYPE_METADATA, NULL));
134 metadata->file = g_object_ref (file);
136 ev_metadata_load (metadata);
142 ev_metadata_get_string (EvMetadata *metadata,
148 v = g_hash_table_lookup (metadata->items, key);
157 metadata_set_callback (GObject *file,
158 GAsyncResult *result,
159 EvMetadata *metadata)
161 GError *error = NULL;
163 if (!g_file_set_attributes_finish (G_FILE (file), result, NULL, &error)) {
164 g_warning ("%s", error->message);
165 g_error_free (error);
170 ev_metadata_set_string (EvMetadata *metadata,
177 info = g_file_info_new ();
179 gio_key = g_strconcat (EV_METADATA_NAMESPACE"::", key, NULL);
181 g_file_info_set_attribute_string (info, gio_key, value);
183 g_file_info_set_attribute (info, gio_key,
184 G_FILE_ATTRIBUTE_TYPE_INVALID,
189 g_hash_table_insert (metadata->items, g_strdup (key), g_strdup (value));
190 g_file_set_attributes_async (metadata->file,
195 (GAsyncReadyCallback)metadata_set_callback,
197 g_object_unref (info);
203 ev_metadata_get_int (EvMetadata *metadata,
211 if (!ev_metadata_get_string (metadata, key, &string_value))
214 int_value = g_ascii_strtoull (string_value, &endptr, 0);
215 if (int_value == 0 && string_value == endptr)
223 ev_metadata_set_int (EvMetadata *metadata,
227 gchar string_value[32];
229 g_snprintf (string_value, sizeof (string_value), "%d", value);
231 return ev_metadata_set_string (metadata, key, string_value);
235 ev_metadata_get_double (EvMetadata *metadata,
241 gdouble double_value;
243 if (!ev_metadata_get_string (metadata, key, &string_value))
246 double_value = g_ascii_strtod (string_value, &endptr);
247 if (double_value == 0. && string_value == endptr)
250 *value = double_value;
255 ev_metadata_set_double (EvMetadata *metadata,
259 gchar string_value[G_ASCII_DTOSTR_BUF_SIZE];
261 g_ascii_dtostr (string_value, G_ASCII_DTOSTR_BUF_SIZE, value);
263 return ev_metadata_set_string (metadata, key, string_value);
267 ev_metadata_get_boolean (EvMetadata *metadata,
273 if (!ev_metadata_get_int (metadata, key, &int_value))
281 ev_metadata_set_boolean (EvMetadata *metadata,
285 return ev_metadata_set_string (metadata, key, value ? "1" : "0");
289 ev_is_metadata_supported_for_file (GFile *file)
291 GFileAttributeInfoList *namespaces;
293 gboolean retval = FALSE;
295 namespaces = g_file_query_writable_namespaces (file, NULL, NULL);
299 for (i = 0; i < namespaces->n_infos; i++) {
300 if (strcmp (namespaces->infos[i].name, "metadata") == 0) {
306 g_file_attribute_info_list_unref (namespaces);