[bijiben] mTime: back to gint64
- From: Pierre-Yves Luyten <pyluyten src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [bijiben] mTime: back to gint64
- Date: Sat, 11 May 2013 00:17:30 +0000 (UTC)
commit eff2d7c74843468ab213ccadcff4477e1e6a61c5
Author: Pierre-Yves Luyten <py luyten fr>
Date: Sat May 11 02:03:25 2013 +0200
mTime: back to gint64
Collections now store their LastModified field and return gint64.
The associated retrieves provide both collection label, urn and mtime.
Notes use the same format and so does the controller.
src/bjb-controller.c | 20 +++++++-------
src/bjb-note-tag-dialog.c | 54 ++++++++++++++++++++++++--------------
src/libbiji/biji-collection.c | 43 +++++++++++++++++++++++++------
src/libbiji/biji-collection.h | 5 +++-
src/libbiji/biji-item.c | 8 +++--
src/libbiji/biji-item.h | 4 +-
src/libbiji/biji-note-book.c | 6 +++-
src/libbiji/biji-note-id.c | 7 +++++
src/libbiji/biji-note-id.h | 2 +
src/libbiji/biji-note-obj.c | 11 ++++---
src/libbiji/biji-tracker.c | 57 +++++++++++++++++++++++++++++++++--------
src/libbiji/biji-tracker.h | 17 ++++++++++++
12 files changed, 173 insertions(+), 61 deletions(-)
---
diff --git a/src/bjb-controller.c b/src/bjb-controller.c
index b56f0cb..adaf462 100644
--- a/src/bjb-controller.c
+++ b/src/bjb-controller.c
@@ -86,13 +86,13 @@ bjb_controller_init (BjbController *self)
/* Create the columns */
store = gtk_list_store_new (GD_MAIN_COLUMN_LAST,
- G_TYPE_STRING, // urn
- G_TYPE_STRING, // uri
- G_TYPE_STRING, // name
- G_TYPE_STRING, // author
- GDK_TYPE_PIXBUF, // icon then note
- G_TYPE_LONG, // mtime
- G_TYPE_BOOLEAN); // state
+ G_TYPE_STRING, // urn
+ G_TYPE_STRING, // uri
+ G_TYPE_STRING, // name
+ G_TYPE_STRING, // author
+ GDK_TYPE_PIXBUF, // icon then note
+ G_TYPE_INT64, // mtime
+ G_TYPE_BOOLEAN); // state
priv->model = GTK_TREE_MODEL(store) ;
priv->items_to_show = NULL;
@@ -277,7 +277,7 @@ bjb_controller_add_item (BjbController *self,
GD_MAIN_COLUMN_PRIMARY_TEXT, biji_item_get_title (item),
GD_MAIN_COLUMN_SECONDARY_TEXT, NULL,
GD_MAIN_COLUMN_ICON, pix,
- GD_MAIN_COLUMN_MTIME, biji_item_get_last_change (item),
+ GD_MAIN_COLUMN_MTIME, biji_item_get_mtime (item),
GD_MAIN_COLUMN_SELECTED, FALSE,
-1);
@@ -372,8 +372,8 @@ most_recent_item_first (gconstpointer a, gconstpointer b)
* two collections, use the most recent cookbook */
else
{
- result = biji_item_get_last_change (other)
- - biji_item_get_last_change (one);
+ result = biji_item_get_mtime (other)
+ - biji_item_get_mtime (one);
}
return result;
diff --git a/src/bjb-note-tag-dialog.c b/src/bjb-note-tag-dialog.c
index a0b184c..2978411 100644
--- a/src/bjb-note-tag-dialog.c
+++ b/src/bjb-note-tag-dialog.c
@@ -26,6 +26,7 @@
/* Model for tree view */
enum {
COL_SELECTION,
+ COL_URN,
COL_TAG_NAME,
N_COLUMNS
};
@@ -64,7 +65,8 @@ struct _BjbNoteTagDialogPrivate
// tmp when a new tag added
gchar *tag_to_scroll_to;
- // tmp for convenience, when a tag is toggled
+ // for convenience, when a tag is toggled
+ // stores the collection urn
gchar *toggled_collection;
};
@@ -74,7 +76,7 @@ struct _BjbNoteTagDialogPrivate
G_DEFINE_TYPE (BjbNoteTagDialog, bjb_note_tag_dialog, GTK_TYPE_DIALOG);
static void
-append_tag (gchar *tag, BjbNoteTagDialog *self)
+append_collection (BijiTrackerInfoSet *set, BjbNoteTagDialog *self)
{
BjbNoteTagDialogPrivate *priv = self->priv;
@@ -83,12 +85,12 @@ append_tag (gchar *tag, BjbNoteTagDialog *self)
GList *l;
gtk_list_store_append (priv->store, &iter);
- item_has_tag = biji_item_has_collection (priv->items->data, tag);
+ item_has_tag = biji_item_has_collection (priv->items->data, set->title);
/* Check if other notes have the same */
for (l = priv->items; l != NULL; l = l->next)
{
- if (biji_item_has_collection (l->data, tag) != item_has_tag)
+ if (biji_item_has_collection (l->data, set->title) != item_has_tag)
{
item_has_tag = SELECTION_INCONSISTENT;
break;
@@ -97,17 +99,22 @@ append_tag (gchar *tag, BjbNoteTagDialog *self)
gtk_list_store_set (priv->store, &iter,
COL_SELECTION, item_has_tag,
- COL_TAG_NAME , tag, -1);
+ COL_URN, set->urn,
+ COL_TAG_NAME , set->title, -1);
}
static gint
-bjb_compare_tag (gconstpointer a, gconstpointer b)
+bjb_compare_collection (gconstpointer a, gconstpointer b)
{
+
gchar *up_a, *up_b;
+ BijiTrackerInfoSet *set_a, *set_b;
gint retval;
+ set_a = (BijiTrackerInfoSet *) a;
+ set_b = (BijiTrackerInfoSet *) b;
- up_a = g_utf8_strup (a, -1);
- up_b = g_utf8_strup (b, -1);
+ up_a = g_utf8_strup (set_a->title, -1);
+ up_b = g_utf8_strup (set_b->title, -1);
retval = g_strcmp0 (up_a, up_b);
g_free (up_a);
@@ -159,18 +166,17 @@ bjb_note_tag_dialog_handle_tags (GObject *source_object,
{
BjbNoteTagDialog *self = BJB_NOTE_TAG_DIALOG (user_data);
BjbNoteTagDialogPrivate *priv = self->priv;
- GList *collections;
+ GList *tracker_info;
if (priv->collections)
g_hash_table_destroy (priv->collections);
priv->collections = biji_get_all_collections_finish (source_object, res);
- collections = g_hash_table_get_values (priv->collections);
- collections = g_list_sort (collections, bjb_compare_tag);
-
- g_list_foreach (collections, (GFunc) append_tag, self);
- g_list_free (collections);
+ tracker_info = g_hash_table_get_values (priv->collections);
+ tracker_info = g_list_sort (tracker_info, bjb_compare_collection);
+ g_list_foreach (tracker_info, (GFunc) append_collection, self);
+ g_list_free (tracker_info);
/* If a new tag was added, scroll & free */
if (priv->tag_to_scroll_to)
@@ -202,17 +208,18 @@ note_dialog_add_tag (gpointer iter, gpointer collection)
biji_item_add_collection (BIJI_ITEM (iter), (gchar*) collection, TRUE);
}
+
static void
note_dialog_remove_tag (gpointer iter, gpointer user_data)
{
BjbNoteTagDialog *self;
- gchar *urn;
+ BijiTrackerInfoSet *set;
self = user_data;
- urn = g_hash_table_lookup (self->priv->collections,
+ set = g_hash_table_lookup (self->priv->collections,
self->priv->toggled_collection);
- biji_item_remove_collection (BIJI_ITEM (iter), self->priv->toggled_collection, urn);
+ biji_item_remove_collection (BIJI_ITEM (iter), set->title, set->urn);
}
static void
@@ -232,7 +239,7 @@ on_tag_toggled (GtkCellRendererToggle *cell,
column = g_object_get_data (G_OBJECT (cell), "column");
gtk_tree_model_get_iter (model, &iter, path);
gtk_tree_model_get (model, &iter, column, &toggle_item, -1);
- gtk_tree_model_get (model, &iter,COL_TAG_NAME, &tag,-1);
+ gtk_tree_model_get (model, &iter, COL_URN, &tag, -1);
priv->toggled_collection = tag;
@@ -241,6 +248,7 @@ on_tag_toggled (GtkCellRendererToggle *cell,
g_list_foreach (priv->items, note_dialog_add_tag, tag);
toggle_item = SELECTION_TRUE;
}
+
else
{
g_list_foreach (priv->items, note_dialog_remove_tag, self);
@@ -321,7 +329,12 @@ add_columns (GtkTreeView *view, BjbNoteTagDialog *self)
NULL,
NULL);
- /* List column: tag */
+ /* URN */
+ column = gtk_tree_view_column_new ();
+ gtk_tree_view_append_column (view, column);
+
+
+ /* List column: collection title */
column = gtk_tree_view_column_new ();
gtk_tree_view_append_column (view, column);
@@ -353,7 +366,8 @@ bjb_note_tag_dialog_init (BjbNoteTagDialog *self)
G_CALLBACK (gtk_widget_destroy), self);
priv->store = gtk_list_store_new (N_COLUMNS,
- G_TYPE_INT, // tag active
+ G_TYPE_INT, // collection is active
+ G_TYPE_STRING, // collection urn
G_TYPE_STRING); // collection title
}
diff --git a/src/libbiji/biji-collection.c b/src/libbiji/biji-collection.c
index a85ee72..249765b 100644
--- a/src/libbiji/biji-collection.c
+++ b/src/libbiji/biji-collection.c
@@ -36,6 +36,7 @@ struct BijiCollectionPrivate_
gchar *urn;
gchar *name;
+ gchar *mtime;
GdkPixbuf *icon;
GdkPixbuf *emblem;
@@ -53,6 +54,7 @@ enum {
PROP_BOOK,
PROP_URN,
PROP_NAME,
+ PROP_MTIME,
BIJI_COLL_PROPERTIES
};
@@ -232,13 +234,22 @@ biji_collection_get_emblem (BijiItem *coll)
}
-/* TODO : use tracker to retrieve this at construct */
-static glong
-biji_collection_get_changed_sec (BijiItem *coll)
+/* Not the same as the prop, which is a string */
+static gint64
+biji_collection_get_mtime (BijiItem *coll)
{
- return 0;
-}
+ GTimeVal tv;
+ gint64 timestamp = 0;
+ BijiCollection *self;
+
+ g_return_val_if_fail (BIJI_IS_COLLECTION (coll), 0);
+ self = BIJI_COLLECTION (coll);
+ if (g_time_val_from_iso8601 (self->priv->mtime, &tv))
+ timestamp = tv.tv_sec;
+
+ return timestamp;
+}
static gboolean
biji_collection_trash (BijiItem *item)
@@ -300,6 +311,9 @@ biji_collection_set_property (GObject *object,
case PROP_NAME:
self->priv->name = g_strdup (g_value_get_string (value));
break;
+ case PROP_MTIME:
+ self->priv->mtime = g_strdup (g_value_get_string (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -326,6 +340,9 @@ biji_collection_get_property (GObject *object,
case PROP_NAME:
g_value_set_string (value, self->priv->name);
break;
+ case PROP_MTIME:
+ g_value_set_string (value, self->priv->mtime);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -433,6 +450,13 @@ biji_collection_class_init (BijiCollectionClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
+ properties[PROP_MTIME] =
+ g_param_spec_string ("mtime",
+ "Modification time",
+ "Last modified time",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
+
g_object_class_install_properties (g_object_class, BIJI_COLL_PROPERTIES, properties);
biji_collections_signals[COLLECTION_ICON_UPDATED] =
@@ -463,7 +487,7 @@ biji_collection_class_init (BijiCollectionClass *klass)
item_class->get_icon = biji_collection_get_icon;
item_class->get_emblem = biji_collection_get_emblem;
item_class->get_pristine = biji_collection_get_emblem;
- item_class->get_change_sec = biji_collection_get_changed_sec;
+ item_class->get_mtime = biji_collection_get_mtime;
item_class->trash = biji_collection_trash;
item_class->has_collection = biji_collection_has_collection;
item_class->add_collection = biji_collection_add_collection;
@@ -490,6 +514,8 @@ biji_collection_init (BijiCollection *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, BIJI_TYPE_COLLECTION, BijiCollectionPrivate);
+ self->priv->mtime = 0;
+
self->priv->icon = NULL;
self->priv->emblem = NULL;
@@ -498,11 +524,12 @@ biji_collection_init (BijiCollection *self)
BijiCollection *
-biji_collection_new (GObject *book, gchar *urn, gchar *name)
+biji_collection_new (GObject *book, gchar *urn, gchar *name, gchar *mtime)
{
return g_object_new (BIJI_TYPE_COLLECTION,
"book", book,
"name", name,
- "urn", urn,
+ "urn", urn,
+ "mtime", mtime,
NULL);
}
diff --git a/src/libbiji/biji-collection.h b/src/libbiji/biji-collection.h
index b0c65af..e227a63 100644
--- a/src/libbiji/biji-collection.h
+++ b/src/libbiji/biji-collection.h
@@ -52,7 +52,10 @@ struct BijiCollectionClass_
GType biji_collection_get_type (void);
-BijiCollection * biji_collection_new (GObject *book, gchar *urn, gchar *name);
+/* Exiting coll in tracker : provide urn & iso8601 date
+ * To create a brand new collection in tracker rather gobjectize existing one,
+ * see biji_create_new_collection_async */
+BijiCollection * biji_collection_new (GObject *book, gchar *urn, gchar *name, gchar *mtime);
G_END_DECLS
diff --git a/src/libbiji/biji-item.c b/src/libbiji/biji-item.c
index 3298680..ee5da43 100644
--- a/src/libbiji/biji-item.c
+++ b/src/libbiji/biji-item.c
@@ -87,10 +87,12 @@ biji_item_get_pristine (BijiItem *item)
return BIJI_ITEM_GET_CLASS (item)->get_pristine (item);
}
-glong
-biji_item_get_last_change (BijiItem *item)
+
+
+gint64
+biji_item_get_mtime (BijiItem *item)
{
- return BIJI_ITEM_GET_CLASS (item)->get_change_sec (item);
+ return BIJI_ITEM_GET_CLASS (item)->get_mtime (item);
}
gboolean
diff --git a/src/libbiji/biji-item.h b/src/libbiji/biji-item.h
index a81ee5d..39f7b91 100644
--- a/src/libbiji/biji-item.h
+++ b/src/libbiji/biji-item.h
@@ -62,7 +62,7 @@ struct BijiItemClass_
GdkPixbuf * (*get_icon) (BijiItem *item);
GdkPixbuf * (*get_emblem) (BijiItem *item);
GdkPixbuf * (*get_pristine) (BijiItem *item);
- glong (*get_change_sec) (BijiItem *item);
+ gint64 (*get_mtime) (BijiItem *item);
gboolean (*trash) (BijiItem *item);
gboolean (*has_collection) (BijiItem *item, gchar *coll);
gboolean (*add_collection) (BijiItem *item, gchar *coll, gboolean on_user_action);
@@ -94,7 +94,7 @@ GdkPixbuf * biji_item_get_emblem (BijiItem *item);
GdkPixbuf * biji_item_get_pristine (BijiItem *item);
-glong biji_item_get_last_change (BijiItem *item);
+gint64 biji_item_get_mtime (BijiItem *item);
gboolean biji_item_trash (BijiItem *item);
diff --git a/src/libbiji/biji-note-book.c b/src/libbiji/biji-note-book.c
index 7c451c9..b6688c7 100644
--- a/src/libbiji/biji-note-book.c
+++ b/src/libbiji/biji-note-book.c
@@ -245,13 +245,15 @@ create_collection_if_needed (gpointer key,
gpointer user_data)
{
BijiNoteBook *book = BIJI_NOTE_BOOK (user_data);
+ BijiTrackerInfoSet *set = value;
BijiCollection *collection;
collection = g_hash_table_lookup (book->priv->items, key);
if (!collection)
{
- collection = biji_collection_new (G_OBJECT (book), key, value);
+ collection = biji_collection_new (G_OBJECT (book), key, set->title, set->mtime);
+
g_hash_table_insert (book->priv->items,
g_strdup (key),
collection);
@@ -261,6 +263,8 @@ create_collection_if_needed (gpointer key,
g_signal_connect (collection , "icon-changed",
G_CALLBACK (book_on_item_icon_changed_cb), book);
}
+
+ /* InfoSet are freed per g_hash_table_destroy thanks to below caller */
}
static void
diff --git a/src/libbiji/biji-note-id.c b/src/libbiji/biji-note-id.c
index 2564304..cd2784a 100644
--- a/src/libbiji/biji-note-id.c
+++ b/src/libbiji/biji-note-id.c
@@ -214,6 +214,13 @@ biji_note_id_get_last_change_date_sec (BijiNoteID *n)
return n->priv->last_change_date.tv_sec ;
}
+
+gint64
+biji_note_id_get_mtime (BijiNoteID *n)
+{
+ return n->priv->last_change_date.tv_sec;
+}
+
gboolean
biji_note_id_set_last_change_date (BijiNoteID* n,gchar* date)
{
diff --git a/src/libbiji/biji-note-id.h b/src/libbiji/biji-note-id.h
index aa0d7ba..d20a557 100644
--- a/src/libbiji/biji-note-id.h
+++ b/src/libbiji/biji-note-id.h
@@ -65,6 +65,8 @@ gchar * biji_note_id_get_last_change_date (BijiNoteID* n);
glong biji_note_id_get_last_change_date_sec (BijiNoteID *n);
+gint64 biji_note_id_get_mtime (BijiNoteID *n);
+
gboolean biji_note_id_set_last_change_date (BijiNoteID* n,gchar* date);
void biji_note_id_set_last_change_date_now (BijiNoteID *n);
diff --git a/src/libbiji/biji-note-obj.c b/src/libbiji/biji-note-obj.c
index 1c21248..5cf339b 100644
--- a/src/libbiji/biji-note-obj.c
+++ b/src/libbiji/biji-note-obj.c
@@ -422,12 +422,13 @@ biji_note_obj_set_last_change_date (BijiNoteObj* n,gchar* date)
return biji_note_id_set_last_change_date (n->priv->id,date);
}
-static glong
-biji_note_obj_get_last_change_date_sec (BijiItem *item)
+
+static gint64
+biji_note_obj_get_mtime (BijiItem *note)
{
- BijiNoteObj *n = BIJI_NOTE_OBJ (item);
+ g_return_val_if_fail (BIJI_IS_NOTE_OBJ (note), 0);
- return biji_note_id_get_last_change_date_sec(note_get_id(n));
+ return biji_note_id_get_mtime (BIJI_NOTE_OBJ (note)->priv->id);
}
gchar *
@@ -1064,7 +1065,7 @@ biji_note_obj_class_init (BijiNoteObjClass *klass)
item_class->get_icon = biji_note_obj_get_icon;
item_class->get_emblem = biji_note_obj_get_emblem;
item_class->get_pristine = biji_note_obj_get_pristine;
- item_class->get_change_sec = biji_note_obj_get_last_change_date_sec;
+ item_class->get_mtime = biji_note_obj_get_mtime;
item_class->trash = biji_note_obj_trash;
item_class->has_collection = biji_note_obj_has_collection;
item_class->add_collection = biji_note_obj_add_collection;
diff --git a/src/libbiji/biji-tracker.c b/src/libbiji/biji-tracker.c
index 76b07f6..76ab386 100644
--- a/src/libbiji/biji-tracker.c
+++ b/src/libbiji/biji-tracker.c
@@ -58,6 +58,21 @@ biji_tracker_finisher_free (BijiTrackerFinisher *f)
g_free (f);
}
+static BijiTrackerInfoSet *
+biji_tracker_info_set_new ()
+{
+ return g_slice_new (BijiTrackerInfoSet);
+}
+
+static void
+biji_tracker_info_set_free (BijiTrackerInfoSet *set)
+{
+ g_free (set->urn);
+ g_free (set->title);
+
+ g_slice_free (BijiTrackerInfoSet, (gpointer) set);
+}
+
TrackerSparqlConnection *bjb_connection ;
static TrackerSparqlConnection *
@@ -148,10 +163,8 @@ get_note_url (BijiNoteObj *note)
return g_strdup_printf ("file://%s", biji_item_get_uuid (BIJI_ITEM (note)));
}
-/////////////// Tags
-/* This func only provides collections.
- * TODO : include number of notes / files */
+/* This func provides Collections, URN, mtime */
GHashTable *
biji_get_all_collections_finish (GObject *source_object,
GAsyncResult *res)
@@ -161,8 +174,8 @@ biji_get_all_collections_finish (GObject *source_object,
GError *error = NULL;
GHashTable *result = g_hash_table_new_full (g_str_hash,
g_str_equal,
- g_free,
- g_free);
+ NULL,
+ (GDestroyNotify) biji_tracker_info_set_free);
cursor = tracker_sparql_connection_query_finish (self,
res,
@@ -176,13 +189,16 @@ biji_get_all_collections_finish (GObject *source_object,
if (cursor)
{
- gchar *urn, *collection;
while (tracker_sparql_cursor_next (cursor, NULL, NULL))
{
- urn = g_strdup (tracker_sparql_cursor_get_string (cursor, 0, NULL));
- collection = g_strdup (tracker_sparql_cursor_get_string (cursor, 1, NULL));
- g_hash_table_replace (result, urn, collection);
+ BijiTrackerInfoSet *set = biji_tracker_info_set_new ();
+
+ set->urn = g_strdup (tracker_sparql_cursor_get_string (cursor, BIJI_URN_COL, NULL));
+ set->title = g_strdup (tracker_sparql_cursor_get_string (cursor, BIJI_TITLE_COL, NULL));
+ set->mtime = g_strdup (tracker_sparql_cursor_get_string (cursor, BIJI_MTIME_COL, NULL));
+
+ g_hash_table_replace (result, set->urn, set);
}
g_object_unref (cursor);
@@ -195,7 +211,13 @@ void
biji_get_all_collections_async (GAsyncReadyCallback f,
gpointer user_data)
{
- gchar *query = "SELECT ?c ?title WHERE { ?c a nfo:DataContainer ; nie:title ?title ; nie:generator
'Bijiben'}";
+ gchar *query = g_strconcat (
+ "SELECT ?c ?title ?mtime ",
+ "WHERE { ?c a nfo:DataContainer ;",
+ "nie:title ?title ; ",
+ "nie:contentLastModified ?mtime ;"
+ "nie:generator 'Bijiben'}",
+ NULL);
bjb_perform_query_async (query, f, user_data);
}
@@ -387,9 +409,22 @@ on_new_collection_query_executed (GObject *source_object, GAsyncResult *res, gpo
/* Update the note book */
if (urn)
{
+ gint64 timestamp;
+ GTimeVal tv;
+ gchar *time;
+
+ timestamp = g_get_real_time () / G_USEC_PER_SEC;
+ tv.tv_sec = timestamp;
+ tv.tv_usec = 0;
+ time = g_time_val_to_iso8601 (&tv);
+
BijiCollection *collection;
- collection = biji_collection_new (G_OBJECT (finisher->book), urn, finisher->str);
+ collection = biji_collection_new (
+ G_OBJECT (finisher->book),
+ urn,
+ finisher->str,
+ time);
biji_note_book_add_item (finisher->book, BIJI_ITEM (collection), TRUE);
}
diff --git a/src/libbiji/biji-tracker.h b/src/libbiji/biji-tracker.h
index 9425b92..19cf873 100644
--- a/src/libbiji/biji-tracker.h
+++ b/src/libbiji/biji-tracker.h
@@ -24,6 +24,23 @@
#include "libbiji.h"
+typedef enum
+{
+ BIJI_URN_COL,
+ BIJI_TITLE_COL,
+ BIJI_MTIME_COL,
+ BIJI_NO_COL
+} BijiTrackerColumns;
+
+
+typedef struct
+{
+ gchar *urn;
+ gchar *title;
+ gchar *mtime;
+
+} BijiTrackerInfoSet;
+
/* todo : find this on glib */
typedef void (*BijiFunc) (gpointer user_data);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]