[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