1 /*
2 * caja-file-info.c - Information about a file
3 *
4 * Copyright (C) 2003 Novell, Inc.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library 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 GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the Free
18 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
19 *
20 */
21
22 #include <config.h>
23 #include "caja-file-info.h"
24 #include "caja-extension-private.h"
25
26 CajaFileInfo *(*caja_file_info_getter) (GFile *location, gboolean create);
27
28 /**
29 * SECTION:caja-file-info
30 * @title: CajaFileInfo
31 * @short_description: File interface for caja extensions
32 * @include: libcaja-extension/caja-file-info.h
33 *
34 * #CajaFileInfo provides methods to get and modify information
35 * about file objects in the file manager.
36 */
37
38 /**
39 * caja_file_info_list_copy:
40 * @files: (element-type CajaFileInfo): the files to copy
41 *
42 * Returns: (element-type CajaFileInfo) (transfer full): a copy of @files.
43 * Use #caja_file_info_list_free to free the list and unref its contents.
44 */
45 GList *
caja_file_info_list_copy(GList * files)46 caja_file_info_list_copy (GList *files)
47 {
48 GList *ret;
49 GList *l;
50
51 ret = g_list_copy (files);
52 for (l = ret; l != NULL; l = l->next)
53 {
54 g_object_ref (G_OBJECT (l->data));
55 }
56
57 return ret;
58 }
59
60 /**
61 * caja_file_info_list_free:
62 * @files: (element-type CajaFileInfo): a list created with
63 * #caja_file_info_list_copy
64 *
65 */
66 void
caja_file_info_list_free(GList * files)67 caja_file_info_list_free (GList *files)
68 {
69 GList *l;
70
71 for (l = files; l != NULL; l = l->next)
72 {
73 g_object_unref (G_OBJECT (l->data));
74 }
75
76 g_list_free (files);
77 }
78
79 static void
caja_file_info_base_init(gpointer g_class)80 caja_file_info_base_init (gpointer g_class)
81 {
82 }
83
84 GType
caja_file_info_get_type(void)85 caja_file_info_get_type (void)
86 {
87 static GType type = 0;
88
89 if (!type) {
90 const GTypeInfo info = {
91 sizeof (CajaFileInfoIface),
92 caja_file_info_base_init,
93 NULL,
94 NULL,
95 NULL,
96 NULL,
97 0,
98 0,
99 NULL
100 };
101
102 type = g_type_register_static (G_TYPE_INTERFACE,
103 "CajaFileInfo",
104 &info, 0);
105 g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
106 }
107
108 return type;
109 }
110
111 gboolean
caja_file_info_is_gone(CajaFileInfo * file)112 caja_file_info_is_gone (CajaFileInfo *file)
113 {
114 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), FALSE);
115 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->is_gone != NULL, FALSE);
116
117 return CAJA_FILE_INFO_GET_IFACE (file)->is_gone (file);
118 }
119
120 GFileType
caja_file_info_get_file_type(CajaFileInfo * file)121 caja_file_info_get_file_type (CajaFileInfo *file)
122 {
123 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), G_FILE_TYPE_UNKNOWN);
124 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->get_file_type != NULL, G_FILE_TYPE_UNKNOWN);
125
126 return CAJA_FILE_INFO_GET_IFACE (file)->get_file_type (file);
127 }
128
129 char *
caja_file_info_get_name(CajaFileInfo * file)130 caja_file_info_get_name (CajaFileInfo *file)
131 {
132 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), NULL);
133 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->get_name != NULL, NULL);
134
135 return CAJA_FILE_INFO_GET_IFACE (file)->get_name (file);
136 }
137
138 /**
139 * caja_file_info_get_location:
140 * @file: a #CajaFileInfo
141 *
142 * Returns: (transfer full): a #GFile for the location of @file
143 */
144 GFile *
caja_file_info_get_location(CajaFileInfo * file)145 caja_file_info_get_location (CajaFileInfo *file)
146 {
147 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), NULL);
148 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->get_location != NULL, NULL);
149
150 return CAJA_FILE_INFO_GET_IFACE (file)->get_location (file);
151 }
152
153 char *
caja_file_info_get_uri(CajaFileInfo * file)154 caja_file_info_get_uri (CajaFileInfo *file)
155 {
156 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), NULL);
157 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->get_uri != NULL, NULL);
158
159 return CAJA_FILE_INFO_GET_IFACE (file)->get_uri (file);
160 }
161
162 char *
caja_file_info_get_activation_uri(CajaFileInfo * file)163 caja_file_info_get_activation_uri (CajaFileInfo *file)
164 {
165 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), NULL);
166 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->get_activation_uri != NULL, NULL);
167
168 return CAJA_FILE_INFO_GET_IFACE (file)->get_activation_uri (file);
169 }
170
171 /**
172 * caja_file_info_get_parent_location:
173 * @file: a #CajaFileInfo
174 *
175 * Returns: (allow-none) (transfer full): a #GFile for the parent location of @file,
176 * or %NULL if @file has no parent
177 */
178 GFile *
caja_file_info_get_parent_location(CajaFileInfo * file)179 caja_file_info_get_parent_location (CajaFileInfo *file)
180 {
181 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), NULL);
182 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->get_parent_location != NULL, NULL);
183
184 return CAJA_FILE_INFO_GET_IFACE (file)->get_parent_location (file);
185 }
186
187 char *
caja_file_info_get_parent_uri(CajaFileInfo * file)188 caja_file_info_get_parent_uri (CajaFileInfo *file)
189 {
190 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), NULL);
191 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->get_parent_uri != NULL, NULL);
192
193 return CAJA_FILE_INFO_GET_IFACE (file)->get_parent_uri (file);
194 }
195
196 /**
197 * caja_file_info_get_parent_info:
198 * @file: a #CajaFileInfo
199 *
200 * Returns: (allow-none) (transfer full): a #CajaFileInfo for the parent of @file,
201 * or %NULL if @file has no parent
202 */
203 CajaFileInfo *
caja_file_info_get_parent_info(CajaFileInfo * file)204 caja_file_info_get_parent_info (CajaFileInfo *file)
205 {
206 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), NULL);
207 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->get_parent_info != NULL, NULL);
208
209 return CAJA_FILE_INFO_GET_IFACE (file)->get_parent_info (file);
210 }
211
212 /**
213 * caja_file_info_get_mount:
214 * @file: a #CajaFileInfo
215 *
216 * Returns: (allow-none) (transfer full): a #GMount for the mount of @file,
217 * or %NULL if @file has no mount
218 */
219 GMount *
caja_file_info_get_mount(CajaFileInfo * file)220 caja_file_info_get_mount (CajaFileInfo *file)
221 {
222 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), NULL);
223 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->get_mount != NULL, NULL);
224
225 return CAJA_FILE_INFO_GET_IFACE (file)->get_mount (file);
226 }
227
228 char *
caja_file_info_get_uri_scheme(CajaFileInfo * file)229 caja_file_info_get_uri_scheme (CajaFileInfo *file)
230 {
231 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), NULL);
232 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->get_uri_scheme != NULL, NULL);
233
234 return CAJA_FILE_INFO_GET_IFACE (file)->get_uri_scheme (file);
235 }
236
237 char *
caja_file_info_get_mime_type(CajaFileInfo * file)238 caja_file_info_get_mime_type (CajaFileInfo *file)
239 {
240 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), NULL);
241 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->get_mime_type != NULL, NULL);
242
243 return CAJA_FILE_INFO_GET_IFACE (file)->get_mime_type (file);
244 }
245
246 gboolean
caja_file_info_is_mime_type(CajaFileInfo * file,const char * mime_type)247 caja_file_info_is_mime_type (CajaFileInfo *file,
248 const char *mime_type)
249 {
250 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), FALSE);
251 g_return_val_if_fail (mime_type != NULL, FALSE);
252 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->is_mime_type != NULL, FALSE);
253
254 return CAJA_FILE_INFO_GET_IFACE (file)->is_mime_type (file,
255 mime_type);
256 }
257
258 gboolean
caja_file_info_is_directory(CajaFileInfo * file)259 caja_file_info_is_directory (CajaFileInfo *file)
260 {
261 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), FALSE);
262 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->is_directory != NULL, FALSE);
263
264 return CAJA_FILE_INFO_GET_IFACE (file)->is_directory (file);
265 }
266
267 gboolean
caja_file_info_can_write(CajaFileInfo * file)268 caja_file_info_can_write (CajaFileInfo *file)
269 {
270 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), FALSE);
271 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->can_write != NULL, FALSE);
272
273 return CAJA_FILE_INFO_GET_IFACE (file)->can_write (file);
274 }
275
276 void
caja_file_info_add_emblem(CajaFileInfo * file,const char * emblem_name)277 caja_file_info_add_emblem (CajaFileInfo *file,
278 const char *emblem_name)
279 {
280 g_return_if_fail (CAJA_IS_FILE_INFO (file));
281 g_return_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->add_emblem != NULL);
282
283 CAJA_FILE_INFO_GET_IFACE (file)->add_emblem (file, emblem_name);
284 }
285
286 char *
caja_file_info_get_string_attribute(CajaFileInfo * file,const char * attribute_name)287 caja_file_info_get_string_attribute (CajaFileInfo *file,
288 const char *attribute_name)
289 {
290 g_return_val_if_fail (CAJA_IS_FILE_INFO (file), NULL);
291 g_return_val_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->get_string_attribute != NULL, NULL);
292 g_return_val_if_fail (attribute_name != NULL, NULL);
293
294 return CAJA_FILE_INFO_GET_IFACE (file)->get_string_attribute
295 (file, attribute_name);
296 }
297
298 void
caja_file_info_add_string_attribute(CajaFileInfo * file,const char * attribute_name,const char * value)299 caja_file_info_add_string_attribute (CajaFileInfo *file,
300 const char *attribute_name,
301 const char *value)
302 {
303 g_return_if_fail (CAJA_IS_FILE_INFO (file));
304 g_return_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->add_string_attribute != NULL);
305 g_return_if_fail (attribute_name != NULL);
306 g_return_if_fail (value != NULL);
307
308 CAJA_FILE_INFO_GET_IFACE (file)->add_string_attribute
309 (file, attribute_name, value);
310 }
311
312 void
caja_file_info_invalidate_extension_info(CajaFileInfo * file)313 caja_file_info_invalidate_extension_info (CajaFileInfo *file)
314 {
315 g_return_if_fail (CAJA_IS_FILE_INFO (file));
316 g_return_if_fail (CAJA_FILE_INFO_GET_IFACE (file)->invalidate_extension_info != NULL);
317
318 CAJA_FILE_INFO_GET_IFACE (file)->invalidate_extension_info (file);
319 }
320
321 /**
322 * caja_file_info_lookup:
323 * @location: the location to lookup the file info for
324 *
325 * Returns: (transfer full): a #CajaFileInfo
326 */
327 CajaFileInfo *
caja_file_info_lookup(GFile * location)328 caja_file_info_lookup (GFile *location)
329 {
330 return caja_file_info_getter (location, FALSE);
331 }
332
333 /**
334 * caja_file_info_create:
335 * @location: the location to create the file info for
336 *
337 * Returns: (transfer full): a #CajaFileInfo
338 */
339 CajaFileInfo *
caja_file_info_create(GFile * location)340 caja_file_info_create (GFile *location)
341 {
342 return caja_file_info_getter (location, TRUE);
343 }
344
345 /**
346 * caja_file_info_lookup_for_uri:
347 * @uri: the URI to lookup the file info for
348 *
349 * Returns: (transfer full): a #CajaFileInfo
350 */
351 CajaFileInfo *
caja_file_info_lookup_for_uri(const char * uri)352 caja_file_info_lookup_for_uri (const char *uri)
353 {
354 GFile *location;
355 CajaFile *file;
356
357 location = g_file_new_for_uri (uri);
358 file = caja_file_info_lookup (location);
359 g_object_unref (location);
360
361 return file;
362 }
363
364 /**
365 * caja_file_info_create_for_uri:
366 * @uri: the URI to lookup the file info for
367 *
368 * Returns: (transfer full): a #CajaFileInfo
369 */
370 CajaFileInfo *
caja_file_info_create_for_uri(const char * uri)371 caja_file_info_create_for_uri (const char *uri)
372 {
373 GFile *location;
374 CajaFile *file;
375
376 location = g_file_new_for_uri (uri);
377 file = caja_file_info_create (location);
378 g_object_unref (location);
379
380 return file;
381 }
382