[Xfce4-commits] r23485 - in xarchiver/branches/xarchiver-psybsd: libxarchiver src

Stephan Arts stephan at xfce.org
Fri Oct 20 12:37:10 UTC 2006


Author: stephan
Date: 2006-10-20 12:37:07 +0000 (Fri, 20 Oct 2006)
New Revision: 23485

Modified:
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-rar.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-unrar.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h
   xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.h
   xarchiver/branches/xarchiver-psybsd/libxarchiver/libxarchiver.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/mime.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.h
   xarchiver/branches/xarchiver-psybsd/src/archive_store.c
   xarchiver/branches/xarchiver-psybsd/src/main.c
Log:
The library is possibly thread safe



Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c	2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c	2006-10-20 12:37:07 UTC (rev 23485)
@@ -110,28 +110,28 @@
 	if(program_path)
 	{
 		lxa_archive_support_add_mime(archive_support, "application/x-tarz");
-		g_free(program_path);
+		LXA_FREE(program_path);
 	}
 	/* Check for existence of gzip -- required for x-compressed-tar*/
 	program_path = g_find_program_in_path("gzip");
 	if(program_path)
 	{
 		lxa_archive_support_add_mime(archive_support, "application/x-compressed-tar");
-		g_free(program_path);
+		LXA_FREE(program_path);
 	}
 	/* Check for existence of bzip2 -- required for x-bzip-compressed-tar */
 	program_path = g_find_program_in_path("bzip2");
 	if(program_path)
 	{
 		lxa_archive_support_add_mime(archive_support, "application/x-bzip-compressed-tar");
-		g_free(program_path);
+		LXA_FREE(program_path);
 	}
 	/* Check for existence of lzop -- required for x-tzo */
 	program_path = g_find_program_in_path("lzop");
 	if(program_path)
 	{
 		lxa_archive_support_add_mime(archive_support, "application/x-tzo");
-		g_free(program_path);
+		LXA_FREE(program_path);
 	}
 
 	archive_support->add = lxa_archive_support_gnu_tar_add;
@@ -273,7 +273,7 @@
 			{
 				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -rf ", archive->path, " ", archive->files, NULL);
 				lxa_execute(command, archive, NULL, NULL, NULL, NULL);
-				g_free(command);
+				LXA_FREE(command);
 				return 0;
 			}
 			archive->tmp_file = g_strconcat(lxa_tmp_dir, "/xarchiver-XXXXXX" , NULL);
@@ -288,7 +288,7 @@
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-tzo"))
 				command = g_strconcat("lzop -dc ", archive->path, NULL);
 			lxa_execute(command, archive, lxa_archive_support_gnu_tar_decompress_watch, NULL, lxa_archive_support_gnu_tar_decompress_parse_output, NULL);
-			g_free(command);
+			LXA_FREE(command);
 		}
 	}
 	return 0;
@@ -360,7 +360,7 @@
 		{
 			lxa_execute(command, archive, NULL, NULL, NULL, NULL);
 			g_debug("Extracting archive '%s' to '%s'\nUsing command '%s'", archive->path, dest_path, command);
-			g_free(command);
+			LXA_FREE(command);
 		}
 	}
 	return 0;
@@ -390,7 +390,7 @@
 			{
 				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -f ", archive->path, " --delete ", archive->files, NULL);
 				lxa_execute(command, archive, NULL, NULL, NULL, NULL);
-				g_free(command);
+				LXA_FREE(command);
 				return 0;
 			}
 			archive->tmp_file = g_strconcat(lxa_tmp_dir, "/xarchiver-XXXXXX" , NULL);
@@ -405,7 +405,7 @@
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-tzo"))
 				command = g_strconcat("lzop -dc ", archive->path, NULL);
 			lxa_execute(command, archive, lxa_archive_support_gnu_tar_decompress_watch, NULL, lxa_archive_support_gnu_tar_decompress_parse_output, NULL);
-			g_free(command);
+			LXA_FREE(command);
 		} else
 			return 1;
 	}
@@ -455,7 +455,7 @@
 		else
 			command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -tvf " , archive->path, NULL);
 		lxa_execute(command, archive, NULL, NULL, lxa_archive_support_gnu_tar_refresh_parse_output, NULL);
-		g_free(command);
+		LXA_FREE(command);
 	}
 	return 0;
 }
@@ -584,7 +584,7 @@
  
 			entry = lxa_archive_add_file(archive, temp_filename);
 			lxa_archive_iter_set_propsv(archive, entry, (gconstpointer*)props);
-			g_free(line);
+			LXA_FREE(line);
 		}
 	}
 	if(cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) )
@@ -604,7 +604,7 @@
 {
 	FILE *out_file = NULL;
 	LXAArchive *archive = data;
-	gchar *buf = g_new0(gchar, 1024);
+	gchar *buf = LXA_NEW0(gchar, 1024);
 	guint read = 0;
 	GError *error = NULL;
 	gchar *command = NULL;
@@ -625,7 +625,7 @@
 		}
 		fclose(out_file);
 	}
-	g_free(buf);
+	LXA_FREE(buf);
 	if(cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) )
 	{
 #ifdef DEBUG
@@ -642,13 +642,13 @@
 					g_unlink(archive->path);
 					command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -rf ", archive->tmp_file, " ", archive->files, NULL);
 					lxa_execute(command, archive, lxa_archive_support_gnu_tar_compress_watch, NULL, NULL, NULL);
-					g_free(command);
+					LXA_FREE(command);
 					break;
 				case(LXA_ARCHIVESTATUS_REMOVE):
 					g_unlink(archive->path);
 					command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -f ", archive->tmp_file, " --delete ", archive->files, NULL);
 					lxa_execute(command, archive, lxa_archive_support_gnu_tar_compress_watch, NULL, NULL, NULL);
-					g_free(command);
+					LXA_FREE(command);
 					break;
 				default:
 					break;
@@ -664,7 +664,7 @@
 {
 	FILE *out_file = NULL;
 	LXAArchive *archive = data;
-	gchar *buf = g_new0(gchar, 1024);
+	gchar *buf = LXA_NEW0(gchar, 1024);
 	guint read = 0;
 	GError *error = NULL;
 
@@ -684,7 +684,7 @@
 		}
 		fclose(out_file);
 	}
