[gupnp] white_list -> context_filter



commit 312fd2eac51349c5b1535bf93a48033d09a77d49
Author: Jens Georg <mail jensge org>
Date:   Mon Aug 10 23:56:50 2020 +0200

    white_list -> context_filter

 libgupnp/gupnp-context-filter.c  |  12 +--
 libgupnp/gupnp-context-manager.c | 174 ++++++++++++++++++++-------------------
 libgupnp/gupnp-context-manager.h |  10 +--
 libgupnp/gupnp.h                 |  13 +--
 libgupnp/meson.build             |   2 +
 tests/test-white-list.c          |  57 +++++++------
 6 files changed, 139 insertions(+), 129 deletions(-)
---
diff --git a/libgupnp/gupnp-context-filter.c b/libgupnp/gupnp-context-filter.c
index d23e67d..c3debac 100644
--- a/libgupnp/gupnp-context-filter.c
+++ b/libgupnp/gupnp-context-filter.c
@@ -20,7 +20,7 @@
  */
 
 /**
- * SECTION:gupnp-white-list
+ * SECTION:gupnp-context-filter
  * @short_description: Class for network filtering.
  *
  * #GUPnPContextFilter handles network filtering. It provides API to manage a
@@ -31,9 +31,9 @@
  * Since: 0.20.5
  */
 
-#include <string.h>
+#include "gupnp-context-filter.h"
 
-#include "gupnp-white-list.h"
+#include <string.h>
 
 struct _GUPnPContextFilterPrivate {
         gboolean enabled;
@@ -151,7 +151,7 @@ gupnp_context_filter_class_init (GUPnPContextFilterClass *klass)
         /**
          * GUPnPContextFilter:enabled:
          *
-         * Whether this white list is active or not.
+         * Whether this context filter is active or not.
          *
          * Since: 0.20.5
          **/
@@ -160,7 +160,7 @@ gupnp_context_filter_class_init (GUPnPContextFilterClass *klass)
                 PROP_ENABLED,
                 g_param_spec_boolean ("enabled",
                                       "Enabled",
-                                      "TRUE if the white list is active.",
+                                      "TRUE if the context filter is active.",
                                       FALSE,
                                       G_PARAM_CONSTRUCT | G_PARAM_READWRITE |
                                               G_PARAM_STATIC_STRINGS));
@@ -394,7 +394,7 @@ gupnp_context_filter_get_entries (GUPnPContextFilter *context_filter)
  *
  * Remove all entries from #GList that compose the white list.
  * The list is now empty. Even if #GUPnPContextFilter is enabled, it will have
- *the same behavior as if it was disabled.
+ * the same behavior as if it was disabled.
  *
  * Since: 0.20.5
  **/
diff --git a/libgupnp/gupnp-context-manager.c b/libgupnp/gupnp-context-manager.c
index c6e34a0..4f78bf4 100644
--- a/libgupnp/gupnp-context-manager.c
+++ b/libgupnp/gupnp-context-manager.c
@@ -72,9 +72,9 @@ struct _GUPnPContextManagerPrivate {
         GUPnPContextManager *impl;
 
         GList *objects; /* control points and root devices */
-        GList *blacklisted; /* Blacklisted Context */
+        GList *filtered; /* Filtered contexts */
 
-        GUPnPWhiteList *white_list;
+        GUPnPContextFilter *context_filter;
 };
 typedef struct _GUPnPContextManagerPrivate GUPnPContextManagerPrivate;
 
@@ -82,12 +82,13 @@ G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GUPnPContextManager,
                                      gupnp_context_manager,
                                      G_TYPE_OBJECT);
 
