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