-	g_free(buf);
+	LXA_FREE(buf);
 	if(cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) )
 	{
 #ifdef DEBUG

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-rar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-rar.c	2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-rar.c	2006-10-20 12:37:07 UTC (rev 23485)
@@ -101,7 +101,7 @@
 	if(abs_path)
 	{
 		support = g_object_new(LXA_TYPE_ARCHIVE_SUPPORT_RAR, NULL);
-		g_free(abs_path);
+		LXA_FREE(abs_path);
 	}
 	
 	return LXA_ARCHIVE_SUPPORT(support);

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-unrar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-unrar.c	2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-unrar.c	2006-10-20 12:37:07 UTC (rev 23485)
@@ -87,7 +87,7 @@
 	if(abs_path)
 	{
 		support = g_object_new(LXA_TYPE_ARCHIVE_SUPPORT_UNRAR, NULL);
-		g_free(abs_path);
+		LXA_FREE(abs_path);
 	}
 	
 	return LXA_ARCHIVE_SUPPORT(support);

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.c	2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.c	2006-10-20 12:37:07 UTC (rev 23485)
@@ -307,8 +307,8 @@
 		if(LXA_ARCHIVE_SUPPORT_ZIP(archive->support)->_view_time) 
 			archive->n_property++;
 
-		archive->property_types = g_new0(GType, archive->n_property);
-		archive->property_names = g_new0(gchar *, archive->n_property);
+		archive->property_types = LXA_NEW0(GType, archive->n_property);
+		archive->property_names = LXA_NEW0(gchar *, archive->n_property);
 
 		if(LXA_ARCHIVE_SUPPORT_ZIP(archive->support)->_view_length) {
 			archive->property_types[i] = G_TYPE_UINT64;
@@ -355,7 +355,7 @@
 
 		gchar *command = g_strconcat("unzip -lv -qq " , archive->path, NULL);
 		lxa_execute(command, archive, NULL, NULL, lxa_archive_support_zip_refresh_parse_output, NULL);
-		g_free(command);
+		LXA_FREE(command);
 	}
 	return 0;
 }
@@ -389,7 +389,7 @@
  				break; 
 			/* length, method , size, ratio, date, time, crc-32, filename*/
 
-			props = g_malloc0(archive->entry_props_size);
+			props = LXA_MALLOC0(archive->entry_props_size);
 			props_iter = props;
 			for(n=0; n < strlen(line) && line[n] == ' '; n++);
 			a = n;
@@ -399,7 +399,7 @@
 			{
 				_size = g_strndup(&line[a], n-a);
 				(*((guint64 *)props_iter)) = g_ascii_strtoull( _size, NULL, 0);
-				g_free (_size);
+				LXA_FREE (_size);
 				props_iter += sizeof(guint64);
 			}
 
@@ -421,7 +421,7 @@
 			{
 				_size = g_strndup(&line[a], n-a);
 				(*((guint64 *)props_iter)) = g_ascii_strtoull( _size, NULL, 0);
-				g_free (_size);
+				LXA_FREE (_size);
 				props_iter += sizeof(guint64);
 			}
 
@@ -472,8 +472,8 @@
 
 			entry = lxa_archive_add_file(archive, temp_filename);
 			entry->props = props;
-			g_free(line);
-			g_free(temp_filename);
+			LXA_FREE(line);
+			LXA_FREE(temp_filename);
 		}
 	}
 	if(cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) )

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c	2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c	2006-10-20 12:37:07 UTC (rev 23485)
@@ -40,6 +40,18 @@
 #define LXA_MIME_DIRECTORY "inode/directory"
 #endif
 
