You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gnome-vfs2/gnome-vfs-2.16.0-cvs-backpo...

422 lines
13 KiB

Index: libgnomevfs/xdgmime.c
===================================================================
RCS file: /cvs/gnome/gnome-vfs/libgnomevfs/xdgmime.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -p -r1.13 -r1.14
--- libgnomevfs/xdgmime.c 1 Dec 2005 19:32:02 -0000 1.13
+++ libgnomevfs/xdgmime.c 13 Sep 2006 09:23:36 -0000 1.14
@@ -60,7 +60,7 @@ static XdgCallbackList *callback_list =
XdgMimeCache **_caches = NULL;
static int n_caches = 0;
-const char *xdg_mime_type_unknown = "application/octet-stream";
+const char xdg_mime_type_unknown[] = "application/octet-stream";
enum
@@ -281,7 +281,8 @@ xdg_run_command_on_dirs (XdgDirectoryFun
* FIXME: This doesn't protect against permission changes.
*/
static int
-xdg_check_file (const char *file_path)
+xdg_check_file (const char *file_path,
+ int *exists)
{
struct stat st;
@@ -290,6 +291,9 @@ xdg_check_file (const char *file_path)
{
XdgDirTimeList *list;
+ if (exists)
+ *exists = TRUE;
+
for (list = dir_time_list; list; list = list->next)
{
if (! strcmp (list->directory_name, file_path) &&
@@ -306,6 +310,9 @@ xdg_check_file (const char *file_path)
return TRUE;
}
+ if (exists)
+ *exists = FALSE;
+
return FALSE;
}
@@ -313,26 +320,30 @@ static int
xdg_check_dir (const char *directory,
int *invalid_dir_list)
{
- int invalid;
+ int invalid, exists;
char *file_name;
assert (directory != NULL);
- /* Check the globs file */
- file_name = malloc (strlen (directory) + strlen ("/mime/globs") + 1);
- strcpy (file_name, directory); strcat (file_name, "/mime/globs");
- invalid = xdg_check_file (file_name);
+ /* Check the mime.cache file */
+ file_name = malloc (strlen (directory) + strlen ("/mime/mime.cache") + 1);
+ strcpy (file_name, directory); strcat (file_name, "/mime/mime.cache");
+ invalid = xdg_check_file (file_name, &exists);
free (file_name);
if (invalid)
{
*invalid_dir_list = TRUE;
return TRUE;
}
+ else if (exists)
+ {
+ return FALSE;
+ }
- /* Check the magic file */
- file_name = malloc (strlen (directory) + strlen ("/mime/magic") + 1);
- strcpy (file_name, directory); strcat (file_name, "/mime/magic");
- invalid = xdg_check_file (file_name);
+ /* Check the globs file */
+ file_name = malloc (strlen (directory) + strlen ("/mime/globs") + 1);
+ strcpy (file_name, directory); strcat (file_name, "/mime/globs");
+ invalid = xdg_check_file (file_name, NULL);
free (file_name);
if (invalid)
{
@@ -340,10 +351,10 @@ xdg_check_dir (const char *directory,
return TRUE;
}
- /* Check the mime.cache file */
- file_name = malloc (strlen (directory) + strlen ("/mime/mime.cache") + 1);
- strcpy (file_name, directory); strcat (file_name, "/mime/mime.cache");
- invalid = xdg_check_file (file_name);
+ /* Check the magic file */
+ file_name = malloc (strlen (directory) + strlen ("/mime/magic") + 1);
+ strcpy (file_name, directory); strcat (file_name, "/mime/magic");
+ invalid = xdg_check_file (file_name, NULL);
free (file_name);
if (invalid)
{
@@ -584,6 +595,17 @@ xdg_mime_shutdown (void)
parent_list = NULL;
}
+ if (_caches)
+ {
+ int i;
+
+ for (i = 0; i < n_caches; i++)
+ _xdg_mime_cache_unref (_caches[i]);
+ free (_caches);
+ _caches = NULL;
+ n_caches = 0;
+ }
+
for (list = callback_list; list; list = list->next)
(list->callback) (list->data);
@@ -602,12 +624,10 @@ xdg_mime_get_max_buffer_extents (void)
}
const char *
-xdg_mime_unalias_mime_type (const char *mime_type)
+_xdg_mime_unalias_mime_type (const char *mime_type)
{
const char *lookup;
- xdg_mime_init ();
-
if (_caches)
return _xdg_mime_cache_unalias_mime_type (mime_type);
@@ -617,16 +637,22 @@ xdg_mime_unalias_mime_type (const char *
return mime_type;
}
+const char *
+xdg_mime_unalias_mime_type (const char *mime_type)
+{
+ xdg_mime_init ();
+
+ return _xdg_mime_unalias_mime_type (mime_type);
+}
+
int
-xdg_mime_mime_type_equal (const char *mime_a,
- const char *mime_b)
+_xdg_mime_mime_type_equal (const char *mime_a,
+ const char *mime_b)
{
const char *unalias_a, *unalias_b;
- xdg_mime_init ();
-
- unalias_a = xdg_mime_unalias_mime_type (mime_a);
- unalias_b = xdg_mime_unalias_mime_type (mime_b);
+ unalias_a = _xdg_mime_unalias_mime_type (mime_a);
+ unalias_b = _xdg_mime_unalias_mime_type (mime_b);
if (strcmp (unalias_a, unalias_b) == 0)
return 1;
@@ -635,6 +661,15 @@ xdg_mime_mime_type_equal (const char *mi
}
int
+xdg_mime_mime_type_equal (const char *mime_a,
+ const char *mime_b)
+{
+ xdg_mime_init ();
+
+ return _xdg_mime_mime_type_equal (mime_a, mime_b);
+}
+
+int
xdg_mime_media_type_equal (const char *mime_a,
const char *mime_b)
{
@@ -650,7 +685,7 @@ xdg_mime_media_type_equal (const char *m
return 0;
}
-#if 0
+#if 1
static int
xdg_mime_is_super_type (const char *mime)
{
@@ -668,24 +703,22 @@ xdg_mime_is_super_type (const char *mime
#endif
int
-xdg_mime_mime_type_subclass (const char *mime,
- const char *base)
+_xdg_mime_mime_type_subclass (const char *mime,
+ const char *base)
{
const char *umime, *ubase;
const char **parents;
- xdg_mime_init ();
-
if (_caches)
return _xdg_mime_cache_mime_type_subclass (mime, base);
- umime = xdg_mime_unalias_mime_type (mime);
- ubase = xdg_mime_unalias_mime_type (base);
+ umime = _xdg_mime_unalias_mime_type (mime);
+ ubase = _xdg_mime_unalias_mime_type (base);
if (strcmp (umime, ubase) == 0)
return 1;
-#if 0
+#if 1
/* Handle supertypes */
if (xdg_mime_is_super_type (ubase) &&
xdg_mime_media_type_equal (umime, ubase))
@@ -703,13 +736,22 @@ xdg_mime_mime_type_subclass (const char
parents = _xdg_mime_parent_list_lookup (parent_list, umime);
for (; parents && *parents; parents++)
{
- if (xdg_mime_mime_type_subclass (*parents, ubase))
+ if (_xdg_mime_mime_type_subclass (*parents, ubase))
return 1;
}
return 0;
}
+int
+xdg_mime_mime_type_subclass (const char *mime,
+ const char *base)
+{
+ xdg_mime_init ();
+
+ return _xdg_mime_mime_type_subclass (mime, base);
+}
+
char **
xdg_mime_list_mime_parents (const char *mime)
{
@@ -741,7 +783,7 @@ xdg_mime_get_mime_parents (const char *m
xdg_mime_init ();
- umime = xdg_mime_unalias_mime_type (mime);
+ umime = _xdg_mime_unalias_mime_type (mime);
return _xdg_mime_parent_list_lookup (parent_list, umime);
}
Index: libgnomevfs/xdgmime.h
===================================================================
RCS file: /cvs/gnome/gnome-vfs/libgnomevfs/xdgmime.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -p -r1.10 -r1.11
--- libgnomevfs/xdgmime.h 19 Oct 2005 12:40:26 -0000 1.10
+++ libgnomevfs/xdgmime.h 13 Sep 2006 09:23:36 -0000 1.11
@@ -59,12 +59,13 @@ typedef void (*XdgMimeDestroy) (void *u
#define xdg_mime_unalias_mime_type XDG_ENTRY(unalias_mime_type)
#define xdg_mime_get_max_buffer_extents XDG_ENTRY(get_max_buffer_extents)
#define xdg_mime_shutdown XDG_ENTRY(shutdown)
+#define xdg_mime_dump XDG_ENTRY(dump)
#define xdg_mime_register_reload_callback XDG_ENTRY(register_reload_callback)
#define xdg_mime_remove_callback XDG_ENTRY(remove_callback)
#define xdg_mime_type_unknown XDG_ENTRY(type_unknown)
#endif
-extern const char *xdg_mime_type_unknown;
+extern const char xdg_mime_type_unknown[];
#define XDG_MIME_TYPE_UNKNOWN xdg_mime_type_unknown
const char *xdg_mime_get_mime_type_for_data (const void *data,
@@ -95,8 +96,17 @@ int xdg_mime_register_reload_ca
XdgMimeDestroy destroy);
void xdg_mime_remove_callback (int callback_id);
+ /* Private versions of functions that don't call xdg_mime_init () */
+int _xdg_mime_mime_type_equal (const char *mime_a,
+ const char *mime_b);
+int _xdg_mime_media_type_equal (const char *mime_a,
+ const char *mime_b);
+int _xdg_mime_mime_type_subclass (const char *mime,
+ const char *base);
+const char *_xdg_mime_unalias_mime_type (const char *mime);
+
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
-
#endif /* __XDG_MIME_H__ */
Index: libgnomevfs/xdgmimeglob.c
===================================================================
RCS file: /cvs/gnome/gnome-vfs/libgnomevfs/xdgmimeglob.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -p -r1.12 -r1.13
--- libgnomevfs/xdgmimeglob.c 2 Mar 2006 17:13:50 -0000 1.12
+++ libgnomevfs/xdgmimeglob.c 13 Sep 2006 09:23:36 -0000 1.13
@@ -263,7 +263,7 @@ _xdg_glob_hash_insert_text (XdgGlobHashN
{
child = _xdg_glob_hash_node_new ();
child->character = '\000';
- child->mime_type = strdup (mime_type);
+ child->mime_type = mime_type;
child->child = NULL;
child->next = node->child;
node->child = child;
@@ -272,7 +272,7 @@ _xdg_glob_hash_insert_text (XdgGlobHashN
}
else
{
- node->mime_type = strdup (mime_type);
+ node->mime_type = mime_type;
}
}
else
@@ -308,11 +308,13 @@ _xdg_glob_hash_node_lookup_file_name (Xd
if (*file_name == '\000')
{
n = 0;
- mime_types[n++] = node->mime_type;
+ if (node->mime_type)
+ mime_types[n++] = node->mime_type;
node = node->child;
while (n < n_mime_types && node && node->character == 0)
{
- mime_types[n++] = node->mime_type;
+ if (node->mime_type)
+ mime_types[n++] = node->mime_type;
node = node->next;
}
}
@@ -475,7 +477,7 @@ _xdg_glob_hash_append_glob (XdgGlobHash
glob_hash->literal_list = _xdg_glob_list_append (glob_hash->literal_list, strdup (glob), strdup (mime_type));
break;
case XDG_GLOB_SIMPLE:
- glob_hash->simple_node = _xdg_glob_hash_insert_text (glob_hash->simple_node, glob + 1, mime_type);
+ glob_hash->simple_node = _xdg_glob_hash_insert_text (glob_hash->simple_node, glob + 1, strdup (mime_type));
break;
case XDG_GLOB_FULL:
glob_hash->full_list = _xdg_glob_list_append (glob_hash->full_list, strdup (glob), strdup (mime_type));
Index: libgnomevfs/xdgmimemagic.c
===================================================================
RCS file: /cvs/gnome/gnome-vfs/libgnomevfs/xdgmimemagic.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -p -r1.16 -r1.17
--- libgnomevfs/xdgmimemagic.c 13 Jul 2006 19:02:47 -0000 1.16
+++ libgnomevfs/xdgmimemagic.c 13 Sep 2006 09:23:36 -0000 1.17
@@ -671,7 +671,7 @@ _xdg_mime_magic_lookup_data (XdgMimeMagi
if (_xdg_mime_magic_match_compare_to_data (match, data, len))
{
if (!had_match || match->priority > priority ||
- (mime_type != NULL && xdg_mime_mime_type_subclass (match->mime_type, mime_type)))
+ (mime_type != NULL && _xdg_mime_mime_type_subclass (match->mime_type, mime_type)))
{
mime_type = match->mime_type;
priority = match->priority;
@@ -688,7 +688,7 @@ _xdg_mime_magic_lookup_data (XdgMimeMagi
for (n = 0; n < n_mime_types; n++)
{
if (mime_types[n] &&
- xdg_mime_mime_type_equal (mime_types[n], match->mime_type))
+ _xdg_mime_mime_type_equal (mime_types[n], match->mime_type))
mime_types[n] = NULL;
}
}
Index: modules/http-neon-method.c
===================================================================
RCS file: /cvs/gnome/gnome-vfs/modules/http-neon-method.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -p -r1.39 -r1.40
--- modules/http-neon-method.c 1 Sep 2006 19:28:27 -0000 1.39
+++ modules/http-neon-method.c 15 Sep 2006 19:31:00 -0000 1.40
@@ -400,6 +400,7 @@ G_LOCK_DEFINE (auth_cache);
static GHashTable *auth_cache_basic;
static GHashTable *auth_cache_proxy;
static guint cleanup_id;
+static guint module_refcount = 0;
typedef struct {
@@ -3331,20 +3332,24 @@ static GnomeVFSMethod http_method = {
GnomeVFSMethod *
vfs_module_init (const char *method_name, const char *args)
{
- proxy_init ();
- /* ne_debug_init (stdout, 0xfffe); */
- neon_session_pool_init ();
- http_auth_cache_init ();
- quick_allow_lookup_init ();
-
+ if (module_refcount++ == 0) {
+ proxy_init ();
+ /* ne_debug_init (stdout, 0xfffe); */
+ neon_session_pool_init ();
+ http_auth_cache_init ();
+ quick_allow_lookup_init ();
+ }
+
return &http_method;
}
void
vfs_module_shutdown (GnomeVFSMethod *method)
{
- quit_allow_lookup_destroy ();
- http_auth_cache_shutdown ();
- neon_session_pool_shutdown ();
- proxy_shutdown ();
+ if (--module_refcount == 0) {
+ quit_allow_lookup_destroy ();
+ http_auth_cache_shutdown ();
+ neon_session_pool_shutdown ();
+ proxy_shutdown ();
+ }
}