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

Stephan Arts stephan at xfce.org
Wed Oct 18 22:19:25 UTC 2006


Author: stephan
Date: 2006-10-18 22:19:23 +0000 (Wed, 18 Oct 2006)
New Revision: 23465

Removed:
   xarchiver/branches/xarchiver-psybsd/tests/
Modified:
   xarchiver/branches/xarchiver-psybsd/Makefile.am
   xarchiver/branches/xarchiver-psybsd/configure.in.in
   xarchiver/branches/xarchiver-psybsd/libxarchiver/Makefile.am
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h
   xarchiver/branches/xarchiver-psybsd/libxarchiver/libxarchiver.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c
   xarchiver/branches/xarchiver-psybsd/src/archive_store.c
   xarchiver/branches/xarchiver-psybsd/src/main_window.c
Log:
Applied patch from Peter de Ridder <pc.ridder at zonnet.nl>

Working on library interface cleanup. (do not expect this to work)



Modified: xarchiver/branches/xarchiver-psybsd/Makefile.am
===================================================================
--- xarchiver/branches/xarchiver-psybsd/Makefile.am	2006-10-18 20:10:53 UTC (rev 23464)
+++ xarchiver/branches/xarchiver-psybsd/Makefile.am	2006-10-18 22:19:23 UTC (rev 23465)
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in
 
-SUBDIRS = libxarchiver src tests po
+SUBDIRS = libxarchiver src po
 
 pixmapsdir       = $(datadir)/pixmaps/xarchiver
 pixmaps_DATA     = pixmaps/xarchiver.png \

Modified: xarchiver/branches/xarchiver-psybsd/configure.in.in
===================================================================
--- xarchiver/branches/xarchiver-psybsd/configure.in.in	2006-10-18 20:10:53 UTC (rev 23464)
+++ xarchiver/branches/xarchiver-psybsd/configure.in.in	2006-10-18 22:19:23 UTC (rev 23465)
@@ -54,10 +54,11 @@
 XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.2.0])
 XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.2.0])
 XDT_CHECK_PACKAGE([GOBJECT], [gobject-2.0], [2.2.0])
+XDT_CHECK_PACKAGE([THUNAR_VFS], [thunar-vfs-1], [0.4.0])
 