+#ifdef LXA_THREADSAFE
+#define LXA_ARCHIVE_READ_LOCK(lock)      g_static_rw_lock_reader_lock(lock)
+#define LXA_ARCHIVE_READ_UNLOCK(lock)    g_static_rw_lock_reader_unlock(lock)
+#define LXA_ARCHIVE_WRITE_LOCK(lock)     g_static_rw_lock_writer_lock(lock)
+#define LXA_ARCHIVE_WRITE_UNLOCK(lock)   g_static_rw_lock_writer_unlock(lock)
+#else
+#define LXA_ARCHIVE_READ_LOCK(lock)
+#define LXA_ARCHIVE_READ_UNLOCK(lock)
+#define LXA_ARCHIVE_WRITE_LOCK(lock)
+#define LXA_ARCHIVE_WRITE_UNLOCK(lock)
+#endif
+
 struct _LXAEntry
 {
 	gchar *filename;
@@ -83,6 +95,21 @@
 static gpointer
 lxa_archive_entry_get_props(LXAArchive *, LXAEntry *);
 
+static const gchar *
+lxa_archive_iter_get_prop_str(const LXAArchive *, const LXAArchiveIter *, guint);
+static guint 
+lxa_archive_iter_get_prop_uint(const LXAArchive *, const LXAArchiveIter *, guint);
+static guint64 
+lxa_archive_iter_get_prop_uint64(const LXAArchive *, const LXAArchiveIter *, guint);
+
+static const gchar *
+lxa_archive_iter_get_filename(const LXAArchive *, const LXAArchiveIter *);
+static const gchar *
+lxa_archive_iter_get_mimetype(const LXAArchive *, const LXAArchiveIter *);
+
+static gint
+lxa_entry_filename_compare(LXAEntry *, LXAEntry *);
+
 gint
 lxa_archive_sort_entry_buffer(LXAEntry *entry1, LXAEntry *entry2)
 {
@@ -139,7 +166,10 @@
 static void
 lxa_archive_init(LXAArchive *archive)
 {
-	archive->root_entry = g_new0(LXAEntry, 1);
+	archive->root_entry = LXA_NEW0(LXAEntry, 1);
+#ifdef LXA_THREADSAFE
+	g_static_rw_lock_init(&archive->rw_lock);
+#endif /* LXA_THREADSAFE */
 }
 
 /** static void
@@ -152,7 +182,7 @@
 {
 	LXAArchive *archive = LXA_ARCHIVE(object);
 	if(archive->path)
-		g_free(archive->path);
+		LXA_FREE(archive->path);
 	lxa_archive_entry_free(archive, archive->root_entry);
 	switch(archive->status)
 	{
@@ -196,6 +226,7 @@
 void 
 lxa_archive_set_status(LXAArchive *archive, LXAArchiveStatus status)
 {
+	LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
 	if(LXA_IS_ARCHIVE(archive))
 	{
 		if(archive->status != status)
@@ -205,6 +236,7 @@
 			g_signal_emit(G_OBJECT(archive), lxa_archive_signals[0], 0, archive);
 		} 
 	}
+	LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
 }
 
 gint
@@ -221,6 +253,7 @@
 LXAArchiveIter *
 lxa_archive_add_file(LXAArchive *archive, const gchar *path)
 {
+	LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
 	guint i = 0;
 	gchar **path_items = g_strsplit_set(path, "/\n", -1);
 	LXAArchiveIter *parent = (LXAArchiveIter*)archive->root_entry;
@@ -239,12 +272,12 @@
 				child = lxa_archive_iter_add_child(archive, parent, basename);
 		}
 
-		g_free(basename);
+		LXA_FREE(basename);
 
 		parent = child;
 		i++;
 	}
-
+	LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
 	return child;
 }
 
@@ -257,15 +290,15 @@
 
 	if(archive->n_property < size)
 	{
-		new_props = g_new0(GType, size);
-		new_names = g_new0(gchar*, size);
+		new_props = LXA_NEW0(GType, size);
+		new_names = LXA_NEW0(gchar*, size);
 		for(i = 0; i < archive->n_property; ++i)
 		{
 			new_props[i] = archive->property_types[i];
 			new_names[i] = archive->property_names[i];
 		}
-		g_free(archive->property_types);
-		g_free(archive->property_names);
+		LXA_FREE(archive->property_types);
+		LXA_FREE(archive->property_names);
 		archive->property_types = new_props;
 		archive->property_names = new_names;
 		archive->n_property = size;
@@ -282,15 +315,15 @@
 
 	if(archive->n_property < size)
 	{
-		new_types = g_new0(GType, size);
-		new_names = g_new0(gchar*, size);
+		new_types = LXA_NEW0(GType, size);
+		new_names = LXA_NEW0(gchar*, size);
 		for(i = 0; i < archive->n_property; ++i)
 		{
 			new_types[i] = archive->property_types[i];
 			new_names[i] = archive->property_names[i];
 		}
-		g_free(archive->property_types);
-		g_free(archive->property_names);
+		LXA_FREE(archive->property_types);
+		LXA_FREE(archive->property_names);
 		archive->property_types = new_types;
 		archive->property_names = new_names;
 		archive->n_property = size;
@@ -306,19 +339,27 @@
 GType
 lxa_archive_get_property_type(LXAArchive *archive, guint i)
 {
+	LXA_ARCHIVE_READ_LOCK(&archive->rw_lock);
+
 #ifdef DEBUG /* n_property + 2, filename and MIME */
 	g_return_val_if_fail(i < (archive->n_property+LXA_ARCHIVE_PROP_USER), G_TYPE_INVALID);
 #endif
+
+	GType retval = G_TYPE_INVALID;
 	switch(i)
 	{
 		case LXA_ARCHIVE_PROP_FILENAME:
-			return G_TYPE_STRING;
+			retval = G_TYPE_STRING;
+			break;
 		case LXA_ARCHIVE_PROP_MIME_TYPE:
-			return G_TYPE_STRING;
+			retval = G_TYPE_STRING;
+			break;
 		default:
-			return archive->property_types[i - LXA_ARCHIVE_PROP_USER];
+			retval = archive->property_types[i - LXA_ARCHIVE_PROP_USER];
+			break;
 	}
-	g_return_val_if_reached(G_TYPE_NONE);
+	LXA_ARCHIVE_READ_UNLOCK(&archive->rw_lock);
+	return retval;
 }
 
 /*
@@ -329,19 +370,29 @@
 const gchar *
 lxa_archive_get_property_name(LXAArchive *archive, guint i)
 {
+	LXA_ARCHIVE_READ_LOCK(&archive->rw_lock);
+
 #ifdef DEBUG /* n_property + 2, filename and MIME */
 	g_return_val_if_fail(i < (archive->n_property+LXA_ARCHIVE_PROP_USER), NULL);
 #endif
+	
+	const gchar *retval = NULL;
+
 	switch(i)
 	{
 		case LXA_ARCHIVE_PROP_FILENAME:
-			return _("Filename");
+			retval = _("Filename");
+			break;
 		case LXA_ARCHIVE_PROP_MIME_TYPE:
-			return _("Mime type");
+			retval = _("Mime type");
+			break;
 		default:
-			return archive->property_names[i - LXA_ARCHIVE_PROP_USER];
+			retval = archive->property_names[i - LXA_ARCHIVE_PROP_USER];
+			break;
 	}
-	g_return_val_if_reached(NULL);
+
+	LXA_ARCHIVE_READ_UNLOCK(&archive->rw_lock);
+	return retval;
 }
 
 /*
@@ -352,15 +403,20 @@
 void
 lxa_archive_set_property_type(LXAArchive *archive, guint i, GType type, const gchar *name)
 {
+	LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
+
 #ifdef DEBUG
 	g_return_if_fail(i >= LXA_ARCHIVE_PROP_USER);
 #endif
+
 	GType *types_iter = lxa_archive_get_property_types(archive, i+1-LXA_ARCHIVE_PROP_USER);
 	gchar **names_iter = lxa_archive_get_property_names(archive, i+1-LXA_ARCHIVE_PROP_USER);
 
 	types_iter[i-LXA_ARCHIVE_PROP_USER] = type;
-	g_free(names_iter[i-LXA_ARCHIVE_PROP_USER]);
+	LXA_FREE(names_iter[i-LXA_ARCHIVE_PROP_USER]);
 	names_iter[i-LXA_ARCHIVE_PROP_USER] = g_strdup(name);
+
+	LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
 }
 
 /*
@@ -371,6 +427,7 @@
 void
 lxa_archive_set_property_typesv(LXAArchive *archive, GType *types, const gchar **names)
 {
+	LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
 	guint size = 0;
 	GType *type_iter = types;
 	const gchar **name_iter = names;
@@ -387,13 +444,14 @@
 	while(type_iter && name_iter)
 	{
 		*types_iter = *type_iter;
-		g_free(*names_iter);
+		LXA_FREE(*names_iter);
 		*names_iter = g_strdup(*name_iter);
 		types_iter++;
 		type_iter++;
 		names_iter++;
 		name_iter++;
 	}
+	LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
 }
 
 guint
@@ -405,6 +463,8 @@
 LXAArchiveIter *
 lxa_archive_get_iter(LXAArchive *archive, const gchar *path)
 {
+	LXA_ARCHIVE_READ_LOCK(&archive->rw_lock);
+
 	if(!path)
 		return (LXAArchiveIter *)archive->root_entry;
 
@@ -433,6 +493,7 @@
 
 	g_strfreev(buf);
 
+	LXA_ARCHIVE_READ_UNLOCK(&archive->rw_lock);
 	return entry;
 }
 
@@ -444,7 +505,7 @@
 static LXAEntry *
 lxa_entry_new(LXAArchive *archive, const gchar *filename)
 {
-	LXAEntry *entry = g_new0(LXAEntry, 1);
+	LXAEntry *entry = LXA_NEW0(LXAEntry, 1);
 
 	const gchar *pos = strchr(filename, '/');
 
@@ -462,7 +523,7 @@
 	return entry;
 }
 
-void
+static void
 lxa_archive_entry_free(LXAArchive *archive, LXAEntry *entry)
 {
 	gint i = 0; 
@@ -482,7 +543,7 @@
 		for(i = 1; i <= GPOINTER_TO_INT(*entry->children); ++i)
 			lxa_archive_entry_free(archive, entry->children[i]);
 
-		g_free(entry->children);
+		LXA_FREE(entry->children);
 		entry->children = NULL;
 	}
 
@@ -493,7 +554,7 @@
 			switch(archive->property_types[i])
 			{
 				case(G_TYPE_STRING):
-					g_free(*(gchar **)props_iter);
+					LXA_FREE(*(gchar **)props_iter);
 					props_iter += sizeof(gchar *);
 					break;
 				case(G_TYPE_UINT):
@@ -504,14 +565,20 @@
 					break;
 			}
 		}
-		g_free(entry->props);
+		LXA_FREE(entry->props);
 	}
 	if(entry->mime_info)
 		lxa_mime_info_unref(entry->mime_info);
-	g_free(entry->filename);
-	g_free(entry);
+	LXA_FREE(entry->filename);
+	LXA_FREE(entry);
 }
 
+static gint
+lxa_entry_filename_compare(LXAEntry *a, LXAEntry *b)
+{
+	return strcmp(a->filename, b->filename);
+}
+
 static LXAEntry *
 lxa_entry_get_child(const LXAEntry *entry, const gchar *filename)
 {
@@ -538,7 +605,7 @@
 		cmp = strcmp(_filename, entry->children[begin+pos]->filename);
 		if(!cmp)
 		{
-			g_free(_filename);
+			LXA_FREE(_filename);
 			return entry->children[begin+pos];
 		}
 
@@ -560,21 +627,21 @@
 
 		if(!cmp)
 		{
-			g_free(_filename);
+			LXA_FREE(_filename);
 			return buffer_iter->entry;
 		}
 		if(cmp < 0)
 			break;
 	}
 
-	g_free(_filename);
+	LXA_FREE(_filename);
 	return NULL;
 }
 
 static void
 lxa_archive_entry_add_child(LXAArchive *archive, LXAEntry *parent, LXAEntry *child)
 {
-	parent->buffer = lxa_slist_insert_sorted_single(parent->buffer, child);
+	parent->buffer = lxa_slist_insert_sorted_single(parent->buffer, child, (GCompareFunc)lxa_entry_filename_compare);
 
 	if(lxa_slist_length(parent->buffer) == LXA_ENTRY_CHILD_BUFFER_SIZE)
 		lxa_archive_entry_flush_buffer(archive, parent);
@@ -600,7 +667,7 @@
 
 	max_children = (n_children + lxa_slist_length(entry->buffer));
 	
-	entry->children = g_new(LXAEntry *, max_children+1);
+	entry->children = LXA_NEW(LXAEntry *, max_children+1);
 	for(buffer_iter = entry->buffer;buffer_iter;buffer_iter = buffer_iter->next)
 	{
 		size = n_children + 1 - begin;
@@ -647,7 +714,7 @@
 	lxa_slist_free(entry->buffer);
 	entry->buffer = NULL;
 
-	g_free(children_old);
+	LXA_FREE(children_old);
 }
 
 static gpointer
@@ -674,7 +741,7 @@
 			}
 		}
 
-		entry->props = g_malloc0(size);
+		entry->props = LXA_MALLOC0(size);
 	}
 
 	return entry->props;
@@ -781,7 +848,7 @@
  *
  * returns filename
  */
