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 <[EMAIL PROTECTED]>

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;

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to