-enum {
+enum
+{
         PROP_0,
         PROP_PORT,
         PROP_SOCKET_FAMILY,
         PROP_UDA_VERSION,
-        PROP_WHITE_LIST
+        PROP_CONTEXT_FILTER
 };
 
 enum {
@@ -118,19 +119,19 @@ on_context_available (GUPnPContextManager    *manager,
                       GUPnPContext           *context,
                       G_GNUC_UNUSED gpointer *user_data)
 {
-        GUPnPWhiteList *white_list;
+        GUPnPContextFilter *context_filter;
         GUPnPContextManagerPrivate *priv;
         gboolean enabled = TRUE;
 
         priv = gupnp_context_manager_get_instance_private (manager);
 
-        white_list = priv->white_list;
+        context_filter = priv->context_filter;
 
         /* Try to catch the notification, only if the white list
          * is enabled, not empty and the context doesn't match */
-        if (!gupnp_white_list_is_empty (white_list) &&
-            gupnp_white_list_get_enabled (white_list) &&
-            !gupnp_white_list_check_context (white_list, context)) {
+        if (!gupnp_context_filter_is_empty (context_filter) &&
+            gupnp_context_filter_get_enabled (context_filter) &&
+            !gupnp_context_filter_check_context (context_filter, context)) {
                 /* If the conext doesn't match, block the notification
                  * and disable the context */
                 g_signal_stop_emission_by_name (manager, "context-available");
@@ -140,8 +141,8 @@ on_context_available (GUPnPContextManager    *manager,
                 enabled = FALSE;
 
                 /* Save it in case we need to re-enable it */
-                priv->blacklisted = g_list_prepend (priv->blacklisted,
-                                                    g_object_ref (context));
+                priv->filtered =
+                        g_list_prepend (priv->filtered, g_object_ref (context));
         }
 
         /* Ignore the boot-id handling for UDA 1.0 */
@@ -176,7 +177,7 @@ on_context_unavailable (GUPnPContextManager    *manager,
                         G_GNUC_UNUSED gpointer *user_data)
 {
         GList *l;
-        GList *black;
+        GList *filtered_context;
         GUPnPContextManagerPrivate *priv;
 
         priv = gupnp_context_manager_get_instance_private (manager);
@@ -217,14 +218,14 @@ on_context_unavailable (GUPnPContextManager    *manager,
                 }
         }
 
-        black = g_list_find (priv->blacklisted, context);
+        filtered_context = g_list_find (priv->filtered, context);
 
-        if (black != NULL) {
+        if (filtered_context != NULL) {
                 g_signal_stop_emission_by_name (manager, "context-unavailable");
 
-                g_object_unref (black->data);
-                priv->blacklisted = g_list_delete_link (priv->blacklisted,
-                                                        black);
+                g_object_unref (filtered_context->data);
+                priv->filtered =
+                        g_list_delete_link (priv->filtered, filtered_context);
         } else {
                 /* When UDA 1.0, ignore boot-id handling */
                 if (priv->uda_version > GSSDP_UDA_VERSION_1_0) {
@@ -250,20 +251,20 @@ on_context_unavailable (GUPnPContextManager    *manager,
 }
 
 static void
-gupnp_context_manager_filter_context (GUPnPWhiteList *white_list,
+gupnp_context_manager_filter_context (GUPnPContextFilter *context_filter,
                                       GUPnPContextManager *manager,
                                       gboolean check)
 {
         GList *next;
         GList *obj;
-        GList *blk;
+        GList *iter;
         gboolean match;
         GUPnPContextManagerPrivate *priv;
 
         priv = gupnp_context_manager_get_instance_private (manager);
 
         obj = priv->objects;
-        blk = priv->blacklisted;
+        iter = priv->filtered;
 
         while (obj != NULL) {
                 /* If the white list is empty, treat it as disabled */
@@ -279,8 +280,9 @@ gupnp_context_manager_filter_context (GUPnPWhiteList *white_list,
                                       property, &context,
                                       NULL);
 
-                        match = gupnp_white_list_check_context (white_list,
-                                                                context);
+                        match = gupnp_context_filter_check_context (
+                                context_filter,
+                                context);
                 } else {
                         /* Re-activate all context, if needed */
                         match = TRUE;
@@ -302,65 +304,67 @@ gupnp_context_manager_filter_context (GUPnPWhiteList *white_list,
                 obj = obj->next;
         }
 
-        while (blk != NULL) {
+        while (iter != NULL) {
                 /* If the white list is empty, treat it as disabled */
                 if (check)
                         /* Filter out context */
-                        match = gupnp_white_list_check_context (white_list,
-                                                                blk->data);
+                        match = gupnp_context_filter_check_context (
+                                context_filter,
+                                iter->data);
                 else
                         /* Re-activate all context, if needed */
                         match = TRUE;
 
                 if (!match) {
-                        blk = blk->next;
+                        iter = iter->next;
                         continue;
                 }
 
-                next = blk->next;
-                g_object_set (blk->data, "active", TRUE, NULL);
+                next = iter->next;
+                g_object_set (iter->data, "active", TRUE, NULL);
 
-                g_signal_emit_by_name (manager, "context-available", blk->data);
+                g_signal_emit_by_name (manager,
+                                       "context-available",
+                                       iter->data);
 
-                g_object_unref (blk->data);
-                priv->blacklisted = g_list_delete_link (priv->blacklisted,
-                                                        blk);
-                blk = next;
+                g_object_unref (iter->data);
+                priv->filtered = g_list_delete_link (priv->filtered, iter);
+                iter = next;
         }
 }
 
 static void
-on_white_list_change_cb (GUPnPWhiteList *white_list,
-                         GParamSpec *pspec,
-                         gpointer user_data)
+on_context_filter_change_cb (GUPnPContextFilter *context_filter,
+                             GParamSpec *pspec,
+                             gpointer user_data)
 {
         GUPnPContextManager *manager = GUPNP_CONTEXT_MANAGER (user_data);
         gboolean enabled;
         gboolean is_empty;
 
-        enabled = gupnp_white_list_get_enabled (white_list);
-        is_empty = gupnp_white_list_is_empty (white_list);
+        enabled = gupnp_context_filter_get_enabled (context_filter);
+        is_empty = gupnp_context_filter_is_empty (context_filter);
 
         if (enabled)
-                gupnp_context_manager_filter_context (white_list,
+                gupnp_context_manager_filter_context (context_filter,
                                                       manager,
                                                       !is_empty);
 }
 
 static void
-on_white_list_enabled_cb (GUPnPWhiteList *white_list,
-                          GParamSpec *pspec,
-                          gpointer user_data)
+on_context_filter_enabled_cb (GUPnPContextFilter *context_filter,
+                              GParamSpec *pspec,
+                              gpointer user_data)
 {
         GUPnPContextManager *manager = GUPNP_CONTEXT_MANAGER (user_data);
         gboolean enabled;
         gboolean is_empty;
 
-        enabled = gupnp_white_list_get_enabled (white_list);
-        is_empty = gupnp_white_list_is_empty (white_list);
+        enabled = gupnp_context_filter_get_enabled (context_filter);
+        is_empty = gupnp_context_filter_is_empty (context_filter);
 
         if (!is_empty)
-                gupnp_context_manager_filter_context (white_list,
+                gupnp_context_manager_filter_context (context_filter,
                                                       manager,
                                                       enabled);
 }
@@ -372,13 +376,17 @@ gupnp_context_manager_init (GUPnPContextManager *manager)
 
         priv = gupnp_context_manager_get_instance_private (manager);
 
-        priv->white_list = gupnp_white_list_new ();
+        priv->context_filter = gupnp_context_filter_new ();
 
-        g_signal_connect_after (priv->white_list, "notify::entries",
-                                G_CALLBACK (on_white_list_change_cb), manager);
+        g_signal_connect_after (priv->context_filter,
+                                "notify::entries",
+                                G_CALLBACK (on_context_filter_change_cb),
+                                manager);
 
-        g_signal_connect_after (priv->white_list, "notify::enabled",
-                                G_CALLBACK (on_white_list_enabled_cb), manager);
+        g_signal_connect_after (priv->context_filter,
+                                "notify::enabled",
+                                G_CALLBACK (on_context_filter_enabled_cb),
+                                manager);
         priv->boot_id = time(NULL);
 }
 
@@ -432,8 +440,8 @@ gupnp_context_manager_get_property (GObject    *object,
         case PROP_UDA_VERSION:
                 g_value_set_enum (value, priv->uda_version);
                 break;
-        case PROP_WHITE_LIST:
-                g_value_set_object (value, priv->white_list);
+        case PROP_CONTEXT_FILTER:
+                g_value_set_object (value, priv->context_filter);
                 break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -445,32 +453,29 @@ static void
 gupnp_context_manager_dispose (GObject *object)
 {
         GUPnPContextManager *manager;
-        GUPnPWhiteList *wl;
+        GUPnPContextFilter *filter;
         GObjectClass *object_class;
         GUPnPContextManagerPrivate *priv;
 
         manager = GUPNP_CONTEXT_MANAGER (object);
         priv = gupnp_context_manager_get_instance_private (manager);
 
-        wl = priv->white_list;
+        filter = priv->context_filter;
 
-        g_signal_handlers_disconnect_by_func (wl,
-                                              on_white_list_enabled_cb,
+        g_signal_handlers_disconnect_by_func (filter,
+                                              on_context_filter_enabled_cb,
                                               manager);
 
-        g_signal_handlers_disconnect_by_func (wl,
-                                              on_white_list_change_cb,
+        g_signal_handlers_disconnect_by_func (filter,
+                                              on_context_filter_change_cb,
                                               NULL);
 
         g_list_free_full (priv->objects, g_object_unref);
         priv->objects = NULL;
-        g_list_free_full (priv->blacklisted, g_object_unref);
-        priv->blacklisted = NULL;
+        g_list_free_full (priv->filtered, g_object_unref);
+        priv->filtered = NULL;
 
-        if (wl) {
-                g_object_unref (wl);
-                priv->white_list = NULL;
-        }
+        g_clear_object (&filter);
 
         /* Call super */
         object_class = G_OBJECT_CLASS (gupnp_context_manager_parent_class);
@@ -547,24 +552,23 @@ gupnp_context_manager_class_init (GUPnPContextManagerClass *klass)
                                     G_PARAM_CONSTRUCT_ONLY |
                                     G_PARAM_STATIC_STRINGS));
 
-         /**
-         * GUPnPContextManager:white-list:
+        /**
+         * GUPnPContextManager:context-filter:
          *
          * The white list to use.
          **/
-        g_object_class_install_property
-                (object_class,
-                 PROP_WHITE_LIST,
-                 g_param_spec_object ("white-list",
-                                      "White List",
-                                      "The white list to use",
-                                      GUPNP_TYPE_WHITE_LIST,
-                                      G_PARAM_READABLE |
-                                      G_PARAM_STATIC_NAME |
-                                      G_PARAM_STATIC_NICK |
-                                      G_PARAM_STATIC_BLURB));
-
-       /**
+        g_object_class_install_property (
+                object_class,
+                PROP_CONTEXT_FILTER,
+                g_param_spec_object ("context-filter",
+                                     "Context Filter",
+                                     "The Context Filter to use",
+                                     GUPNP_TYPE_CONTEXT_FILTER,
+                                     G_PARAM_READABLE | G_PARAM_STATIC_NAME |
+                                             G_PARAM_STATIC_NICK |
+                                             G_PARAM_STATIC_BLURB));
+
+        /**
          * GUPnPContextManager::context-available:
          * @context_manager: The #GUPnPContextManager that received the signal
          * @context: The now available #GUPnPContext
@@ -814,16 +818,16 @@ gupnp_context_manager_get_port (GUPnPContextManager *manager)
 }
 
 /**
- * gupnp_context_manager_get_white_list:
+ * gupnp_context_manager_get_context_filter:
  * @manager: A #GUPnPContextManager
  *
- * Get the #GUPnPWhiteList associated with @manager.
+ * Get the #GUPnPContextFilter associated with @manager.
  *
- * Returns: (transfer none):  The #GUPnPWhiteList asssociated with this
+ * Returns: (transfer none):  The #GUPnPContextFilter asssociated with this
  * context manager.
  */
-GUPnPWhiteList *
-gupnp_context_manager_get_white_list (GUPnPContextManager *manager)
+GUPnPContextFilter *
+gupnp_context_manager_get_context_filter (GUPnPContextManager *manager)
 {
         GUPnPContextManagerPrivate *priv;
 
@@ -831,7 +835,7 @@ gupnp_context_manager_get_white_list (GUPnPContextManager *manager)
 
         priv = gupnp_context_manager_get_instance_private (manager);
 
-        return priv->white_list;
+        return priv->context_filter;
 }
 
 /**
diff --git a/libgupnp/gupnp-context-manager.h b/libgupnp/gupnp-context-manager.h
index 9c39715..a4860ce 100644
--- a/libgupnp/gupnp-context-manager.h
+++ b/libgupnp/gupnp-context-manager.h
@@ -24,11 +24,11 @@
 #ifndef GUPNP_CONTEXT_MANAGER_H
 #define GUPNP_CONTEXT_MANAGER_H
 
-#include <glib.h>
+#include "gupnp-context-filter.h"
 #include "gupnp-context.h"
-#include "gupnp-root-device.h"
 #include "gupnp-control-point.h"
-#include "gupnp-white-list.h"
+#include "gupnp-root-device.h"
+#include <glib.h>
 
 G_BEGIN_DECLS
 
@@ -76,8 +76,8 @@ gupnp_context_manager_manage_root_device
 guint
 gupnp_context_manager_get_port          (GUPnPContextManager *manager);
 
-GUPnPWhiteList *
-gupnp_context_manager_get_white_list    (GUPnPContextManager *manager);
+GUPnPContextFilter *
+gupnp_context_manager_get_context_filter (GUPnPContextManager *manager);
 
 GSocketFamily
 gupnp_context_manager_get_socket_family (GUPnPContextManager *manager);
diff --git a/libgupnp/gupnp.h b/libgupnp/gupnp.h
index 606cc03..bc23c1e 100644
--- a/libgupnp/gupnp.h
+++ b/libgupnp/gupnp.h
@@ -20,20 +20,21 @@
  */
 
 #include <libgupnp/gupnp-acl.h>
-#include <libgupnp/gupnp-context.h>
+#include <libgupnp/gupnp-context-filter.h>
 #include <libgupnp/gupnp-context-manager.h>
+#include <libgupnp/gupnp-context.h>
 #include <libgupnp/gupnp-control-point.h>
-#include <libgupnp/gupnp-error.h>
-#include <libgupnp/gupnp-device.h>
 #include <libgupnp/gupnp-device-info.h>
 #include <libgupnp/gupnp-device-proxy.h>
+#include <libgupnp/gupnp-device.h>
+#include <libgupnp/gupnp-error.h>
 #include <libgupnp/gupnp-resource-factory.h>
 #include <libgupnp/gupnp-root-device.h>
-#include <libgupnp/gupnp-service.h>
 #include <libgupnp/gupnp-service-info.h>
 #include <libgupnp/gupnp-service-introspection.h>
 #include <libgupnp/gupnp-service-proxy.h>
-#include <libgupnp/gupnp-white-list.h>
-#include <libgupnp/gupnp-xml-doc.h>
+#include <libgupnp/gupnp-service.h>
 #include <libgupnp/gupnp-types.h>
 #include <libgupnp/gupnp-uuid.h>
+#include <libgupnp/gupnp-white-list.h>
+#include <libgupnp/gupnp-xml-doc.h>
diff --git a/libgupnp/meson.build b/libgupnp/meson.build
index fb0f77d..b783f9d 100644
--- a/libgupnp/meson.build
+++ b/libgupnp/meson.build
@@ -61,6 +61,7 @@ headers = files(
     'gupnp-types.h',
     'gupnp-uuid.h',
     'gupnp-white-list.h',
+    'gupnp-context-filter.h',
     'gupnp-xml-doc.h'
 )
 install_headers(headers, subdir : 'gupnp-1.2/libgupnp')
@@ -84,6 +85,7 @@ sources = files(
     'gupnp-simple-context-manager.c',
     'gupnp-types.c',
     'gupnp-white-list.c',
+    'gupnp-context-filter.c',
     'gupnp-xml-doc.c',
     'gvalue-util.c',
     'http-headers.c',
diff --git a/tests/test-white-list.c b/tests/test-white-list.c
index 037ca1c..185120a 100644
--- a/tests/test-white-list.c
+++ b/tests/test-white-list.c
@@ -154,84 +154,87 @@ print_wl_entry(gpointer data, gpointer user_data)
 }
 
 static void
-print_white_list_entries(GUPnPWhiteList *wl)
+print_context_filter_entries (GUPnPContextFilter *wl)
 {
         GList *list;
 
         g_print ("\t\tWhite List Entries:\n");
-        list = gupnp_white_list_get_entries(wl);
+        list = gupnp_context_filter_get_entries (wl);
         g_list_foreach (list, print_wl_entry, NULL);
         g_print ("\n");
 }
 
 static gboolean
-change_white_list(gpointer user_data)
+change_context_filter (gpointer user_data)
 {
         GUPnPContextManager *context_manager = user_data;
-        GUPnPWhiteList *white_list;
+        GUPnPContextFilter *context_filter;
         static int tomato = 0;
 
         g_print ("\nChange White List:\n");
         g_print ("\t Action number %d:\n", tomato);
 
-        white_list = gupnp_context_manager_get_white_list(context_manager);
+        context_filter =
+                gupnp_context_manager_get_context_filter (context_manager);
 
         switch (tomato) {
         case 0:
                 g_print ("\t Add Entry eth0\n\n");
-                gupnp_white_list_add_entry(white_list, "eth0");
-                print_white_list_entries (white_list);
+                gupnp_context_filter_add_entry (context_filter, "eth0");
+                print_context_filter_entries (context_filter);
                 break;
         case 1:
                 g_print ("\t Enable WL\n\n");
-                gupnp_white_list_set_enabled (white_list, TRUE);
+                gupnp_context_filter_set_enabled (context_filter, TRUE);
                 break;
         case 2:
                 g_print ("\t Add Entry 127.0.0.1\n\n");
-                gupnp_white_list_add_entry(white_list, "127.0.0.1");
-                print_white_list_entries (white_list);
+                gupnp_context_filter_add_entry (context_filter, "127.0.0.1");
+                print_context_filter_entries (context_filter);
                 break;
         case 3:
                 g_print ("\t Add Entry eth5\n\n");
-                gupnp_white_list_add_entry(white_list, "eth5");
-                print_white_list_entries (white_list);
+                gupnp_context_filter_add_entry (context_filter, "eth5");
+                print_context_filter_entries (context_filter);
                 break;
         case 4:
                 g_print ("\t Remove Entry eth5\n\n");
-                gupnp_white_list_remove_entry(white_list, "eth5");
-                print_white_list_entries (white_list);
+                gupnp_context_filter_remove_entry (context_filter, "eth5");
+                print_context_filter_entries (context_filter);
                 break;
         case 5:
                 g_print ("\t Clear all entries\n\n");
-                gupnp_white_list_clear(white_list);
-                print_white_list_entries (white_list);
+                gupnp_context_filter_clear (context_filter);
+                print_context_filter_entries (context_filter);
                 break;
         case 6:
                 g_print ("\t Add Entry wlan2\n\n");
-                gupnp_white_list_add_entry(white_list, "wlan2");
-                print_white_list_entries(white_list);
+                gupnp_context_filter_add_entry (context_filter, "wlan2");
+                print_context_filter_entries (context_filter);
                 break;
         case 7:
                 g_print ("\t Disable WL\n\n");
-                gupnp_white_list_set_enabled (white_list, FALSE);
+                gupnp_context_filter_set_enabled (context_filter, FALSE);
                 break;
         case 8:
                 g_print ("\t Enable WL\n\n");
-                gupnp_white_list_set_enabled (white_list, TRUE);
+                gupnp_context_filter_set_enabled (context_filter, TRUE);
                 break;
         case 9:
                 g_print ("\t Connect to wlan0\n\n");
-                g_timeout_add_seconds (35, change_white_list, context_manager);
+                g_timeout_add_seconds (35,
+                                       change_context_filter,
+                                       context_manager);
                 break;
         case 10:
                 g_print ("\t Add Entry wlan0\n\n");
-                gupnp_white_list_add_entry(white_list, "wlan0");
-                print_white_list_entries (white_list);
+                gupnp_context_filter_add_entry (context_filter, "wlan0");
+                print_context_filter_entries (context_filter);
                 break;
         //~ case 11:
-                //~ g_print ("\t Enable WL\n");
-                //~ gupnp_white_list_enable(white_list, FALSE);
-                //~ break;
+        //~ g_print ("\t Enable WL\n");
+        //~ gupnp_context_filter_enable(context_filter, FALSE);
+        //~ break;
         default:
                 break;
         }
@@ -266,7 +269,7 @@ main (G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv)
 
         main_loop = g_main_loop_new (NULL, FALSE);
 
-        id = g_timeout_add_seconds (5, change_white_list, cm);
+        id = g_timeout_add_seconds (5, change_context_filter, cm);
 
 #ifndef G_OS_WIN32
         /* Hook the handler for SIGTERM */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]