-const gchar*
+static const gchar*
 lxa_archive_iter_get_filename(const LXAArchive *archive, const LXAArchiveIter *iter)
 {
 	return ((LXAEntry *)iter)->filename;
@@ -793,7 +860,7 @@
  *
  * returns mime type
  */
-const gchar *
+static const gchar *
 lxa_archive_iter_get_mimetype(const LXAArchive *archive, const LXAArchiveIter *iter)
 {
 	return lxa_mime_info_get_name(((LXAEntry *)iter)->mime_info);
@@ -819,6 +886,8 @@
 void
 lxa_archive_iter_set_prop_str(LXAArchive *archive, LXAArchiveIter *iter, guint i, const gchar *str_val)
 {
+	LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
+
 	gpointer props_iter = NULL;
 	guint n;
 #ifdef DEBUG
@@ -856,10 +925,12 @@
 						break;
 				}
 			}
-			g_free(*((gchar **)props_iter));
+			LXA_FREE(*((gchar **)props_iter));
 			(*((gchar **)props_iter)) = g_strdup(str_val);
 			break;
 	}
+
+	LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
 }
 
 /**
@@ -870,11 +941,13 @@
 void
 lxa_archive_iter_set_prop_uint(LXAArchive *archive, LXAArchiveIter *iter, guint i, guint int_val)
 {
+	LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
+
 #ifdef DEBUG
 	g_return_if_fail(i < (archive->n_property+LXA_ARCHIVE_PROP_USER));
 	g_return_if_fail(i >= LXA_ARCHIVE_PROP_USER);
 	g_return_if_fail(archive->property_types[i-LXA_ARCHIVE_PROP_USER] == G_TYPE_UINT);
-#endif
+#endif /* DEBUG */
 	gpointer props_iter = lxa_archive_entry_get_props(archive, (LXAEntry *)iter);
 	guint n;
 