-XDT_CHECK_OPTIONAL_PACKAGE([THUNAR_VFS], [thunar-vfs-1], [0.4.0], [thunar-vfs],
-    AC_HELP_STRING([--disable-thunar-vfs],
-                   [Disable the use of Thunar's VFS layer)]))
+dnl XDT_CHECK_OPTIONAL_PACKAGE([THUNAR_VFS], [thunar-vfs-1], [0.4.0], [thunar-vfs],
+dnl    AC_HELP_STRING([--disable-thunar-vfs],
+dnl                   [Disable the use of Thunar's VFS layer)]))
 
 XDT_CHECK_OPTIONAL_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.3.99], [libxfce4util],
     AC_HELP_STRING([--disable-libxfce4util],
@@ -90,7 +91,6 @@
 Makefile
 po/Makefile.in
 src/Makefile
-tests/Makefile
 libxarchiver/Makefile
 ])
 

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/Makefile.am
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/Makefile.am	2006-10-18 20:10:53 UTC (rev 23464)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/Makefile.am	2006-10-18 22:19:23 UTC (rev 23465)
@@ -7,9 +7,7 @@
 	slist.c slist.h \
 	archive.c archive.h \
 	archive-support.c archive-support.h \
-  archive-support-zip.c archive-support-zip.h \
-	archive-support-gnu-tar.c archive-support-gnu-tar.h \
-  archive-support-rar.c archive-support-rar.h
+	archive-support-gnu-tar.c archive-support-gnu-tar.h
 
 libxarchiver_a_CFLAGS = \
 	$(GLIB_CFLAGS)  \

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c	2006-10-18 20:10:53 UTC (rev 23464)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c	2006-10-18 22:19:23 UTC (rev 23465)
@@ -197,6 +197,7 @@
 {
 	LXAArchiveSupportGnuTar *support;
 
+	/*
 	support = g_object_new(LXA_TYPE_ARCHIVE_SUPPORT_GNU_TAR, 
 	                       "view-time", TRUE, 
 												 "view-date", TRUE,
@@ -204,6 +205,14 @@
 												 "view-rights", TRUE,
 												 "view-size", TRUE,
 												 NULL);
+	*/
+	support = g_object_new(LXA_TYPE_ARCHIVE_SUPPORT_GNU_TAR, 
+	                       "view-time", FALSE, 
+												 "view-date", FALSE,
+												 "view-owner", FALSE,
+												 "view-rights", FALSE,
+												 "view-size", FALSE,
+												 NULL);
 
 	return LXA_ARCHIVE_SUPPORT(support);
 }
@@ -492,8 +501,6 @@
 	gchar *line	= NULL;
 	LXAEntry *entry;
 
-	gpointer props = NULL; 
-	gpointer props_iter = NULL;
 	gint n = 0, a = 0, i = 0, o = 0;
 	gchar *temp_filename = NULL;
 	gchar *_size = NULL;
@@ -512,13 +519,12 @@
 			if (line == NULL)
  				break;
 
-			props = g_malloc0(archive->entry_props_size);
-			props_iter = props;
-
 			if(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->_view_rights)
 			{
+				/*
 				(*(gchar **)props_iter) = g_strndup (line, 10);
 				props_iter += sizeof(gchar *);
+				*/
 			}
 
 
@@ -527,8 +533,10 @@
 
 			if(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->_view_owner)
 			{
+				/*
 				(*(gchar **)props_iter) = g_strndup (&line[11], n-11);
 				props_iter += sizeof(gchar *);
+				*/
 			}
 
 			for(; n < strlen(line); n++)
@@ -541,10 +549,12 @@
 
 			if(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->_view_size)
 			{
+				/*
 				_size = g_strndup(&line[a], n-a);
 				(*((guint64 *)props_iter)) = g_ascii_strtoull( _size, NULL, 0);
 				g_free (_size);
 				props_iter += sizeof(guint64);
+				*/
 			}
 
 			a = ++n;
@@ -554,8 +564,10 @@
 
 			if(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->_view_date)
 			{
+				/*
 				(*(gchar **)props_iter) = g_strndup (&line[a], n-a);
 				props_iter += sizeof(gchar *);
+				*/
 			}
 
 			a = ++n;
@@ -564,8 +576,10 @@
 
 			if(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->_view_time)
 			{
+				/*
 				(*(gchar **)props_iter) = g_strndup (&line[a], n-a);
 				props_iter += sizeof(gchar *);
+				*/
 			}
 
 			gchar *temp = g_strrstr (&line[n],"->"); 
@@ -579,7 +593,6 @@
 			} 
  
 			entry = lxa_archive_add_file(archive, temp_filename);
-			entry->props = props;
 			g_free(line);
 			g_free(temp_filename);
 		}

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c	2006-10-18 20:10:53 UTC (rev 23464)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c	2006-10-18 22:19:23 UTC (rev 23465)
@@ -25,8 +25,10 @@
 
 #include "mime.h"
 
+//#include "entry.h"
 #include "archive.h"
 #include "archive-support.h"
+#include "slist.h"
 
 #include "internals.h"
 
@@ -34,7 +36,20 @@
 #define LXA_ENTRY_CHILD_BUFFER_SIZE 300
 #endif
 
+#ifndef LXA_MIME_DIRECTORY
+#define LXA_MIME_DIRECTORY "inode/directory"
+#endif
 
+struct _LXAEntry
+{
+	gchar *filename;
+	gchar *mime_type;
+	gpointer props;
+	LXAEntry **children;
+	LXASList *buffer;
+};
+
+
 static void
 lxa_archive_class_init(LXAArchiveClass *archive_class);
 
@@ -44,13 +59,24 @@
 static void
 lxa_archive_finalize(GObject *object);
 
-void
-lxa_archive_free_entry(LXAArchive *archive, LXAEntry *entry);
+static LXAEntry *
+lxa_entry_new(const gchar *);
 
-void
-lxa_archive_entry_flush_buffer(LXAArchive *, LXAEntry *entry);
+static void
+lxa_archive_entry_free(LXAArchive *, LXAEntry *);
 
+static LXAEntry *
+lxa_entry_get_child(const LXAEntry *entry, const gchar *filename);
 
+static void
+lxa_archive_entry_add_child(LXAArchive *, LXAEntry *, LXAEntry *);
+
+static void
+lxa_archive_entry_flush_buffer(LXAArchive *, LXAEntry *);
+
+static gpointer
+lxa_archive_entry_get_props(LXAArchive *, LXAEntry *);
+
 gint
 lxa_archive_sort_entry_buffer(LXAEntry *entry1, LXAEntry *entry2)
 {
@@ -108,8 +134,6 @@
 lxa_archive_init(LXAArchive *archive)
 {
 	archive->root_entry = g_new0(LXAEntry, 1);
-	archive->root_entry->filename = NULL;
-	archive->root_entry->children = NULL;
 }
 
 /** static void
@@ -123,7 +147,7 @@
 	LXAArchive *archive = LXA_ARCHIVE(object);
 	if(archive->path)
 		g_free(archive->path);
-	lxa_archive_free_entry(archive, archive->root_entry);
+	lxa_archive_entry_free(archive, archive->root_entry);
 	switch(archive->status)
 	{
 		case(LXA_ARCHIVESTATUS_IDLE):
@@ -178,66 +202,91 @@
 }
 
 gint
-lxa_archive_lookup_dir(gpointer entry, gconstpointer filename)
+lxa_stop_archive_child( LXAArchive *archive )
 {
-	return strcmp(((LXAEntry *)entry)->filename, filename);
+	lxa_archive_set_status(archive, LXA_ARCHIVESTATUS_USERBREAK);
+	return 0;
 }
 
-/* 
- * LXAEntry *
- * lxa_archive_add_file(LXAArchive *archive, gchar *path);
- *
- * Add a file to the archive-tree or return
- */
-LXAEntry *
-lxa_archive_add_file(LXAArchive *archive, gchar *path)
+/********************
+ * LXAArchive stuff *
+ ********************/
+
+LXAArchiveIter *
+lxa_archive_add_file(LXAArchive *archive, const gchar *path)
 {
-	gint i = 0;
-	gchar **path_items;
-	LXAEntry *tmp_entry = NULL, *parent = NULL;
-	path_items = g_strsplit_set(path, "/\n", -1);
-	parent = archive->root_entry;
-	if(path_items[i]?path_items[i][0]=='\0':0)
+	guint i = 0;
+	gchar **path_items = g_strsplit_set(path, "/\n", -1);
+	LXAArchiveIter *parent = (LXAArchiveIter*)archive->root_entry;
+	LXAArchiveIter *child = NULL;
+	gchar *basename;
+
+	while(path_items[i])
 	{
-		/* has leading / */
-		tmp_entry = lxa_entry_get_child(parent, "/");
-		if(!tmp_entry)
+		basename = g_strconcat(path_items[i], path_items[i+1]?"/":NULL, NULL);
+
+		if(basename[0] != '\0')
 		{
-			tmp_entry = g_new0(LXAEntry, 1);
-			tmp_entry->filename = g_strdup("/");
-			lxa_archive_entry_add_child(archive, parent, tmp_entry);
-			if(!parent->mime_type)
-				parent->mime_type = g_strdup("inode/directory");
+			child = lxa_archive_iter_get_child(archive, parent, basename);
+
+			if(!child)
+				child = lxa_archive_iter_add_child(archive, parent, basename);
 		}
-		parent = tmp_entry;
-		++i;
+
+		g_free(basename);
+
+		parent = child;
+		i++;
 	}
-	for(; path_items[i]?strlen(path_items[i]):0;++i)
+
+	return child;
+}
+
+GType
+lxa_archive_get_property_type(LXAArchive *archive, guint i)
+{
+#ifdef DEBUG
+	g_return_if_fail(i < archive->n_property, G_TYPE_INVALID);
+#endif
+	switch(i)
 	{
-		tmp_entry = lxa_entry_get_child(parent, path_items[i]);
-		if(!tmp_entry)
-		{
-			tmp_entry = g_new0(LXAEntry, 1);
-			tmp_entry->filename = g_strdup(path_items[i]);
-			lxa_archive_entry_add_child(archive, parent, tmp_entry);
-			if(!parent->mime_type)
-				parent->mime_type = g_strdup("inode/directory");
-		}
-		parent = tmp_entry;
+		case LXA_ARCHIVE_PROP_FILENAME:
+			return G_TYPE_STRING;
+		case LXA_ARCHIVE_PROP_MIME_TYPE:
+			return G_TYPE_STRING;
+		case LXA_ARCHIVE_PROP_USER:
+			return archive->property_types[i - LXA_ARCHIVE_PROP_USER];
 	}
-	if(!tmp_entry->mime_type)
+}
+
+
+/******************
+ * LXAEntry stuff *
+ ******************/
+
+static LXAEntry *
+lxa_entry_new(const gchar *filename)
+{
+	LXAEntry *entry = g_new0(LXAEntry, 1);
+
+	const gchar *pos = strchr(filename, '/');
+
+	if(pos)
 	{
-		if(path[strlen(path)-1] == '/')
-			tmp_entry->mime_type = g_strdup("inode/directory");
-		else
-			tmp_entry->mime_type = lxa_mime_get_mime_type_for_filename(tmp_entry->filename);
+		entry->filename = g_strndup(filename, (gsize)(pos - filename));
+		entry->mime_type = g_strdup(LXA_MIME_DIRECTORY);
 	}
-	g_strfreev(path_items);
-	return tmp_entry;
+	else
+	{
+		entry->filename = g_strdup(filename);
+		entry->mime_type = lxa_mime_get_mime_type_for_filename(entry->filename);
+	}
+
+	return entry;
 }
 
 void
-lxa_archive_free_entry(LXAArchive *archive, LXAEntry *entry)
+lxa_archive_entry_free(LXAArchive *archive, LXAEntry *entry)
 {
 	gint i = 0; 
 	gpointer props_iter = entry->props;
@@ -245,20 +294,17 @@
 
 	for(; buffer_iter; buffer_iter = buffer_iter->next)
 	{
-		lxa_archive_free_entry(archive, buffer_iter->entry);
+		lxa_archive_entry_free(archive, buffer_iter->entry);
 	}
-	if(entry->buffer)
-	{
-		lxa_slist_free(entry->buffer);
-		entry->buffer = NULL;
-	}
+	lxa_slist_free(entry->buffer);
+	entry->buffer = NULL;
 
 	if(entry->children)
 	{
 		/* first elemant of the array (*entry->children) contains the size of the array */
 		/* WHY DOES i end up being 2 when *entry->children == 1 ?! */
 		for(i = 1; i <= GPOINTER_TO_INT(*entry->children); ++i)
-			lxa_archive_free_entry(archive, entry->children[i]);
+			lxa_archive_entry_free(archive, entry->children[i]);
 
 		g_free(entry->children);
 		entry->children = NULL;
@@ -266,7 +312,7 @@
 
 	if(props_iter)
 	{
-		for(i=1; i<archive->n_property; i++)
+		for(i=0; i<archive->n_property; ++i)
 		{
 			switch(archive->property_types[i])
 			{
@@ -284,18 +330,55 @@
 		}
 		g_free(entry->props);
 	}
+	g_free(entry->mime_type);
 	g_free(entry->filename);
 	g_free(entry);
 }
 
-gint
-lxa_stop_archive_child( LXAArchive *archive )
+static LXAEntry *
+lxa_entry_get_child(const LXAEntry *entry, const gchar *filename)
 {
-	lxa_archive_set_status(archive, LXA_ARCHIVESTATUS_USERBREAK);
-	return 0;
+	LXASList *buffer_iter = NULL;
+	/* the first element of the array (*entry->children) contains the size of the array */
+	guint size = entry->children?GPOINTER_TO_INT(*entry->children):0;
+	guint pos = 0;
+	guint begin = 1;
+	gint cmp = 0;
+	/* binary search algoritme */
+	while(size)
+	{
+		pos = (size / 2);
+
+		cmp = strcmp(filename, entry->children[begin+pos]->filename);
+		if(!cmp)
+			return entry->children[begin+pos];
+
+		if(cmp < 0)
+		{
+			size = pos;
+		}
+		else
+		{
+			size -= ++pos;
+			begin += pos;
+		}
+	}
+
+	/* search the buffer */
+	for(buffer_iter = entry->buffer; buffer_iter; buffer_iter = buffer_iter->next)
+	{
+		cmp = strcmp(filename, buffer_iter->entry->filename);
+
+		if(!cmp)
+			return buffer_iter->entry;
+		if(cmp < 0)
+			break;
+	}
+
+	return NULL;
 }
 
-void
+static void
 lxa_archive_entry_add_child(LXAArchive *archive, LXAEntry *parent, LXAEntry *child)
 {
 	parent->buffer = lxa_slist_insert_sorted_single(parent->buffer, child);
@@ -304,7 +387,7 @@
 		lxa_archive_entry_flush_buffer(archive, parent);
 }
 
-void
+static void
 lxa_archive_entry_flush_buffer(LXAArchive *archive, LXAEntry *entry)
 {
 	if(!entry->buffer)
@@ -374,60 +457,495 @@
 	g_free(children_old);
 }
 
+static gpointer
+lxa_archive_entry_get_props(LXAArchive *archive, LXAEntry *entry)
+{
+	guint size = 0;
+	guint i;
+
+	if(!entry->props)
+	{
+		for(i = 0; i < archive->n_property; ++i)
+		{
+			switch(archive->property_types[i])
+			{
+				case G_TYPE_STRING:
+					size += sizeof(gchar *);
+					break;
+				case G_TYPE_UINT:
+					size += sizeof(guint);
+					break;
+				case G_TYPE_UINT64:
+					size += sizeof(guint64);
+					break;
+			}
+		}
+
+#ifdef DEBUG
+		entry->props = g_malloc0(size);
+#else
+		entry->props = g_malloc(size);
+#endif
+	}
+
+	return entry->props;
+}
+
+/************************
+ * LXAArchiveIter stuff *
+ ************************/
+
+/** 
+ * gboolean
+ * lxa_archive_iter_is_directory(const LXAArchive *, const LXAArchiveIter *)
+ *
+ * Check if archive entry is a directory
+ **/
+gboolean
+lxa_archive_iter_is_directory(const LXAArchive *archive, const LXAArchiveIter *iter)
+{
+	if(!strcmp(lxa_archive_iter_get_mime(archive, iter), LXA_MIME_DIRECTORY))
+		return TRUE;
+	return FALSE;
+}
+
+/** 
+ * guint
+ * lxa_archive_iter_n_children(const LXAArchive *, const LXAArchiveIter *)
+ *
+ * return number of children
+ **/
 guint
-lxa_entry_children_length(LXAEntry *entry)
+lxa_archive_iter_n_children(const LXAArchive *archive, const LXAArchiveIter *iter)
 {
-	g_return_val_if_fail(entry, 0);
-	/* the first element of the array (*entry->children) contains the size of the array */
-	return entry->children?GPOINTER_TO_INT(*entry->children):0 + lxa_slist_length(entry->buffer);
+#ifdef DEBUG
+	g_return_val_if_fail(iter, 0);
+#endif
+	/* the first element of the array (*iter->children) contains the size of the array */
+	return iter->children?GPOINTER_TO_INT(*iter->children):0 + lxa_slist_length(iter->buffer);
 }
 
-/* FIXME FIXME FIXME FIXME FIXME FIXME FIXME*/
-/* these functions should not even exist do they?  */
-LXAEntry *
-lxa_entry_get_child(LXAEntry *entry, const gchar *filename)
+/** 
+ * LXAArchiveIter* 
+ * lxa_archive_iter_nth_child(const LXAArchive *, const LXAArchiveIter *, guint)
+ *
+ * return nth child
+ **/
+LXAArchiveIter*
+lxa_archive_iter_nth_child(LXAArchive *archive, LXAArchiveIter *iter, guint n)
 {
-	LXASList *buffer_iter = NULL;
-	/* the first element of the array (*entry->children) contains the size of the array */
-	guint size = entry->children?GPOINTER_TO_INT(*entry->children):0;
-	guint pos = 0;
-	guint begin = 1;
-	gint cmp = 0;
-	/* binary search algoritme */
-	while(size)
+#ifdef DEBUG
+	g_return_val_if_fail(n >= 0, NULL);
+	g_return_val_if_fail(n < lxa_archive_iter_n_children(archive, iter), NULL);
+#endif
+	lxa_archive_entry_flush_buffer(archive, (LXAEntry *)iter);
+	/* the first element of the array (*iter->children) contains the size of the array */
+	return ((LXAEntry *)iter->children[n+1]);
+}
+
+/**
+ * LXAArchiveIter* 
+ * lxa_archive_iter_add_child(LXAArchive *, LXAArchiveIter *, const gchar *)
+ *
+ * return a new child
+ **/
+LXAArchiveIter *
+lxa_archive_iter_add_child(LXAArchive *archive, LXAArchiveIter *parent, const gchar *filename)
+{
+	LXAEntry *entry = lxa_entry_new(filename);
+
+	lxa_archive_entry_add_child(archive, (LXAEntry *)parent, entry);
+
+	return (LXAArchiveIter*)entry;
+}
+
+/**
+ * LXAArchiveIter*
+ * lxa_archive_iter_get_child(const LXAArchive *, const LXAArchiveIter *, const gchar *)
+ *
+ * return the child iter if found
+ **/
+LXAArchiveIter *
+lxa_archive_iter_get_child(const LXAArchive *archive, const LXAArchiveIter *parent, const gchar *filename)
+{
+	return (LXAArchiveIter*)lxa_entry_get_child(parent, filename);
+}
+
+/** 
+ * gboolean 
+ * lxa_archive_iter_del_child(const LXAArchive *, LXAArchiveIter *, LXAArchiveIter *)
+ *
+ * delete a child (if it can be found)
+ **/
+gboolean
+lxa_archive_iter_del_child(LXAArchive *archive, LXAArchiveIter *parent, LXAArchiveIter *child)
+{
+	g_warning("not implemented yet");
+}
+
+/**
+ * const gchar *
+ * lxa_archive_iter_get_filename(const LXAArchive *, const LXAArchiveIter *)
+ *
+ * returns filename
+ */
+const gchar*
+lxa_archive_iter_get_filename(const LXAArchive *archive, const LXAArchiveIter *iter)
+{
+	return ((LXAEntry *)iter)->filename;
+}
+
+/**
+ * const gchar *
+ * lxa_archive_iter_get_mime(const LXAArchive *, const LXAArchiveIter *)
+ *
+ * returns mime type
+ */
+const gchar*
+lxa_archive_iter_get_mime(const LXAArchive *archive, const LXAArchiveIter *iter)
+{
+	return ((LXAEntry *)iter)->mime_type;
+}
+
+/**
+ * void
+ * lxa_archive_iter_set_mime(const LXAArchive *, const LXAArchiveIter *, const gchar *)
+ *
+ * set mime type to entry
+ */
+void
+lxa_archive_iter_set_mime(LXAArchive *archive, LXAArchiveIter *iter, const gchar *mime)
+{
+	g_free(((LXAEntry *)iter)->mime_type);
+	((LXAEntry *)iter)->mime_type = g_strdup(mime);
+}
+
+/**
+ * void
+ * lxa_archive_iter_set_prop_str(const LXAArchive *, const LXAArchiveIter *, guint, const gchar *)
+ *
+ */
+void
+lxa_archive_iter_set_prop_str(LXAArchive *archive, LXAArchiveIter *iter, guint i, const gchar *str_val)
+{
+	gpointer props_iter = NULL;
+	guint n;
+#ifdef DEBUG
+	g_return_if_fail(i < (archive->n_property+LXA_ARCHIVE_PROP_USER));
+	if(i >= LXA_ARCHIVE_PROP_USER)
+		g_return_if_fail(archive->property_types[i-LXA_ARCHIVE_PROP_USER] == G_TYPE_STRING);
+#endif
+
+	switch(i)
 	{
-		pos = (size / 2);
+		case LXA_ARCHIVE_PROP_FILENAME:
+#ifdef DEBUG
+			g_critical("DON'T set filename");
+#endif
+			break;
+		case LXA_ARCHIVE_PROP_MIME_TYPE:
+			lxa_archive_iter_set_mime(archive, iter, str_val);
+			break;
+		default:
+			props_iter = lxa_archive_entry_get_props(archive, (LXAEntry *)iter);
+			for(n = 0; n < (i-LXA_ARCHIVE_PROP_USER); ++n)
+			{
+				switch(archive->property_types[n])
+				{
+					case G_TYPE_STRING:
+						props_iter += sizeof(gchar *);
+						break;
+					case G_TYPE_UINT:
+						props_iter += sizeof(guint);
+						break;
+					case G_TYPE_UINT64:
+						props_iter += sizeof(guint64);
+						break;
+				}
+			}
+			g_free(*((gchar **)props_iter));
+			(*((gchar **)props_iter)) = g_strdup(str_val);
+			break;
+	}
+}
 
-		cmp = strcmp(filename, entry->children[begin+pos]->filename);
-		if(!cmp)
-			return entry->children[begin+pos];
+/**
+ * void
+ * lxa_archive_iter_set_prop_uint(const LXAArchive *, const LXAArchiveIter *, guint, guint) 
+ *
+ */
+void
+lxa_archive_iter_set_prop_uint(LXAArchive *archive, LXAArchiveIter *iter, guint i, guint int_val)
+{
+	gpointer props_iter = lxa_archive_entry_get_props(archive, (LXAEntry *)iter);
+	guint n;
+#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
+	for(n = 0; n < (i-LXA_ARCHIVE_PROP_USER); ++n)
+	{
+		switch(archive->property_types[n])
+		{
+			case G_TYPE_STRING:
+				props_iter += sizeof(gchar *);
+				break;
+			case G_TYPE_UINT:
+				props_iter += sizeof(guint);
+				break;
+			case G_TYPE_UINT64:
+				props_iter += sizeof(guint64);
+				break;
+		}
+	}
+	(*((guint *)props_iter)) = int_val;
+}
 
-		if(cmp < 0)
+/**
+ * void
+ * lxa_archive_iter_set_prop_uint64(const LXAArchive *, const LXAArchiveIter *, guint, guint64) 
+ *
+ */
+void
+lxa_archive_iter_set_prop_uint64(LXAArchive *archive, LXAArchiveIter *iter, guint i, guint64 int64_val)
+{
+	gpointer props_iter = lxa_archive_entry_get_props(archive, (LXAEntry *)iter);
+	guint n;
+#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
+	for(n = 0; n < (i-LXA_ARCHIVE_PROP_USER); ++n)
+	{
+		switch(archive->property_types[n])
 		{
-			size = pos;
+			case G_TYPE_STRING:
+				props_iter += sizeof(gchar *);
+				break;
+			case G_TYPE_UINT:
+				props_iter += sizeof(guint);
+				break;
+			case G_TYPE_UINT64:
+				props_iter += sizeof(guint64);
+				break;
 		}
-		else
+	}
+	(*((guint64 *)props_iter)) = int64_val;
+}
+
+/**
+ * void
+ * lxa_archive_iter_set_prop_value(const LXAArchive *, const LXAArchiveIter *, guint, const GValue *) 
+ *
+ */
+void
+lxa_archive_iter_set_prop_value(LXAArchive *archive, LXAArchiveIter *iter, guint i, const GValue *value)
+{
+	switch(G_VALUE_TYPE(value))
+	{
+		case G_TYPE_STRING:
+			lxa_archive_iter_set_prop_str(archive, iter, i, g_value_get_string(value));
+			break;
+		case G_TYPE_UINT:
+			lxa_archive_iter_set_prop_uint(archive, iter, i, g_value_get_uint(value));
+			break;
+		case G_TYPE_UINT64:
+			lxa_archive_iter_set_prop_uint64(archive, iter, i, g_value_get_uint64(value));
+			break;
+	}
+}
+
+/**
+ * void
+ * lxa_archive_iter_set_props(const LXAArchive *, const LXAArchiveIter *, guint, ...) 
+ *
+ */
+void
+lxa_archive_iter_set_props(LXAArchive *archive, LXAArchiveIter *iter, ...)
+{
+	gpointer props_iter = lxa_archive_entry_get_props(archive, (LXAEntry *)iter);
+	guint i;
+	va_list ap;
+
+	va_start(ap, iter);
+
+	for(i = 0; i < (archive->n_property-LXA_ARCHIVE_PROP_USER); ++i)
+	{
+		switch(archive->property_types[i])
 		{
-			size -= ++pos;
-			begin += pos;
+			case G_TYPE_STRING:
+				(*((gchar **)props_iter)) = g_strdup(va_arg(ap, gchar*));
+				props_iter += sizeof(gchar *);
+				break;
+			case G_TYPE_UINT:
+				(*((guint *)props_iter)) = va_arg(ap, guint);
+				props_iter += sizeof(guint);
+				break;
+			case G_TYPE_UINT64:
+				(*((guint64 *)props_iter)) = va_arg(ap, guint64);
+				props_iter += sizeof(guint64);
+				break;
 		}
 	}
 
-	/* search the buffer */
-	for(buffer_iter = entry->buffer; buffer_iter; buffer_iter = buffer_iter->next)
+	va_end(ap);
+}
+
+/**
+ * gboolean 
+ * lxa_archive_iter_get_prop_value(const LXAArchive *, const LXAArchiveIter *, guint, const GValue *) 
+ *
+ */
+gboolean
+lxa_archive_iter_get_prop_value(const LXAArchive *archive, const LXAArchiveIter *iter, guint i, GValue *value)
+{
+	if(i>=LXA_ARCHIVE_PROP_USER)
+		g_value_init(value, archive->property_types[i-LXA_ARCHIVE_PROP_USER]);
+	else
+		g_value_init(value, G_TYPE_STRING);
+
+	switch(G_VALUE_TYPE(value))
 	{
-		cmp = strcmp(filename, buffer_iter->entry->filename);
+		case G_TYPE_STRING:
+			g_value_set_string(value, lxa_archive_iter_get_prop_str(archive, iter, i));
+			break;
+		case G_TYPE_UINT:
+			g_value_set_uint(value, lxa_archive_iter_get_prop_uint(archive, iter, i));
+			break;
+		case G_TYPE_UINT64:
+			g_value_set_uint64(value, lxa_archive_iter_get_prop_uint64(archive, iter, i));
+			break;
+	}
+	return TRUE;
+}
 
-		if(!cmp)
-			return buffer_iter->entry;
-		if(cmp < 0)
+/**
+ * const gchar *
+ * lxa_archive_iter_get_prop_str(const LXAArchive *, const LXAArchiveIter *, guint) 
+ *
+ */
+const gchar*
+lxa_archive_iter_get_prop_str(const LXAArchive *archive, const LXAArchiveIter *iter, guint i)
+{
+	const gchar *retval = NULL;
+	gpointer props_iter = NULL;
+	guint n;
+#ifdef DEBUG
+	g_return_val_if_fail(i < (archive->n_property+LXA_ARCHIVE_PROP_USER), NULL);
+	if(i >= LXA_ARCHIVE_PROP_USER)
+		g_return_val_if_fail(archive->property_types[i-LXA_ARCHIVE_PROP_USER] == G_TYPE_STRING, NULL);
+#endif
+
+	switch(i)
+	{
+		case LXA_ARCHIVE_PROP_FILENAME:
+			retval = lxa_archive_iter_get_filename(archive, iter);
 			break;
+		case LXA_ARCHIVE_PROP_MIME_TYPE:
+			retval = lxa_archive_iter_get_mime(archive, iter);
+			break;
+		default:
+			props_iter = ((LXAEntry *)iter)->props;
+			if(props_iter)
+			{
+				for(n = 0; n < (i-LXA_ARCHIVE_PROP_USER); ++n)
+				{
+					switch(archive->property_types[n])
+					{
+						case G_TYPE_STRING:
+							props_iter += sizeof(gchar *);
+							break;
+						case G_TYPE_UINT:
+							props_iter += sizeof(guint);
+							break;
+						case G_TYPE_UINT64:
+							props_iter += sizeof(guint64);
+							break;
+					}
+				}
+				retval = (*((gchar **)props_iter));
+			}
+			break;
 	}
+	return retval;
+}
 
-	return NULL;
+/**
+ * guint
+ * lxa_archive_iter_get_prop_uint(const LXAArchive *, const LXAArchiveIter *, guint) 
+ *
+ */
+guint
+lxa_archive_iter_get_prop_uint(const LXAArchive *archive, const LXAArchiveIter *iter, guint i)
+{
+	gpointer props_iter = ((LXAEntry *)iter)->props;
+	guint n;
+#ifdef DEBUG
+	g_return_val_if_fail(i < (archive->n_property+LXA_ARCHIVE_PROP_USER), 0);
+	g_return_val_if_fail(i >= LXA_ARCHIVE_PROP_USER, 0);
+	g_return_val_if_fail(archive->property_types[i-LXA_ARCHIVE_PROP_USER] == G_TYPE_UINT, 0);
+#endif
+	if(!props_iter)
+		return 0;
+	for(n = 0; n < (i-LXA_ARCHIVE_PROP_USER); ++n)
+	{
+		switch(archive->property_types[n])
+		{
+			case G_TYPE_STRING:
+				props_iter += sizeof(gchar *);
+				break;
+			case G_TYPE_UINT:
+				props_iter += sizeof(guint);
+				break;
+			case G_TYPE_UINT64:
+				props_iter += sizeof(guint64);
+				break;
+		}
+	}
+	return (*((guint *)props_iter));
 }
 
+/**
+ * guint64
+ * lxa_archive_iter_get_prop_uint64(const LXAArchive *, const LXAArchiveIter *, guint) 
+ *
+ */
+guint64
+lxa_archive_iter_get_prop_uint64(const LXAArchive *archive, const LXAArchiveIter *iter, guint i)
+{
+	gpointer props_iter = ((LXAEntry *)iter)->props;
+	guint n;
+#ifdef DEBUG
+	g_return_val_if_fail(i < (archive->n_property+LXA_ARCHIVE_PROP_USER), 0);
+	g_return_val_if_fail(i >= LXA_ARCHIVE_PROP_USER, 0);
+	g_return_val_if_fail(archive->property_types[i-LXA_ARCHIVE_PROP_USER] == G_TYPE_UINT64, 0);
+#endif
+	if(!props_iter)
+		return 0;
+	for(n = 0; n < (i-LXA_ARCHIVE_PROP_USER); ++n)
+	{
+		switch(archive->property_types[n])
+		{
+			case G_TYPE_STRING:
+				props_iter += sizeof(gchar *);
+				break;
+			case G_TYPE_UINT:
+				props_iter += sizeof(guint);
+				break;
+			case G_TYPE_UINT64:
+				props_iter += sizeof(guint64);
+				break;
+		}
+	}
+	return (*((guint64 *)props_iter));
+}
 
+/**************
+ * Depricated *
+ **************/
+
 LXAEntry *
 lxa_entry_children_nth_data(LXAArchive *archive, LXAEntry *entry, guint n)
 {
@@ -442,3 +960,12 @@
 		return NULL;
 }
 
+guint
+lxa_entry_children_length(LXAEntry *entry)
+{
+	g_return_val_if_fail(entry, 0);
+	/* the first element of the array (*entry->children) contains the size of the array */
+	return entry->children?GPOINTER_TO_INT(*entry->children):0 + lxa_slist_length(entry->buffer);
+}
+
+

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h	2006-10-18 20:10:53 UTC (rev 23464)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h	2006-10-18 22:19:23 UTC (rev 23465)
@@ -31,20 +31,17 @@
 	LXA_ARCHIVESTATUS_USERBREAK
 } LXAArchiveStatus;
 
+enum
+{
+	LXA_ARCHIVE_PROP_FILENAME = 0,
+	LXA_ARCHIVE_PROP_MIME_TYPE,
+	LXA_ARCHIVE_PROP_USER
+};
 
 typedef struct _LXAEntry LXAEntry;
+typedef LXAEntry LXAArchiveIter;
 
-#include "slist.h"
 
-struct _LXAEntry {
-	gchar *filename;
-	gpointer props;
-	gchar *mime_type;
-	/* */
-	LXAEntry **children;
-	LXASList *buffer;
-};
-
 #define LXA_ARCHIVE(obj)         ( \
 		G_TYPE_CHECK_INSTANCE_CAST ((obj),    \
 			lxa_archive_get_type(),      \
@@ -96,21 +93,37 @@
 	GObjectClass parent;
 }; 
 
-GType              lxa_archive_get_type(void);
-LXAArchive        *lxa_archive_new(gchar *, gchar *);
+GType           lxa_archive_get_type(void);
+LXAArchive     *lxa_archive_new(gchar *, gchar *);
 
-void               lxa_archive_set_status(LXAArchive *archive, LXAArchiveStatus status);
-gint               lxa_archive_lookup_dir(gpointer entry, gconstpointer filename);
-LXAEntry          *lxa_archive_add_file(LXAArchive *archive, gchar *path);
-void               lxa_archive_entry_add_child(LXAArchive *archive, LXAEntry *parent, LXAEntry *child);
+void            lxa_archive_set_status(LXAArchive *archive, LXAArchiveStatus status);
 
-GSList            *lxa_archive_get_children(LXAArchive *archive, gchar *path);
-LXAEntry          *lxa_entry_get_child(LXAEntry *, const gchar *);
-guint              lxa_entry_children_length(LXAEntry *entry);
-LXAEntry          *lxa_entry_children_nth_data(LXAArchive *archive, LXAEntry *entry, guint n);
-//gint               lxa_entry_children_index(LXAEntry *entry, LXAEntry *find);
+/* new */
+gboolean        lxa_archive_iter_is_directory(const LXAArchive *, const LXAArchiveIter *);
+guint           lxa_archive_iter_n_children(const LXAArchive *, const LXAArchiveIter *);
+LXAArchiveIter *lxa_archive_iter_nth_child(LXAArchive *, LXAArchiveIter *, guint);
+LXAArchiveIter *lxa_archive_iter_add_child(LXAArchive *, LXAArchiveIter *, const gchar *);
+LXAArchiveIter *lxa_archive_iter_get_child(const LXAArchive *, const LXAArchiveIter *, const gchar *);
+gboolean        lxa_archive_iter_del_child(LXAArchive *, LXAArchiveIter *, LXAArchiveIter *);
 
+/* void            lxa_archive_iter_set_filename(LXAArchive *, LXAArchiveIter *, const gchar *); */
+void            lxa_archive_iter_set_mime(LXAArchive *, LXAArchiveIter *, const gchar *);
+void            lxa_archive_iter_set_prop_str(LXAArchive *, LXAArchiveIter *, guint, const gchar *);
+void            lxa_archive_iter_set_prop_uint(LXAArchive *, LXAArchiveIter *, guint, guint);
+void            lxa_archive_iter_set_prop_uint64(LXAArchive *, LXAArchiveIter *, guint, guint64);
+void            lxa_archive_iter_set_prop_value(LXAArchive *, LXAArchiveIter *, guint, const GValue *);
+void            lxa_archive_iter_set_props(LXAArchive *, LXAArchiveIter *, ...);
 
+const gchar    *lxa_archive_iter_get_filename(const LXAArchive *, const LXAArchiveIter *);
+const gchar    *lxa_archive_iter_get_mime(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 *);
+GType           lxa_archive_get_property_type(LXAArchive *, guint);
+
 G_END_DECLS
 
 #endif /* __LIBXARCHIVER_ARCHIVE_H__ */

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/libxarchiver.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/libxarchiver.c	2006-10-18 20:10:53 UTC (rev 23464)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/libxarchiver.c	2006-10-18 22:19:23 UTC (rev 23465)
@@ -40,9 +40,11 @@
 
 	lxa_mime_init();
 
+	lxa_register_support(lxa_archive_support_gnu_tar_new());
+
+/*
 	lxa_register_support(lxa_archive_support_zip_new());
-	lxa_register_support(lxa_archive_support_gnu_tar_new());
-	/* TODO: Implement right commands in unrar
+	TODO: Implement right commands in unrar
 	lxa_register_support(lxa_archive_support_rar_new());
 	lxa_register_support(lxa_archive_support_unrar_new());
 	*/

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c	2006-10-18 20:10:53 UTC (rev 23464)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c	2006-10-18 22:19:23 UTC (rev 23465)
@@ -4,6 +4,7 @@
 #include <glib-object.h>
 
 #include "archive.h"
+#include "slist.h"
 
 LXASList *
 lxa_slist_insert_sorted_single(LXASList *list, LXAEntry *entry)
@@ -15,7 +16,8 @@
 
 	for(; iter; iter = iter->next)
 	{
-		cmp = strcmp(entry->filename, ((LXAEntry*)iter->entry)->filename);
+		/* archive can be NULL */
+		cmp = strcmp(lxa_archive_iter_get_filename(NULL, entry), lxa_archive_iter_get_filename( NULL, (LXAEntry*)iter->entry));
 
 		if(!cmp)
 		{

Modified: xarchiver/branches/xarchiver-psybsd/src/archive_store.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/archive_store.c	2006-10-18 20:10:53 UTC (rev 23464)
+++ xarchiver/branches/xarchiver-psybsd/src/archive_store.c	2006-10-18 22:19:23 UTC (rev 23465)
@@ -26,8 +26,6 @@
 
 #include "archive_store.h"
 
-static LXAEntry xa_archive_store_up_entry;
-
 static void
 xa_archive_store_class_init(XAArchiveStoreClass *as_class);
 
@@ -105,7 +103,7 @@
 xa_archive_store_has_default_sort_func(GtkTreeSortable *);
 
 static gint
-xa_archive_entry_compare(XAArchiveStore *store, LXAEntry *a, LXAEntry *b);
+xa_archive_entry_compare(XAArchiveStore *store, LXAArchiveIter *a, LXAArchiveIter *b);
 static void
 xa_archive_quicksort(XAArchiveStore *store, gint left, gint right);
 static void
@@ -261,11 +259,12 @@
 		 G_TYPE_NONE,
 		 0,
 		 NULL);
-
+/*
 	xa_archive_store_up_entry.filename = "..";
 	xa_archive_store_up_entry.props = NULL;
 	xa_archive_store_up_entry.children = NULL;
 	xa_archive_store_up_entry.buffer = NULL;
+*/
 }
 
 static void
@@ -278,7 +277,7 @@
 			if(XA_ARCHIVE_STORE(object)->props._show_icons != g_value_get_boolean(value)?1:0)
 			{
 				if(XA_ARCHIVE_STORE(object)->current_entry)
-					prev_size = lxa_entry_children_length(((LXAEntry*)XA_ARCHIVE_STORE(object)->current_entry->data));
+					prev_size = lxa_entry_children_length(((LXAArchiveIter*)XA_ARCHIVE_STORE(object)->current_entry->data));
 				XA_ARCHIVE_STORE(object)->props._show_icons = g_value_get_boolean(value)?1:0;
 				xa_archive_store_refresh(XA_ARCHIVE_STORE(object), prev_size);
 			}
@@ -287,7 +286,7 @@
 			if(XA_ARCHIVE_STORE(object)->props._show_up_dir != g_value_get_boolean(value)?1:0)
 			{
 				if(XA_ARCHIVE_STORE(object)->current_entry)
-					prev_size = lxa_entry_children_length(((LXAEntry*)XA_ARCHIVE_STORE(object)->current_entry->data));
+					prev_size = lxa_entry_children_length(((LXAArchiveIter*)XA_ARCHIVE_STORE(object)->current_entry->data));
 				XA_ARCHIVE_STORE(object)->props._show_up_dir = g_value_get_boolean(value)?1:0;
 				xa_archive_store_refresh(XA_ARCHIVE_STORE(object), prev_size);
 			}
@@ -350,7 +349,7 @@
 	if(!archive)
 		return 0;
 	
-	return archive->n_property + 2;
+	return archive->n_property + 1;
 }
 
 static GType
@@ -364,14 +363,12 @@
 	if(!archive)
 		return G_TYPE_INVALID;
 
-	index -= 2;
+	index--;
 
 	if(index < 0)
 		return G_TYPE_STRING;
 
-	g_return_val_if_fail(index < archive->n_property, G_TYPE_INVALID);
-
-	return archive->property_types[index];
+	return lxa_archive_get_property_type(archive, index);
 }
 
 static gboolean
@@ -382,7 +379,7 @@
 	XAArchiveStore *store = XA_ARCHIVE_STORE(tree_model);
 	LXAArchive *archive = store->archive;
 
-	LXAEntry *entry = NULL;
+	LXAArchiveIter *entry = NULL;
 	if(!store->current_entry)
 		return FALSE;
 
@@ -402,7 +399,7 @@
 
 	if(index == -1)
 	{
-		entry = &xa_archive_store_up_entry;
+		entry = NULL;
 	}
 	else
 	{
@@ -410,7 +407,7 @@
 		if(store->sort_list)
 			entry = store->sort_list[index];
 		else
-			entry = lxa_entry_children_nth_data(archive, entry, index);
+			entry = lxa_archive_iter_nth_child(archive, entry, index);
 
 		g_return_val_if_fail(entry, FALSE);
 
@@ -434,7 +431,7 @@
 
 	g_return_val_if_fail(archive, NULL);
 
-	LXAEntry *entry = (LXAEntry*)iter->user_data2;
+	LXAArchiveIter *entry = (LXAArchiveIter*)iter->user_data2;
 	gint pos = GPOINTER_TO_INT(iter->user_data3);
 
 	if(store->props._show_up_dir && archive->root_entry != entry)
@@ -456,76 +453,39 @@
 
 	XAArchiveStore *store = XA_ARCHIVE_STORE(tree_model);
 	LXAArchive *archive = store->archive;
+	LXAArchiveIter *entry = iter->user_data;
 
 	g_return_if_fail(archive);
 
-	column -= 2;
+	column--;
 
-	g_return_if_fail (column < (gint)archive->n_property);
-
-	LXAEntry *entry = ((LXAEntry *)iter->user_data);
-	gpointer props_iter = entry->props;
-	gint i = 0;
-
-	if(column == -2)
+	if(entry)
 	{
-		g_value_init(value, G_TYPE_STRING);
-
-		if(store->props._show_icons)
+		if(column == -1)
 		{
-			if(entry == &xa_archive_store_up_entry)
-			{
-				g_value_set_string(value, GTK_STOCK_GO_UP);
-			}
-			else
-			{
-				if(store->icon_theme)
-				{
-					g_value_set_string(value, entry->mime_type);
-					lxa_mime_convert_to_icon_name(store->icon_theme, value);
-				}
-			}
+			lxa_archive_iter_get_prop_value(archive, entry, LXA_ARCHIVE_PROP_MIME_TYPE, value);
+			lxa_mime_convert_to_icon_name(store->icon_theme, value);
 		}
+		else
+		{
+			lxa_archive_iter_get_prop_value(archive, entry, column, value);
+		}
 	}
-	else if(column == -1)
-	{
-		g_value_init(value, G_TYPE_STRING);
-
-		g_value_set_string(value, entry->filename);
-	}
 	else
 	{
-		g_value_init(value, archive->property_types[column]);
-
-		if(props_iter)
+		switch(column)
 		{
-			for(;i<column;i++)
-			{
-				switch(archive->property_types[i])
-				{
-					case G_TYPE_STRING:
-						props_iter+=sizeof(gchar *);
-						break;
-					case G_TYPE_UINT64:
-						props_iter+=sizeof(guint64);
-						break;
-					case G_TYPE_UINT:
-						props_iter+=sizeof(guint);
-						break;
-				}
-			}
-			switch(archive->property_types[column])
-			{
-				case G_TYPE_STRING:
-					g_value_set_string(value, *(gchar **)props_iter);
-					break;
-				case G_TYPE_UINT64:
-					g_value_set_uint64(value, *(guint64 *)props_iter);
-					break;
-				case G_TYPE_UINT:
-					g_value_set_uint(value, *(guint *)props_iter);
-					break;
-			}
+			case -1:
+				g_value_init(value, G_TYPE_STRING);
+				g_value_set_string(value, GTK_STOCK_GO_UP);
+				break;
+			case LXA_ARCHIVE_PROP_FILENAME:
+				g_value_init(value, G_TYPE_STRING);
+				g_value_set_string(value, "..");
+				break;
+			default:
+				g_value_init(value, lxa_archive_get_property_type(archive, column));
+				break;
 		}
 	}
 }
@@ -537,19 +497,19 @@
 	
 	XAArchiveStore *store = XA_ARCHIVE_STORE(tree_model);
 
-	LXAEntry *entry = (LXAEntry*)iter->user_data2;
+	LXAArchiveIter *entry = (LXAArchiveIter*)iter->user_data2;
 	gint pos = GPOINTER_TO_INT(iter->user_data3);
 	pos++;
 
 	if(store->sort_list)
 	{
-		if(pos < lxa_entry_children_length(entry))
+		if(pos < lxa_archive_iter_n_children(store->archive, entry))
 			entry = store->sort_list[pos];
 		else
 			entry = NULL;
 	}
 	else
-		entry = lxa_entry_children_nth_data(store->archive, entry, pos);
+		entry = lxa_archive_iter_nth_child(store->archive, entry, pos);
 
 	if(!entry)
 		return FALSE;
@@ -568,7 +528,7 @@
 
 	XAArchiveStore *store = XA_ARCHIVE_STORE(tree_model);
 	LXAArchive *archive = store->archive;
-	LXAEntry *entry = store->current_entry->data;
+	LXAArchiveIter *entry = store->current_entry->data;
 
 	g_return_val_if_fail(archive, FALSE);
 	g_return_val_if_fail(entry, FALSE);
@@ -578,7 +538,7 @@
 
 	if(store->props._show_up_dir && archive->root_entry != entry)
 	{
-		entry = &xa_archive_store_up_entry;
+		entry = NULL;
 		iter->user_data3 = GINT_TO_POINTER(-1);
 	}
 	else
@@ -586,7 +546,7 @@
 		if(store->sort_list)
 			entry = store->sort_list[0];
 		else
-			entry = lxa_entry_children_nth_data(archive, entry, 0);
+			entry = lxa_archive_iter_nth_child(archive, entry, 0);
 	
 		g_return_val_if_fail(entry, FALSE);
 	
@@ -613,7 +573,7 @@
 
 	XAArchiveStore *store = XA_ARCHIVE_STORE(tree_model);
 	LXAArchive *archive = store->archive;
-	LXAEntry *entry = store->current_entry->data;
+	LXAArchiveIter *entry = store->current_entry->data;
 
 	g_return_val_if_fail(archive, 0);
 	g_return_val_if_fail(entry, 0);
@@ -631,7 +591,7 @@
 
 	XAArchiveStore *store = XA_ARCHIVE_STORE(tree_model);
 	LXAArchive *archive = store->archive;
-	LXAEntry *entry = store->current_entry->data;
+	LXAArchiveIter *entry = store->current_entry->data;
 
 	g_return_val_if_fail(archive, FALSE);
 	g_return_val_if_fail(entry, FALSE);
@@ -645,14 +605,14 @@
 
 	if(n == -1)
 	{
-		entry = &xa_archive_store_up_entry;
+		entry = NULL;
 	}
 	else
 	{
 		if(store->sort_list)
 			entry = store->sort_list[n];
 		else
-			entry = lxa_entry_children_nth_data(archive, entry, n);
+			entry = lxa_archive_iter_nth_child(archive, entry, n);
 	
 		g_return_val_if_fail(entry, FALSE);
 	}
@@ -728,22 +688,22 @@
 }
 
 static gint
-xa_archive_entry_compare(XAArchiveStore *store, LXAEntry *a, LXAEntry *b)
+xa_archive_entry_compare(XAArchiveStore *store, LXAArchiveIter *a, LXAArchiveIter *b)
 {
-	gint cmp_a = 0;
-	gint cmp_b = 0;
+	gboolean cmp_a = 0;
+	gboolean cmp_b = 0;
 	if(store->props._sort_folders_first)
 	{
-		cmp_a = strcmp(a->mime_type, "inode/directory");
-		cmp_b = strcmp(b->mime_type, "inode/directory");
+		cmp_a = lxa_archive_iter_is_directory(store->archive, a);
+		cmp_b = lxa_archive_iter_is_directory(store->archive, b);
 
-		if(cmp_a ==  0 && cmp_b != 0)
+		if(cmp_a && !cmp_b)
 			return -1;
-		if(cmp_b ==  0 && cmp_a != 0)
+		if(cmp_b && !cmp_a)
 			return 1;
 	}
 
-	LXAEntry *swap = b;
+	LXAArchiveIter *swap = b;
 	if(store->sort_order == GTK_SORT_DESCENDING)
 	{
 		b = a;
@@ -752,65 +712,24 @@
 
 	LXAArchive *archive = store->archive;
 	gint column = store->sort_column;
-	gpointer props_a = a->props;
-	gpointer props_b = b->props;
 	gint i = 0;
 
-	column -= 2;
+	column--;
 
-	g_return_val_if_fail(column > -2, 0);
-
-	if(column == -1)
-		switch(store->props._sort_case_sensitive)
-		{
-			case 0: /* case insensitive */
-				return g_ascii_strcasecmp(a->filename, b->filename);
-			case 1: /* case sensitive*/
-				return strcmp(a->filename, b->filename);
-		}
-
-	if(!props_a)
+	switch(lxa_archive_get_property_type(archive, column))
 	{
-		return props_b?-1:0;
-	}
-	if(!props_b)
-	{
-		return props_a?1:0;
-	}
-
-	for(i=0;i<column;i++)
-	{
-		switch(archive->property_types[i])
-		{
-			case G_TYPE_STRING:
-				props_a+=sizeof(gchar *);
-				props_b+=sizeof(gchar *);
-				break;
-			case G_TYPE_UINT64:
-				props_a+=sizeof(guint64);
-				props_b+=sizeof(guint64);
-				break;
-			case G_TYPE_UINT:
-				props_a+=sizeof(guint);
-				props_b+=sizeof(guint);
-				break;
-		}
-	}
-
-	switch(archive->property_types[column])
-	{
 		case G_TYPE_STRING:
 			switch(store->props._sort_case_sensitive)
 			{
 				case 0: /* case insensitive */
-					return g_ascii_strcasecmp(*((gchar**)props_a), *((gchar**)props_b));
+					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 */
-					return strcmp(*((gchar**)props_a), *((gchar**)props_b));
+					return strcmp(lxa_archive_iter_get_prop_str(archive, a, column), lxa_archive_iter_get_prop_str(archive, b, column));
 			}
 		case G_TYPE_UINT64:
-			return (*((guint64*)props_a)) - (*((guint64*)props_b));
+			return lxa_archive_iter_get_prop_uint64(archive, a, column) - lxa_archive_iter_get_prop_uint64(archive, b, column);
 		case G_TYPE_UINT:
-			return (*((guint*)props_a)) - (*((guint*)props_b));
+			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);
@@ -828,27 +747,27 @@
 	if(store->sort_column < 0)
 		return;
 
-	LXAEntry *pentry = (LXAEntry*)store->current_entry->data;
+	LXAArchiveIter *pentry = (LXAArchiveIter*)store->current_entry->data;
 	gint psize = lxa_entry_children_length(pentry);
 	gint i = 0;
 
 	if(psize <= 1)
 		return;
 
-	store->sort_list = g_new(LXAEntry*, psize);
+	store->sort_list = g_new(LXAArchiveIter*, psize);
 
 	for(i = 0; i < psize; i++)
 	{
-		store->sort_list[i] = lxa_entry_children_nth_data(store->archive, pentry, i);
+		store->sort_list[i] = lxa_archive_iter_nth_child(store->archive, pentry, i);
 	}
 	xa_archive_quicksort(store, 0, psize-1);
 	xa_archive_insertionsort(store, 0, psize-1);
 }
 
 inline void
-swap(LXAEntry **left, LXAEntry **right)
+swap(LXAArchiveIter **left, LXAArchiveIter **right)
 {
-	LXAEntry *tmp = *right;
+	LXAArchiveIter *tmp = *right;
 	*right = *left;
 	*left = tmp;
 }
@@ -860,8 +779,8 @@
 
 	gint i = (left+right)/2;
 	gint j = right-1;
-	LXAEntry *value = NULL;
-	LXAEntry **list = store->sort_list;
+	LXAArchiveIter *value = NULL;
+	LXAArchiveIter **list = store->sort_list;
 
 	if(xa_archive_entry_compare(store, list[left], list[i]) > 0)
 		swap(list+left, list+i);
@@ -892,8 +811,8 @@
 {
 	gint i = 0;
 	gint j = 0;
-	LXAEntry *value = NULL;
-	LXAEntry **list = store->sort_list;
+	LXAArchiveIter *value = NULL;
+	LXAArchiveIter **list = store->sort_list;
 
 	for(i = left+1; i <= right; i++)
 	{
@@ -937,7 +856,7 @@
 xa_archive_store_refresh(XAArchiveStore *store, gint prev_size)
 {
 	LXAArchive *archive = store->archive;
-	LXAEntry *entry = store->current_entry->data;
+	LXAArchiveIter *entry = store->current_entry->data;
 
 	g_return_if_fail(archive);
 	g_return_if_fail(entry);
@@ -953,7 +872,7 @@
 		gtk_tree_path_append_index(path_, 0);
 
 		iter.stamp = store->stamp;
-		iter.user_data = &xa_archive_store_up_entry;
+		iter.user_data = NULL;
 		iter.user_data2 = entry;
 		iter.user_data3 = GINT_TO_POINTER(-1);
 
@@ -975,7 +894,7 @@
 		if(store->sort_list)
 			iter.user_data = store->sort_list[i];
 		else
-			iter.user_data = lxa_entry_children_nth_data(archive, archive->root_entry, i);
+			iter.user_data = lxa_archive_iter_nth_child(archive, archive->root_entry, i);
 		iter.user_data2 = entry;
 		iter.user_data3 = GINT_TO_POINTER(index);
 
@@ -1007,7 +926,7 @@
 
 
 	LXAArchive *archive = store->archive;
-	LXAEntry *entry = store->current_entry->data;
+	LXAArchiveIter *entry = store->current_entry->data;
 
 	g_return_if_fail(archive);
 	g_return_if_fail(entry);
@@ -1037,12 +956,12 @@
 		if(store->sort_list)
 			entry = store->sort_list[index];
 		else
-			entry = lxa_entry_children_nth_data(archive, entry, index);
+			entry = lxa_archive_iter_nth_child(archive, entry, index);
 
 		g_return_if_fail(entry);
 
 		/* TODO Signal file-activated */
-		if(strcmp(entry->mime_type, "inode/directory"))
+		if(!lxa_archive_iter_is_directory(archive, entry))
 		{
 #ifdef DEBUG
 			g_debug("file clicked");
@@ -1063,7 +982,7 @@
 xa_archive_store_go_up(XAArchiveStore *store)
 {
 	LXAArchive *archive = store->archive;
-	LXAEntry *entry = store->current_entry->data;
+	LXAArchiveIter *entry = store->current_entry->data;
 
 	g_return_if_fail(archive);
 	g_return_if_fail(entry);
@@ -1095,7 +1014,7 @@
 	GtkTreeIter iter;
 	g_return_if_fail(store);
 
-	LXAEntry *entry = NULL;
+	LXAArchiveIter *entry = NULL;
 	gint prev_size =  0;
 
 	if(store->sort_list)
@@ -1152,7 +1071,7 @@
 		if(store->sort_list)
 			iter.user_data = store->sort_list[i];
 		else
-			iter.user_data = lxa_entry_children_nth_data(archive, archive->root_entry, i);
+			iter.user_data = lxa_archive_iter_nth_child(archive, archive->root_entry, i);
 		iter.user_data2 = archive->root_entry;
 		iter.user_data3 = GINT_TO_POINTER(i);
 
@@ -1171,7 +1090,7 @@
 	g_return_val_if_fail(store, NULL);
 
 	gchar *path = NULL;
-	gchar **buf = NULL;
+	const gchar **buf = NULL;
 	GSList *iter = store->current_entry;
 	gint i = g_slist_length(iter);
 	gchar *lastfile = NULL;
@@ -1181,13 +1100,13 @@
 	if(i<=1)
 		return g_strdup("");
 
-	buf = g_new(gchar*, i);
+	buf = g_new(const gchar*, i);
 	i--;
 	buf[i] = NULL;
 
-	namelen = strlen(((LXAEntry*)iter->data)->filename);
+	namelen = strlen(lxa_archive_iter_get_filename(store->archive, (LXAArchiveIter*)iter->data));
 	lastfile = g_new(gchar, namelen+2);
-	strcpy(lastfile, ((LXAEntry*)iter->data)->filename);
+	strcpy(lastfile, lxa_archive_iter_get_filename(store->archive, (LXAArchiveIter*)iter->data));
 	if(lastfile[namelen-1] != '/')
 	{
 		lastfile[namelen] = '/';
@@ -1203,7 +1122,7 @@
 		while(iter->next)
 		{
 			--i;
-			buf[i] = ((LXAEntry*)iter->data)->filename;
+			buf[i] = lxa_archive_iter_get_filename(store->archive, (LXAArchiveIter*)iter->data);
 			iter = iter->next;
 		}
 	}
@@ -1213,7 +1132,8 @@
 		buf[0] = "";
 	}
 
-	path = g_strjoinv("/", buf);
+	/* why does glib want buf to be gchar** instead of const gchar** ? */
+	path = g_strjoinv("/", (gchar**)buf);
 
 	g_free(lastfile);
 	g_free(buf);
@@ -1235,7 +1155,7 @@
 	/* we don't want to include de archive rootentry */
 	while(iter->next)
 	{
-		path = g_slist_prepend(path, g_strdup(((LXAEntry*)iter->data)->filename));
+		path = g_slist_prepend(path, g_strdup(lxa_archive_iter_get_filename(store->archive, (LXAArchiveIter*)iter->data)));
 		iter = iter->next;
 	}
 
@@ -1261,14 +1181,14 @@
 
 	gchar **buf = g_strsplit_set(path, "/\n", -1);
 	gchar **iter = buf;
-	LXAEntry *entry = store->archive->root_entry;
+	LXAArchiveIter *entry = store->archive->root_entry;
 	GSList *stack = g_slist_prepend(NULL, entry);
-	gint prev_size = lxa_entry_children_length(((LXAEntry*)store->current_entry->data));
+	gint prev_size = lxa_entry_children_length(((LXAArchiveIter*)store->current_entry->data));
 
 	if(store->props._show_up_dir && store->archive->root_entry != store->current_entry->data)
 		prev_size++;
 
-	if(path[0] == '/' && lxa_entry_get_child(store->archive->root_entry, "/"))
+	if(path[0] == '/' && lxa_archive_iter_get_child(store->archive, store->archive->root_entry, "/"))
 	{
 		iter[0] = strdup("/");
 	}
@@ -1277,7 +1197,7 @@
 	{
 		if((*iter)[0])
 		{
-			entry = lxa_entry_get_child(entry, *iter);
+			entry = lxa_archive_iter_get_child(store->archive, entry, *iter);
 			if(!entry)
 			{
 				g_strfreev(buf);

Modified: xarchiver/branches/xarchiver-psybsd/src/main_window.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/main_window.c	2006-10-18 20:10:53 UTC (rev 23464)
+++ xarchiver/branches/xarchiver-psybsd/src/main_window.c	2006-10-18 22:19:23 UTC (rev 23465)
@@ -64,7 +64,7 @@
 xa_main_window_finalize(GObject *object);
 
 gboolean
-xa_main_window_add_item(LXAEntry *entry, gpointer data);
+xa_main_window_add_item(LXAArchiveIter *entry, gpointer data);
 void 
 xa_main_window_set_contents(XAMainWindow *, LXAArchive *);
 
@@ -809,11 +809,11 @@
 				case(G_TYPE_STRING):
 				case(G_TYPE_UINT64):
 					renderer = gtk_cell_renderer_text_new();
-					column = gtk_tree_view_column_new_with_attributes(archive->property_names[x], renderer, "text", x+2, NULL);
+					column = gtk_tree_view_column_new_with_attributes(archive->property_names[x], renderer, "text", x+3, NULL);
 					break;
 			}
 			gtk_tree_view_column_set_resizable(column, TRUE);
-			gtk_tree_view_column_set_sort_column_id(column, x+2);
+			gtk_tree_view_column_set_sort_column_id(column, x+3);
 			gtk_tree_view_append_column(GTK_TREE_VIEW(window->treeview), column);
 		}
 	}
@@ -834,83 +834,18 @@
 	gtk_tree_view_set_model(GTK_TREE_VIEW(main_window->treeview), GTK_TREE_MODEL(liststore));
 }
 
-gboolean
-xa_main_window_add_item(LXAEntry *entry, gpointer data)
-{
-	gint i = 0;
-	GtkTreeIter iter;
-	gpointer props;
-	gpointer props_iter;
-	GValue *tmp_value;
-	XAMainWindow *main_window= XA_MAIN_WINDOW(data);
-	GtkTreeModel *liststore = main_window->treemodel;
-	gtk_list_store_append(GTK_LIST_STORE(liststore), &iter);
-	if(main_window->props._show_icons)
-	{
-		tmp_value = g_new0(GValue, 1);
-		tmp_value = g_value_init(tmp_value, G_TYPE_STRING);
-		g_value_set_string(tmp_value, entry->mime_type);
-		gtk_list_store_set_value(GTK_LIST_STORE(liststore), &iter, i, tmp_value);
-		g_value_unset(tmp_value);
-		g_free(tmp_value);
-		i++;
-	}
-	tmp_value = g_new0(GValue, 1);
-	tmp_value = g_value_init(tmp_value, G_TYPE_STRING);
-	g_value_set_string(tmp_value, entry->filename);
-	gtk_list_store_set_value(GTK_LIST_STORE(liststore), &iter, i, tmp_value);
-	g_value_unset(tmp_value);
-	g_free(tmp_value);
-
-	props = entry->props;
-	if(props)
-	{
-		props_iter = props;
-
-		for(i=0; i < main_window->lp_xa_archive->n_property; i++)
-		{
-			tmp_value = g_new0(GValue, 1);
-			tmp_value = g_value_init(tmp_value, main_window->lp_xa_archive->property_types[i]);
-			switch(main_window->lp_xa_archive->property_types[i])
-			{
-				case(G_TYPE_UINT):
-					g_value_set_uint(tmp_value, *(guint *)props_iter);
-					props_iter += sizeof(guint);
-					break;
-				case(G_TYPE_STRING):
-					g_value_set_string(tmp_value, *(gchar **)props_iter);
-					props_iter += sizeof(gchar *);
-					break;
-				case(G_TYPE_UINT64):
-					g_value_set_uint64(tmp_value, *(guint64 *)props_iter);
-					props_iter += sizeof(guint64);
-					break;
-			}
-			if(main_window->props._show_icons)
-				gtk_list_store_set_value(GTK_LIST_STORE(liststore), &iter, i+1, tmp_value);
-			else
-				gtk_list_store_set_value(GTK_LIST_STORE(liststore), &iter, i, tmp_value);
-			g_value_unset(tmp_value);
-			g_free(tmp_value);
-		}
-	}
-	return FALSE;
-}
-
-
-
 gchar *
 xa_main_window_get_working_dir(XAMainWindow *window)
 {
-	gchar *temp = ((LXAEntry *)window->working_node->data)->filename;
+	const gchar *temp = lxa_archive_iter_get_filename(window->lp_xa_archive, (LXAArchiveIter *)window->working_node->data);
 	gchar *path = g_strdup(temp), *_temp = NULL;
 	GSList *_path = window->working_node->next;
 	while(_path)
 	{
-		if((((LXAEntry *)_path->data)->filename[0] != '/'))
+		if((lxa_archive_iter_get_filename(window->lp_xa_archive, (LXAArchiveIter *)_path->data)[0] != '/'))
 		{
 			_temp = path;
-			path = g_strconcat(((LXAEntry *)_path->data)->filename, "/", _temp,NULL);
+			path = g_strconcat(lxa_archive_iter_get_filename(window->lp_xa_archive, (LXAArchiveIter *)_path->data), "/", _temp,NULL);
 			g_free(_temp);
 		}
 		_path = _path->next;



More information about the Xfce4-commits mailing list