[network-manager-pptp/th/vpn-editor-split-bgo766623: 17/21] properties: split "nm-pptp-editor-plugin.c" out of "nm-pptp.c"
- From: Thomas Haller <thaller src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [network-manager-pptp/th/vpn-editor-split-bgo766623: 17/21] properties: split "nm-pptp-editor-plugin.c" out of "nm-pptp.c"
- Date: Wed, 18 May 2016 19:05:33 +0000 (UTC)
commit 2d54ebba832638b91fa4828a3208145049a719c3
Author: Thomas Haller <thaller redhat com>
Date: Wed May 18 18:56:48 2016 +0200
properties: split "nm-pptp-editor-plugin.c" out of "nm-pptp.c"
po/POTFILES.in | 1 +
properties/Makefile.am | 22 +++--
properties/nm-pptp-editor-plugin.c | 205 ++++++++++++++++++++++++++++++++++++
properties/nm-pptp-editor-plugin.h | 45 ++++++++
properties/nm-pptp.c | 200 ++---------------------------------
properties/nm-pptp.h | 25 +----
6 files changed, 277 insertions(+), 221 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index e6f0f6f..9e5f428 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -3,6 +3,7 @@
appdata/network-manager-pptp.metainfo.xml.in
auth-dialog/main.c
properties/advanced-dialog.c
+properties/nm-pptp-editor-plugin.c
properties/nm-pptp.c
shared/nm-utils/nm-shared-utils.c
shared/nm-vpn/nm-vpn-plugin-utils.c
diff --git a/properties/Makefile.am b/properties/Makefile.am
index e610d6b..4ae94dd 100644
--- a/properties/Makefile.am
+++ b/properties/Makefile.am
@@ -7,13 +7,17 @@ endif
AM_CPPFLAGS = -I${top_srcdir}
plugin_sources = \
- nm-pptp.c \
- nm-pptp.h \
- advanced-dialog.c \
- advanced-dialog.h \
+ nm-pptp-editor-plugin.c \
+ nm-pptp-editor-plugin.h \
import-export.c \
import-export.h
+editor_sources = \
+ advanced-dialog.c \
+ advanced-dialog.h \
+ nm-pptp.c \
+ nm-pptp.h
+
uidir = $(datadir)/gnome-vpn-properties/pptp
ui_DATA = nm-pptp-dialog.ui
@@ -28,7 +32,8 @@ common_CFLAGS = \
###############################################################################
libnm_vpn_plugin_pptp_la_SOURCES = \
- $(plugin_sources)
+ $(plugin_sources) \
+ $(editor_sources)
libnm_vpn_plugin_pptp_la_CFLAGS = \
-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_LIB \
@@ -48,7 +53,8 @@ libnm_vpn_plugin_pptp_la_LDFLAGS = \
###############################################################################
libnm_pptp_properties_la_SOURCES = \
- $(plugin_sources)
+ $(plugin_sources) \
+ $(editor_sources)
libnm_pptp_properties_la_CFLAGS = \
-DNM_VPN_OLD \
@@ -71,6 +77,6 @@ libnm_pptp_properties_la_LDFLAGS = \
CLEANFILES = *.bak *~
EXTRA_DIST = \
- $(ui_DATA) \
libnm-pptp-properties.ver \
- libnm-vpn-plugin-pptp.ver
+ libnm-vpn-plugin-pptp.ver \
+ nm-pptp-dialog.ui
diff --git a/properties/nm-pptp-editor-plugin.c b/properties/nm-pptp-editor-plugin.c
new file mode 100644
index 0000000..8f39a44
--- /dev/null
+++ b/properties/nm-pptp-editor-plugin.c
@@ -0,0 +1,205 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/***************************************************************************
+ *
+ * Copyright (C) 2008 Dan Williams, <dcbw redhat com>
+ * Copyright (C) 2008 - 2011 Red Hat, Inc.
+ * Based on work by David Zeuthen, <davidz redhat com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ **************************************************************************/
+
+#include "nm-default.h"
+
+#include "nm-pptp-editor-plugin.h"
+
+#include "nm-pptp.h"
+#include "import-export.h"
+
+#define PPTP_PLUGIN_NAME _("Point-to-Point Tunneling Protocol (PPTP)")
+#define PPTP_PLUGIN_DESC _("Compatible with Microsoft and other PPTP VPN servers.")
+
+/*****************************************************************************/
+
+static void pptp_plugin_ui_interface_init (NMVpnEditorPluginInterface *iface_class);
+
+G_DEFINE_TYPE_EXTENDED (PptpPluginUi, pptp_plugin_ui, G_TYPE_OBJECT, 0,
+ G_IMPLEMENT_INTERFACE (NM_TYPE_VPN_EDITOR_PLUGIN,
+ pptp_plugin_ui_interface_init))
+
+enum {
+ PROP_0,
+ PROP_NAME,
+ PROP_DESC,
+ PROP_SERVICE,
+
+ LAST_PROP
+};
+
+/*****************************************************************************/
+
+static NMConnection *
+import (NMVpnEditorPlugin *iface, const char *path, GError **error)
+{
+ NMConnection *connection = NULL;
+ char *contents = NULL;
+ char **lines = NULL;
+ char *ext;
+
+ ext = strrchr (path, '.');
+ if (!ext) {
+ g_set_error (error,
+ NMV_EDITOR_PLUGIN_ERROR,
+ NMV_EDITOR_PLUGIN_ERROR_FILE_NOT_VPN,
+ "unknown PPTP file extension");
+ goto out;
+ }
+
+ if (strcmp (ext, ".conf") && strcmp (ext, ".cnf")) {
+ g_set_error (error,
+ NMV_EDITOR_PLUGIN_ERROR,
+ NMV_EDITOR_PLUGIN_ERROR_FILE_NOT_VPN,
+ "unknown PPTP file extension");
+ goto out;
+ }
+
+ if (!g_file_get_contents (path, &contents, NULL, error))
+ return NULL;
+
+ lines = g_strsplit_set (contents, "\r\n", 0);
+ if (g_strv_length (lines) <= 1) {
+ g_set_error (error,
+ NMV_EDITOR_PLUGIN_ERROR,
+ NMV_EDITOR_PLUGIN_ERROR_FILE_NOT_READABLE,
+ "not a valid PPTP configuration file");
+ goto out;
+ }
+
+ connection = do_import (path, lines, error);
+
+out:
+ if (lines)
+ g_strfreev (lines);
+ g_free (contents);
+ return connection;
+}
+
+static gboolean
+export (NMVpnEditorPlugin *iface,
+ const char *path,
+ NMConnection *connection,
+ GError **error)
+{
+ return do_export (path, connection, error);
+}
+
+static char *
+get_suggested_filename (NMVpnEditorPlugin *iface, NMConnection *connection)
+{
+ NMSettingConnection *s_con;
+ const char *id;
+
+ g_return_val_if_fail (connection != NULL, NULL);
+
+ s_con = nm_connection_get_setting_connection (connection);
+ g_return_val_if_fail (s_con != NULL, NULL);
+
+ id = nm_setting_connection_get_id (s_con);
+ g_return_val_if_fail (id != NULL, NULL);
+
+ return g_strdup_printf ("%s (pptp).conf", id);
+}
+
+static NMVpnEditorPluginCapability
+get_capabilities (NMVpnEditorPlugin *iface)
+{
+ return NM_VPN_EDITOR_PLUGIN_CAPABILITY_NONE;
+}
+
+static NMVpnEditor *
+get_editor (NMVpnEditorPlugin *iface, NMConnection *connection, GError **error)
+{
+ return nm_vpn_plugin_ui_widget_interface_new (connection, error);
+}
+
+static void
+get_property (GObject *object, guint prop_id,
+ GValue *value, GParamSpec *pspec)
+{
+ switch (prop_id) {
+ case PROP_NAME:
+ g_value_set_string (value, PPTP_PLUGIN_NAME);
+ break;
+ case PROP_DESC:
+ g_value_set_string (value, PPTP_PLUGIN_DESC);
+ break;
+ case PROP_SERVICE:
+ g_value_set_string (value, NM_DBUS_SERVICE_PPTP);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+pptp_plugin_ui_class_init (PptpPluginUiClass *req_class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (req_class);
+
+ object_class->get_property = get_property;
+
+ g_object_class_override_property (object_class,
+ PROP_NAME,
+ NM_VPN_EDITOR_PLUGIN_NAME);
+
+ g_object_class_override_property (object_class,
+ PROP_DESC,
+ NM_VPN_EDITOR_PLUGIN_DESCRIPTION);
+
+ g_object_class_override_property (object_class,
+ PROP_SERVICE,
+ NM_VPN_EDITOR_PLUGIN_SERVICE);
+}
+
+static void
+pptp_plugin_ui_init (PptpPluginUi *plugin)
+{
+}
+
+static void
+pptp_plugin_ui_interface_init (NMVpnEditorPluginInterface *iface_class)
+{
+ iface_class->get_editor = get_editor;
+ iface_class->get_capabilities = get_capabilities;
+ iface_class->import_from_file = import;
+ iface_class->export_to_file = export;
+ iface_class->get_suggested_filename = get_suggested_filename;
+}
+
+/*****************************************************************************/
+
+G_MODULE_EXPORT NMVpnEditorPlugin *
+nm_vpn_editor_plugin_factory (GError **error)
+{
+ if (error)
+ g_return_val_if_fail (*error == NULL, NULL);
+
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+
+ return NM_VPN_EDITOR_PLUGIN (g_object_new (PPTP_TYPE_PLUGIN_UI, NULL));
+}
+
diff --git a/properties/nm-pptp-editor-plugin.h b/properties/nm-pptp-editor-plugin.h
new file mode 100644
index 0000000..6587c03
--- /dev/null
+++ b/properties/nm-pptp-editor-plugin.h
@@ -0,0 +1,45 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/***************************************************************************
+ * Copyright (C) 2008 Dan Williams, <dcbw redhat com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ **************************************************************************/
+
+#ifndef __NM_PPTP_EDITOR_PLUGIN_H__
+#define __NM_PPTP_EDITOR_PLUGIN_H__
+
+#define PPTP_TYPE_PLUGIN_UI (pptp_plugin_ui_get_type ())
+#define PPTP_PLUGIN_UI(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PPTP_TYPE_PLUGIN_UI,
PptpPluginUi))
+#define PPTP_PLUGIN_UI_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PPTP_TYPE_PLUGIN_UI,
PptpPluginUiClass))
+#define PPTP_IS_PLUGIN_UI(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PPTP_TYPE_PLUGIN_UI))
+#define PPTP_IS_PLUGIN_UI_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PPTP_TYPE_PLUGIN_UI))
+#define PPTP_PLUGIN_UI_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PPTP_TYPE_PLUGIN_UI,
PptpPluginUiClass))
+
+typedef struct _PptpPluginUi PptpPluginUi;
+typedef struct _PptpPluginUiClass PptpPluginUiClass;
+
+struct _PptpPluginUi {
+ GObject parent;
+};
+
+struct _PptpPluginUiClass {
+ GObjectClass parent;
+};
+
+GType pptp_plugin_ui_get_type (void);
+
+#endif /* __NM_PPTP_EDITOR_PLUGIN_H__ */
+
diff --git a/properties/nm-pptp.c b/properties/nm-pptp.c
index 506dad4..5f73c80 100644
--- a/properties/nm-pptp.c
+++ b/properties/nm-pptp.c
@@ -1,7 +1,5 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/***************************************************************************
- * nm-pptp.c : GNOME UI dialogs for configuring PPTP VPN connections
- *
* Copyright (C) 2008 Dan Williams, <dcbw redhat com>
* Copyright (C) 2008 - 2011 Red Hat, Inc.
* Based on work by David Zeuthen, <davidz redhat com>
@@ -26,31 +24,11 @@
#include "nm-pptp.h"
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <glib/gi18n-lib.h>
-#include <string.h>
#include <gtk/gtk.h>
-#include "import-export.h"
#include "advanced-dialog.h"
-#define PPTP_PLUGIN_NAME _("Point-to-Point Tunneling Protocol (PPTP)")
-#define PPTP_PLUGIN_DESC _("Compatible with Microsoft and other PPTP VPN servers.")
-
-typedef void (*ChangedCallback) (GtkWidget *widget, gpointer user_data);
-
-/************** plugin class **************/
-
-static void pptp_plugin_ui_interface_init (NMVpnEditorPluginInterface *iface_class);
-
-G_DEFINE_TYPE_EXTENDED (PptpPluginUi, pptp_plugin_ui, G_TYPE_OBJECT, 0,
- G_IMPLEMENT_INTERFACE (NM_TYPE_VPN_EDITOR_PLUGIN,
- pptp_plugin_ui_interface_init))
-
-/************** UI widget class **************/
+/*****************************************************************************/
static void pptp_plugin_ui_widget_interface_init (NMVpnEditorInterface *iface_class);
@@ -70,14 +48,7 @@ typedef struct {
gboolean new_connection;
} PptpPluginUiWidgetPrivate;
-enum {
- PROP_0,
- PROP_NAME,
- PROP_DESC,
- PROP_SERVICE,
-
- LAST_PROP
-};
+/*****************************************************************************/
static gboolean
check_validity (PptpPluginUiWidget *self, GError **error)
@@ -425,7 +396,14 @@ is_new_func (const char *key, const char *value, gpointer user_data)
*is_new = FALSE;
}
-static NMVpnEditor *
+/*****************************************************************************/
+
+static void
+pptp_plugin_ui_widget_init (PptpPluginUiWidget *plugin)
+{
+}
+
+NMVpnEditor *
nm_vpn_plugin_ui_widget_interface_new (NMConnection *connection, GError **error)
{
NMVpnEditor *object;
@@ -532,167 +510,9 @@ pptp_plugin_ui_widget_class_init (PptpPluginUiWidgetClass *req_class)
}
static void
-pptp_plugin_ui_widget_init (PptpPluginUiWidget *plugin)
-{
-}
-
-static void
pptp_plugin_ui_widget_interface_init (NMVpnEditorInterface *iface_class)
{
- /* interface implementation */
iface_class->get_widget = get_widget;
iface_class->update_connection = update_connection;
}
-static NMConnection *
-import (NMVpnEditorPlugin *iface, const char *path, GError **error)
-{
- NMConnection *connection = NULL;
- char *contents = NULL;
- char **lines = NULL;
- char *ext;
-
- ext = strrchr (path, '.');
- if (!ext) {
- g_set_error (error,
- NMV_EDITOR_PLUGIN_ERROR,
- NMV_EDITOR_PLUGIN_ERROR_FILE_NOT_VPN,
- "unknown PPTP file extension");
- goto out;
- }
-
- if (strcmp (ext, ".conf") && strcmp (ext, ".cnf")) {
- g_set_error (error,
- NMV_EDITOR_PLUGIN_ERROR,
- NMV_EDITOR_PLUGIN_ERROR_FILE_NOT_VPN,
- "unknown PPTP file extension");
- goto out;
- }
-
- if (!g_file_get_contents (path, &contents, NULL, error))
- return NULL;
-
- lines = g_strsplit_set (contents, "\r\n", 0);
- if (g_strv_length (lines) <= 1) {
- g_set_error (error,
- NMV_EDITOR_PLUGIN_ERROR,
- NMV_EDITOR_PLUGIN_ERROR_FILE_NOT_READABLE,
- "not a valid PPTP configuration file");
- goto out;
- }
-
- connection = do_import (path, lines, error);
-
-out:
- if (lines)
- g_strfreev (lines);
- g_free (contents);
- return connection;
-}
-
-static gboolean
-export (NMVpnEditorPlugin *iface,
- const char *path,
- NMConnection *connection,
- GError **error)
-{
- return do_export (path, connection, error);
-}
-
-static char *
-get_suggested_filename (NMVpnEditorPlugin *iface, NMConnection *connection)
-{
- NMSettingConnection *s_con;
- const char *id;
-
- g_return_val_if_fail (connection != NULL, NULL);
-
- s_con = nm_connection_get_setting_connection (connection);
- g_return_val_if_fail (s_con != NULL, NULL);
-
- id = nm_setting_connection_get_id (s_con);
- g_return_val_if_fail (id != NULL, NULL);
-
- return g_strdup_printf ("%s (pptp).conf", id);
-}
-
-static NMVpnEditorPluginCapability
-get_capabilities (NMVpnEditorPlugin *iface)
-{
- return NM_VPN_EDITOR_PLUGIN_CAPABILITY_NONE;
-}
-
-static NMVpnEditor *
-get_editor (NMVpnEditorPlugin *iface, NMConnection *connection, GError **error)
-{
- return nm_vpn_plugin_ui_widget_interface_new (connection, error);
-}
-
-static void
-get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec)
-{
- switch (prop_id) {
- case PROP_NAME:
- g_value_set_string (value, PPTP_PLUGIN_NAME);
- break;
- case PROP_DESC:
- g_value_set_string (value, PPTP_PLUGIN_DESC);
- break;
- case PROP_SERVICE:
- g_value_set_string (value, NM_DBUS_SERVICE_PPTP);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-pptp_plugin_ui_class_init (PptpPluginUiClass *req_class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (req_class);
-
- object_class->get_property = get_property;
-
- g_object_class_override_property (object_class,
- PROP_NAME,
- NM_VPN_EDITOR_PLUGIN_NAME);
-
- g_object_class_override_property (object_class,
- PROP_DESC,
- NM_VPN_EDITOR_PLUGIN_DESCRIPTION);
-
- g_object_class_override_property (object_class,
- PROP_SERVICE,
- NM_VPN_EDITOR_PLUGIN_SERVICE);
-}
-
-static void
-pptp_plugin_ui_init (PptpPluginUi *plugin)
-{
-}
-
-static void
-pptp_plugin_ui_interface_init (NMVpnEditorPluginInterface *iface_class)
-{
- /* interface implementation */
- iface_class->get_editor = get_editor;
- iface_class->get_capabilities = get_capabilities;
- iface_class->import_from_file = import;
- iface_class->export_to_file = export;
- iface_class->get_suggested_filename = get_suggested_filename;
-}
-
-G_MODULE_EXPORT NMVpnEditorPlugin *
-nm_vpn_editor_plugin_factory (GError **error)
-{
- if (error)
- g_return_val_if_fail (*error == NULL, NULL);
-
- bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
-
- return NM_VPN_EDITOR_PLUGIN (g_object_new (PPTP_TYPE_PLUGIN_UI, NULL));
-}
-
diff --git a/properties/nm-pptp.h b/properties/nm-pptp.h
index bf3c8c6..3a8ee81 100644
--- a/properties/nm-pptp.h
+++ b/properties/nm-pptp.h
@@ -1,7 +1,5 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/***************************************************************************
- * nm-pptp.h : GNOME UI dialogs for configuring pptp VPN connections
- *
* Copyright (C) 2008 Dan Williams, <dcbw redhat com>
*
* This program is free software; you can redistribute it and/or modify
@@ -23,27 +21,6 @@
#ifndef _NM_PPTP_H_
#define _NM_PPTP_H_
-#define PPTP_TYPE_PLUGIN_UI (pptp_plugin_ui_get_type ())
-#define PPTP_PLUGIN_UI(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PPTP_TYPE_PLUGIN_UI,
PptpPluginUi))
-#define PPTP_PLUGIN_UI_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PPTP_TYPE_PLUGIN_UI,
PptpPluginUiClass))
-#define PPTP_IS_PLUGIN_UI(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PPTP_TYPE_PLUGIN_UI))
-#define PPTP_IS_PLUGIN_UI_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PPTP_TYPE_PLUGIN_UI))
-#define PPTP_PLUGIN_UI_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PPTP_TYPE_PLUGIN_UI,
PptpPluginUiClass))
-
-typedef struct _PptpPluginUi PptpPluginUi;
-typedef struct _PptpPluginUiClass PptpPluginUiClass;
-
-struct _PptpPluginUi {
- GObject parent;
-};
-
-struct _PptpPluginUiClass {
- GObjectClass parent;
-};
-
-GType pptp_plugin_ui_get_type (void);
-
-
#define PPTP_TYPE_PLUGIN_UI_WIDGET (pptp_plugin_ui_widget_get_type ())
#define PPTP_PLUGIN_UI_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),
PPTP_TYPE_PLUGIN_UI_WIDGET, PptpPluginUiWidget))
#define PPTP_PLUGIN_UI_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PPTP_TYPE_PLUGIN_UI_WIDGET,
PptpPluginUiWidgetClass))
@@ -64,5 +41,7 @@ struct _PptpPluginUiWidgetClass {
GType pptp_plugin_ui_widget_get_type (void);
+NMVpnEditor *nm_vpn_plugin_ui_widget_interface_new (NMConnection *connection, GError **error);
+
#endif /* _NM_PPTP_H_ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]