@@ -894,6 +967,8 @@
 		}
 	}
 	(*((guint *)props_iter)) = int_val;
+
+	LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
 }
 
 /**
@@ -904,11 +979,13 @@
 void
 lxa_archive_iter_set_prop_uint64(LXAArchive *archive, LXAArchiveIter *iter, guint i, guint64 int64_val)
 {
+	LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
+
 #ifdef DEBUG
 	g_return_if_fail(i < (archive->n_property+LXA_ARCHIVE_PROP_USER));
 	g_return_if_fail(i >= LXA_ARCHIVE_PROP_USER);
 	g_return_if_fail(archive->property_types[i-LXA_ARCHIVE_PROP_USER] == G_TYPE_UINT64);
-#endif
+#endif /* DEBUG */
 	gpointer props_iter = lxa_archive_entry_get_props(archive, (LXAEntry *)iter);
 	guint n;
 
@@ -928,6 +1005,8 @@
 		}
 	}
 	(*((guint64 *)props_iter)) = int64_val;
+
+	LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
 }
 
 /**
@@ -960,6 +1039,8 @@
 void
 lxa_archive_iter_set_props(LXAArchive *archive, LXAArchiveIter *iter, ...)
 {
+	LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
+
 	gpointer props_iter = lxa_archive_entry_get_props(archive, (LXAEntry *)iter);
 	guint i;
 	va_list ap;
@@ -986,6 +1067,8 @@
 	}
 
 	va_end(ap);
+
+	LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
 }
 
 /**
@@ -996,6 +1079,7 @@
 void
 lxa_archive_iter_set_propsv(LXAArchive *archive, LXAArchiveIter *iter, gconstpointer *props)
 {
+	LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
 	gpointer props_iter = lxa_archive_entry_get_props(archive, (LXAEntry *)iter);
 	guint i;
 
@@ -1017,6 +1101,8 @@
 				break;
 		}
 	}
+
+	LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
 }
 
 /**
@@ -1027,6 +1113,8 @@
 gboolean
 lxa_archive_iter_get_prop_value(const LXAArchive *archive, const LXAArchiveIter *iter, guint i, GValue *value)
 {
+	LXA_ARCHIVE_READ_LOCK(&archive->rw_lock);
+
 	if(i>=LXA_ARCHIVE_PROP_USER)
 		g_value_init(value, archive->property_types[i-LXA_ARCHIVE_PROP_USER]);
 	else
@@ -1044,15 +1132,17 @@
 			g_value_set_uint64(value, lxa_archive_iter_get_prop_uint64(archive, iter, i));
 			break;
 	}
+
+	LXA_ARCHIVE_READ_UNLOCK(&archive->rw_lock);
 	return TRUE;
 }
 
 /**
- * const gchar *
+ * static const gchar *
  * lxa_archive_iter_get_prop_str(const LXAArchive *, const LXAArchiveIter *, guint) 
  *
  */
-const gchar*
+static const gchar*
 lxa_archive_iter_get_prop_str(const LXAArchive *archive, const LXAArchiveIter *iter, guint i)
 {
 	const gchar *retval = NULL;
@@ -1099,11 +1189,11 @@
 }
 
 /**
- * guint
+ * static guint
  * lxa_archive_iter_get_prop_uint(const LXAArchive *, const LXAArchiveIter *, guint) 
  *
  */
-guint
+static guint
 lxa_archive_iter_get_prop_uint(const LXAArchive *archive, const LXAArchiveIter *iter, guint i)
 {
 	gpointer props_iter = ((LXAEntry *)iter)->props;
@@ -1134,11 +1224,11 @@
 }
 
 /**
- * guint64
+ * static guint64
  * lxa_archive_iter_get_prop_uint64(const LXAArchive *, const LXAArchiveIter *, guint) 
  *
  */
-guint64
+static guint64
 lxa_archive_iter_get_prop_uint64(const LXAArchive *archive, const LXAArchiveIter *iter, guint i)
 {
 	gpointer props_iter = ((LXAEntry *)iter)->props;

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h	2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h	2006-10-20 12:37:07 UTC (rev 23485)
@@ -73,6 +73,9 @@
 	GType              *property_types;
 	gchar             **property_names;
 	LXAEntry           *root_entry;
+#ifdef G_THREADS_ENABLED
+	GStaticRWLock       rw_lock;
+#endif
 	LXAArchiveStatus    status;
 	LXAArchiveStatus    old_status;
 	GPid                child_pid;
@@ -83,7 +86,6 @@
 	gchar              *tmp_file;
 	gchar              *files;
 	gboolean            has_passwd;
-	gushort             entry_props_size;
 };
 
 typedef struct _LXAArchiveClass LXAArchiveClass;
@@ -115,11 +117,6 @@
 void                lxa_archive_iter_set_props(LXAArchive *, LXAArchiveIter *, ...);
 void                lxa_archive_iter_set_propsv(LXAArchive *, LXAArchiveIter *, gconstpointer *);
 
-const gchar        *lxa_archive_iter_get_filename(const LXAArchive *, const LXAArchiveIter *);
-const gchar        *lxa_archive_iter_get_mimetype(const LXAArchive *, const LXAArchiveIter *);
-const gchar        *lxa_archive_iter_get_prop_str(const LXAArchive *, const LXAArchiveIter *, guint);
-guint               lxa_archive_iter_get_prop_uint(const LXAArchive *, const LXAArchiveIter *, guint);
-guint64             lxa_archive_iter_get_prop_uint64(const LXAArchive *, const LXAArchiveIter *, guint);
 gboolean            lxa_archive_iter_get_prop_value(const LXAArchive *, const LXAArchiveIter *, guint, GValue *);
 
 LXAArchiveIter     *lxa_archive_add_file(LXAArchive *, const gchar *);

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c	2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c	2006-10-20 12:37:07 UTC (rev 23485)
@@ -17,6 +17,7 @@
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
  */
 
+#include <config.h>
 #include <glib.h>
 #include <glib-object.h>
 
@@ -26,6 +27,44 @@
 
 #include "internals.h"
 
+#ifdef LXA_TRACE_ALLOCATION
+
+#define __USE_GNU
+
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+
+static gchar lxa_allocation_file[128];
+
+void lxa_trace_init()
+{
+	snprintf(lxa_allocation_file, 127, "lxa_trace.%d", getpid());
+	fclose( fopen(lxa_allocation_file, "w") );
+}
+
+gpointer lxa_trace_add(const gchar *methode, guint size, gpointer pointer, const gchar *function, const gchar *file, guint line)
+{
+	FILE *fp = fopen(lxa_allocation_file, "a");
+
+	fprintf(fp, "%s:%d %s{ %s(%d) = %p }\n", file, line, function, methode, size, pointer);
+
+	fclose(fp);
+
+	return pointer;
+}
+
+void lxa_trace_del(const gchar *methode, gpointer pointer, const gchar *function, const gchar *file, guint line)
+{
+	FILE *fp = fopen(lxa_allocation_file, "a");
+
+	fprintf(fp, "%s:%d %s{ %s(%p) }\n", file, line, function, methode, pointer);
+
+	fclose(fp);
+}
+
+#endif /* LXA_TRACE_ALLOCATION */
+
 void
 lxa_default_child_watch_func(GPid pid, gint status, gpointer data)
 {
@@ -124,7 +163,7 @@
 		_concat_str = concat_str;
 		concat_str = g_strconcat(concat_str, " \"", _filenames->data,"\"",  NULL);
 		_filenames = _filenames->next;
-		g_free(_concat_str);
+		LXA_FREE(_concat_str);
 	}
 	if(!filenames)
 		return NULL;

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.h	2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.h	2006-10-20 12:37:07 UTC (rev 23485)
@@ -16,7 +16,68 @@
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
+#ifdef DEBUG
+#define LXA_TRACE_ALLOCATION 1
+#endif /* DEBUG */
 
+#ifdef LXA_TRACE_ALLOCATION
+
+void lxa_trace_init();
+gpointer lxa_trace_add(const gchar *methode, guint size, gpointer pointer, const gchar *function, const gchar *file, guint line);
+void lxa_trace_del(const gchar *methode, gpointer pointer, const gchar *function, const gchar *file, guint line);
+
+#define LXA_TRACE_INIT lxa_trace_init()
+
+#define LXA_NEW(type, count) lxa_trace_add("g_new", sizeof(type)*(count), g_new(type, count), __FUNCTION__, __FILE__, __LINE__)
+#define LXA_NEW0(type, count) lxa_trace_add("g_new0", sizeof(type)*(count), g_new0(type, count), __FUNCTION__, __FILE__, __LINE__)
+#define LXA_MALLOC(size) lxa_trace_add("g_malloc", size, g_malloc(size), __FUNCTION__, __FILE__, __LINE__)
+#define LXA_MALLOC0(size) lxa_trace_add("g_malloc0", size, g_malloc0(size), __FUNCTION__, __FILE__, __LINE__)
+#define LXA_FREE(pointer) { lxa_trace_del("g_free", pointer, __FUNCTION__, __FILE__, __LINE__); g_free(pointer); }
+
+#ifdef USE_G_SLICE
+#define LXA_SLICE_NEW(type) g_slice_new(type)
+#define LXA_SLICE_NEW0(type) g_slice_new0(type)
+#define LXA_SLICE_ALLOC(size) g_slice_alloc(size)
+#define LXA_SLICE_ALLOC0(size) g_slice_alloc0(size)
+#define LXA_SLICE_FREE(type, pointer) g_slice_free(type, pointer)
+#define LXA_SLICE_FREE1(size, pointer) g_silce_free1(size, pointer)
+#else
+#define LXA_SLICE_NEW(type) LXA_NEW(type, 1)
+#define LXA_SLICE_NEW0(type) LXA_NEW0(type, 1)
+#define LXA_SLICE_ALLOC(size) LXA_MALLOC(size)
+#define LXA_SLICE_ALLOC0(size) LXA_MALLOC0(size)
+#define LXA_SLICE_FREE(type, pointer) LXA_FREE(pointer)
+#define LXA_SLICE_FREE1(size, pointer) LXA_FREE(pointer)
+#endif /* USE_G_SLICE */
+
+#else /* LXA_TRACE_ALLOCATION */
+
+#define LXA_TRACE_INIT
+
+#define LXA_NEW(type, count) g_new(type, count)
+#define LXA_NEW0(type, count) g_new0(type, count)
+#define LXA_MALLOC(size) g_malloc(size)
+#define LXA_MALLOC0(size) g_malloc0(size)
+#define LXA_FREE(pointer) g_free(pointer)
+
+#ifdef USE_G_SLICE
+#define LXA_SLICE_NEW(type) g_slice_new(type)
+#define LXA_SLICE_NEW0(type) g_slice_new0(type)
+#define LXA_SLICE_ALLOC(size) g_slice_alloc(size)
+#define LXA_SLICE_ALLOC0(size) g_slice_alloc0(size)
+#define LXA_SLICE_FREE(type, pointer) g_slice_free(type, pointer)
+#define LXA_SLICE_FREE1(size, pointer) g_silce_free1(size, pointer)
+#else
+#define LXA_SLICE_NEW(type) LXA_NEW(type, 1)
+#define LXA_SLICE_NEW0(type) LXA_NEW0(type, 1)
+#define LXA_SLICE_ALLOC(size) LXA_MALLOC(size)
+#define LXA_SLICE_ALLOC0(size) LXA_MALLOC0(size)
+#define LXA_SLICE_FREE(type, pointer) LXA_FREE(pointer)
+#define LXA_SLICE_FREE1(size, pointer) LXA_FREE(pointer)
+#endif /* USE_G_SLICE */
+
+#endif /* LXA_TRACE_ALLOCATION */
+
 const gchar            *lxa_tmp_dir;
 GSList                 *lxa_archive_support_list;
 

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/libxarchiver.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/libxarchiver.c	2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/libxarchiver.c	2006-10-20 12:37:07 UTC (rev 23485)
@@ -34,6 +34,8 @@
 void
 lxa_init()
 {
+	LXA_TRACE_INIT;
+
 	lxa_tmp_dir = g_get_tmp_dir();
 
 	lxa_mime_init();

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/mime.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/mime.c	2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/mime.c	2006-10-20 12:37:07 UTC (rev 23485)
@@ -27,6 +27,8 @@
 #endif
 
 #include "mime.h"
+#include "archive.h"
+#include "internals.h"
 
 #ifdef HAVE_THUNAR_VFS
 ThunarVfsMimeDatabase  *lxa_mime_database;
@@ -66,7 +68,7 @@
 #else
 
 #endif /* HAVE_THUNAR_VFS */
-	g_free(base);
+	LXA_FREE(base);
 	return result;
 }
 
@@ -118,7 +120,7 @@
 	else
 		g_value_set_string(value, NULL);
 #endif
-	/* g_free((gchar *)mime_type); */
+	/* LXA_FREE((gchar *)mime_type); */
 }
 
 void

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c	2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c	2006-10-20 12:37:07 UTC (rev 23485)
@@ -5,10 +5,11 @@
 
 #include "mime.h"
 #include "archive.h"
+#include "internals.h"
 #include "slist.h"
 
 LXASList *
-lxa_slist_insert_sorted_single(LXASList *list, LXAEntry *entry)
+lxa_slist_insert_sorted_single(LXASList *list, LXAEntry *entry, GCompareFunc cmp_func)
 {
 	gint cmp = 1;
 	LXASList *iter = list;
@@ -18,7 +19,7 @@
 	for(; iter; iter = iter->next)
 	{
 		/* archive can be NULL */
-		cmp = strcmp(lxa_archive_iter_get_filename(NULL, entry), lxa_archive_iter_get_filename( NULL, (LXAEntry*)iter->entry));
+		cmp = cmp_func(entry, (LXAEntry*)iter->entry);
 
 		if(!cmp)
 		{
@@ -31,7 +32,7 @@
 		prev_entry = iter;
 	}
 
-	new_entry = g_new(LXASList, 1);
+	new_entry = LXA_SLICE_NEW(LXASList);
 	new_entry->next = iter;
 	new_entry->entry = entry;
 
@@ -58,7 +59,7 @@
 	for(; list; list = next)
 	{
 		next = list->next;
-		g_free(list);
+		LXA_SLICE_FREE(LXASList, list);
 	}
 }
 

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.h	2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.h	2006-10-20 12:37:07 UTC (rev 23485)
@@ -9,7 +9,7 @@
 };
 
 LXASList *
-lxa_slist_insert_sorted_single(LXASList *list, LXAEntry *entry);
+lxa_slist_insert_sorted_single(LXASList *list, LXAEntry *entry, GCompareFunc);
 
 guint
 lxa_slist_length(LXASList *list);

Modified: xarchiver/branches/xarchiver-psybsd/src/archive_store.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/archive_store.c	2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/src/archive_store.c	2006-10-20 12:37:07 UTC (rev 23485)
@@ -19,6 +19,7 @@
 #include <config.h>
 #include <string.h>
 #include <glib.h>
+#include <glib-object.h>
 #include <gtk/gtk.h>
 #include <libxarchiver/libxarchiver.h>
 #include <libxarchiver/mime.h>
@@ -692,6 +693,7 @@
 static gint
 xa_archive_entry_compare(XAArchiveStore *store, LXAArchiveIter *a, LXAArchiveIter *b)
 {
+	/*
 	gboolean cmp_a = 0;
 	gboolean cmp_b = 0;
 	if(store->props._sort_folders_first)
@@ -722,9 +724,9 @@
 		case G_TYPE_STRING:
 			switch(store->props._sort_case_sensitive)
 			{
-				case 0: /* case insensitive */
+				case 0: *//* case insensitive *//*
 					return g_ascii_strcasecmp(lxa_archive_iter_get_prop_str(archive, a, column), lxa_archive_iter_get_prop_str(archive, b, column));
-				case 1: /* case sensitive */
+				case 1: *//* case sensitive *//*
 					return strcmp(lxa_archive_iter_get_prop_str(archive, a, column), lxa_archive_iter_get_prop_str(archive, b, column));
 			}
 		case G_TYPE_UINT64:
@@ -732,7 +734,7 @@
 		case G_TYPE_UINT:
 			return lxa_archive_iter_get_prop_uint(archive, a, column) - lxa_archive_iter_get_prop_uint(archive, b, column);
 	}
-
+	*/
 	g_return_val_if_reached(0);
 }
 
@@ -1090,8 +1092,9 @@
 {
 	g_return_val_if_fail(store, NULL);
 
+	GValue *basename = g_new0(GValue, 1);
 	gchar *path = NULL;
-	const gchar **buf = NULL;
+	gchar **buf = NULL;
 	GSList *iter = store->current_entry;
 	gint i = g_slist_length(iter);
 	gchar *lastfile = NULL;
@@ -1101,13 +1104,15 @@
 	if(i<=1)
 		return g_strdup("");
 
-	buf = g_new(const gchar*, i);
+	buf = g_new(gchar*, i);
 	i--;
 	buf[i] = NULL;
 
-	namelen = strlen(lxa_archive_iter_get_filename(store->archive, (LXAArchiveIter*)iter->data));
+	lxa_archive_iter_get_prop_value(store->archive, (LXAArchiveIter*)iter->data, LXA_ARCHIVE_PROP_FILENAME, basename);
+	namelen = strlen(g_value_get_string(basename));
 	lastfile = g_new(gchar, namelen+2);
-	strcpy(lastfile, lxa_archive_iter_get_filename(store->archive, (LXAArchiveIter*)iter->data));
+	strcpy(lastfile, g_value_get_string(basename));
+	g_value_unset(basename);
 	if(lastfile[namelen-1] != '/')
 	{
 		lastfile[namelen] = '/';
@@ -1123,22 +1128,23 @@
 		while(iter->next)
 		{
 			--i;
-			buf[i] = lxa_archive_iter_get_filename(store->archive, (LXAArchiveIter*)iter->data);
+			lxa_archive_iter_get_prop_value(store->archive, (LXAArchiveIter*)iter->data, LXA_ARCHIVE_PROP_FILENAME, basename);
+			buf[i] = g_value_dup_string(basename);
+			g_value_unset(basename);
 			iter = iter->next;
 		}
 	}
 
 	if(buf[0] != lastfile && buf[0][0] == '/')
 	{
-		buf[0] = "";
+		buf[0] = g_strdup("");
 	}
 
 	/* why does glib want buf to be gchar** instead of const gchar** ? */
 	path = g_strjoinv("/", (gchar**)buf);
 
-	g_free(lastfile);
-	g_free(buf);
-
+	g_strfreev(buf);
+	g_free(basename);
 	return path;
 }
 
@@ -1147,6 +1153,7 @@
 {
 	g_return_val_if_fail(store, NULL);
 
+	GValue basename;
 	GSList *iter = store->current_entry;
 	GSList *path = NULL;
 
@@ -1156,7 +1163,9 @@
 	/* we don't want to include de archive rootentry */
 	while(iter->next)
 	{
-		path = g_slist_prepend(path, g_strdup(lxa_archive_iter_get_filename(store->archive, (LXAArchiveIter*)iter->data)));
+		lxa_archive_iter_get_prop_value(store->archive, (LXAArchiveIter*)iter->data, LXA_ARCHIVE_PROP_FILENAME, &basename);
+		path = g_slist_prepend(path, g_value_dup_string(&basename));
+		g_value_unset(&basename);
 		iter = iter->next;
 	}
 

Modified: xarchiver/branches/xarchiver-psybsd/src/main.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/main.c	2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/src/main.c	2006-10-20 12:37:07 UTC (rev 23485)
@@ -121,6 +121,10 @@
  	textdomain (GETTEXT_PACKAGE);
 	#endif
 
+#ifdef G_THREADS_ENABLED
+	g_thread_init(NULL);
+#endif /* G_THREADS_ENABLED */
+
 	if(!gtk_init_with_args(&argc, &argv, _("[archive name]"), entries, PACKAGE, &cli_error))
 	{
 		if ( cli_error != NULL )



More information about the Xfce4-commits mailing list