anjuta r3818 - in trunk: . libanjuta plugins/project-wizard plugins/project-wizard/templates
- From: naba svn gnome org
- To: svn-commits-list gnome org
- Subject: anjuta r3818 - in trunk: . libanjuta plugins/project-wizard plugins/project-wizard/templates
- Date: Sun, 6 Apr 2008 12:08:33 +0100 (BST)
Author: naba
Date: Sun Apr 6 12:08:33 2008
New Revision: 3818
URL: http://svn.gnome.org/viewvc/anjuta?rev=3818&view=rev
Log:
* libanjuta/anjuta-utils.c (anjuta_util_glist_strings_join):
* libanjuta/anjuta-utils.h:
* plugins/project-wizard/druid.c (check_and_warn_missing),
(on_druid_next):
* plugins/project-wizard/header.c (npw_header_free),
(npw_header_add_required_program),
(npw_header_add_required_package),
(npw_header_check_required_programs), (package_is_installed),
(npw_header_check_required_packages):
* plugins/project-wizard/header.h:
* plugins/project-wizard/parser.c (parse_tag),
(parse_header_start), (parse_header_text):
* plugins/project-wizard/templates/anjuta-plugin.wiz:
* plugins/project-wizard/templates/cpp.wiz:
* plugins/project-wizard/templates/django.wiz:
* plugins/project-wizard/templates/gcj.wiz:
* plugins/project-wizard/templates/gnome.wiz:
* plugins/project-wizard/templates/gtk.wiz:
* plugins/project-wizard/templates/gtkmm.wiz:
* plugins/project-wizard/templates/java.wiz:
* plugins/project-wizard/templates/minimal.wiz:
* plugins/project-wizard/templates/mkfile.wiz:
* plugins/project-wizard/templates/python.wiz:
* plugins/project-wizard/templates/sdl.wiz:
* plugins/project-wizard/templates/terminal.wiz:
* plugins/project-wizard/templates/wxwin.wiz:
* plugins/project-wizard/templates/xlib-dock.wiz:
* plugins/project-wizard/templates/xlib.wiz:
Added a check for vital programs and packages needed to create a
new project. A warning dialog is shown to user in project
wizard when he proceeds after selecting a project type.
Updated all project templates to cover vital programs and
packages to generate and build correctly.
Modified:
trunk/ChangeLog
trunk/libanjuta/anjuta-utils.c
trunk/libanjuta/anjuta-utils.h
trunk/plugins/project-wizard/druid.c
trunk/plugins/project-wizard/header.c
trunk/plugins/project-wizard/header.h
trunk/plugins/project-wizard/parser.c
trunk/plugins/project-wizard/templates/anjuta-plugin.wiz
trunk/plugins/project-wizard/templates/cpp.wiz
trunk/plugins/project-wizard/templates/django.wiz
trunk/plugins/project-wizard/templates/gcj.wiz
trunk/plugins/project-wizard/templates/gnome.wiz
trunk/plugins/project-wizard/templates/gtk.wiz
trunk/plugins/project-wizard/templates/gtkmm.wiz
trunk/plugins/project-wizard/templates/java.wiz
trunk/plugins/project-wizard/templates/minimal.wiz
trunk/plugins/project-wizard/templates/mkfile.wiz
trunk/plugins/project-wizard/templates/python.wiz
trunk/plugins/project-wizard/templates/sdl.wiz
trunk/plugins/project-wizard/templates/terminal.wiz
trunk/plugins/project-wizard/templates/wxwin.wiz
trunk/plugins/project-wizard/templates/xlib-dock.wiz
trunk/plugins/project-wizard/templates/xlib.wiz
Modified: trunk/libanjuta/anjuta-utils.c
==============================================================================
--- trunk/libanjuta/anjuta-utils.c (original)
+++ trunk/libanjuta/anjuta-utils.c Sun Apr 6 12:08:33 2008
@@ -591,6 +591,35 @@
return new_list;
}
+/* Join list of strings using the given delimiter */
+gchar*
+anjuta_util_glist_strings_join (GList * list, gchar *delimiter)
+{
+ GString *joined;
+ gboolean first = TRUE;
+ GList *node;
+
+ joined = g_string_new (NULL);
+ node = list;
+ while (node)
+ {
+ if (node->data)
+ {
+ if (!first)
+ g_string_append (joined, delimiter);
+ else
+ first = FALSE;
+ g_string_append (joined, node->data);
+ }
+ node = g_list_next (node);
+ }
+ if (joined->len > 0)
+ return g_string_free (joined, FALSE);
+ else
+ g_string_free (joined, TRUE);
+ return NULL;
+}
+
gchar*
anjuta_util_get_real_path (const gchar *path)
{
Modified: trunk/libanjuta/anjuta-utils.h
==============================================================================
--- trunk/libanjuta/anjuta-utils.h (original)
+++ trunk/libanjuta/anjuta-utils.h Sun Apr 6 12:08:33 2008
@@ -84,6 +84,7 @@
void anjuta_util_glist_strings_prefix (GList * list, const gchar *prefix);
void anjuta_util_glist_strings_sufix (GList * list, const gchar *sufix);
GList* anjuta_util_glist_strings_sort (GList * list);
+gchar* anjuta_util_glist_strings_join (GList * list, gchar *delimiter);
/**********************************************************/
/* Both the returned glist and the data should be g_freed */
Modified: trunk/plugins/project-wizard/druid.c
==============================================================================
--- trunk/plugins/project-wizard/druid.c (original)
+++ trunk/plugins/project-wizard/druid.c Sun Apr 6 12:08:33 2008
@@ -656,6 +656,82 @@
npw_page_parser_parse (parser, output, strlen (output), NULL);
}
+static void
+check_and_warn_missing (NPWDruid *this)
+{
+ GList *missing_programs, *missing_packages;
+ GString *missing_message = NULL;
+
+ missing_programs = npw_header_check_required_programs (this->header);
+ missing_packages = npw_header_check_required_packages (this->header);
+
+ if (missing_programs || missing_packages)
+ {
+ missing_message = g_string_new (NULL);
+ }
+
+ if (missing_programs)
+ {
+ gchar *missing_progs;
+ missing_progs = anjuta_util_glist_strings_join (missing_programs,
+ ", ");
+ g_string_append_printf (missing_message,
+ _("\nMissing programs: %s."), missing_progs);
+ g_free (missing_progs);
+ g_list_free (missing_programs);
+ }
+
+ if (missing_packages)
+ {
+ gchar *missing_pkgs;
+ missing_pkgs = anjuta_util_glist_strings_join (missing_packages,
+ ", ");
+ g_string_append_printf (missing_message,
+ _("\nMissing packages: %s."), missing_pkgs);
+ g_free (missing_pkgs);
+ g_list_free (missing_packages);
+ }
+
+ if (missing_message)
+ {
+ GtkWidget *dialog, *detail_label, *expander;
+
+ g_string_prepend (missing_message, _(
+ "Some important programs or development packages required to build "
+ "this project are missing. Please make sure they are "
+ "installed properly before generating the project.\n"));
+ dialog =
+ gtk_message_dialog_new_with_markup (GTK_WINDOW (this->dialog),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_WARNING,
+ GTK_BUTTONS_CLOSE,
+ "<b>%s</b>\n\n%s",
+ _("Missing components"),
+ missing_message->str);
+ detail_label = gtk_label_new (
+ _("The missing programs are usually part of some distrubution "
+ "packages and can be searched in your Application Manager. "
+ "Similarly, the development packages are contained in special "
+ "packages that your distribution provide to allow development "
+ "of projects based on them. They usually end with -dev or "
+ "-devel suffix in package names and can be found by searching "
+ "in your Application Manager."));
+ gtk_label_set_line_wrap (GTK_LABEL (detail_label), TRUE);
+ gtk_widget_show (detail_label);
+
+ expander = gtk_expander_new ("<b>Details</b>");
+ gtk_expander_set_use_markup (GTK_EXPANDER (expander), TRUE);
+ gtk_container_add (GTK_CONTAINER (expander), detail_label);
+ gtk_box_pack_start_defaults (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+ expander);
+ gtk_widget_show (expander);
+
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ g_string_free (missing_message, TRUE);
+ }
+}
+
static gboolean
on_druid_next (GnomeDruidPage* page, GtkWidget* widget, NPWDruid* this)
{
@@ -671,6 +747,10 @@
/* Current is Select project page */
new_project = npw_header_get_filename (this->header);
+
+ /* Check if necessary programs for this project is installed */
+ check_and_warn_missing (this);
+
if (this->project_file != new_project)
{
/* Change project */
Modified: trunk/plugins/project-wizard/header.c
==============================================================================
--- trunk/plugins/project-wizard/header.c (original)
+++ trunk/plugins/project-wizard/header.c Sun Apr 6 12:08:33 2008
@@ -24,10 +24,13 @@
*---------------------------------------------------------------------------*/
#include <config.h>
+#include <sys/wait.h>
+#include <unistd.h>
#include "header.h"
#include <glib/gdir.h>
+#include <libanjuta/anjuta-utils.h>
/*---------------------------------------------------------------------------*/
@@ -48,6 +51,8 @@
gchar* iconfile;
gchar* category;
gchar* filename;
+ GList* required_programs;
+ GList* required_packages;
NPWHeaderList* owner;
GNode* node;
};
@@ -74,12 +79,14 @@
{
GNode* node;
+ /* Memory allocated in string pool and project pool is not free */
node = g_node_find (this->owner->list, G_IN_ORDER, G_TRAVERSE_ALL, this);
if (node != NULL)
- {
g_node_destroy (node);
- /* Memory allocated in string pool and project pool is not free */
- }
+ if (this->required_programs)
+ g_list_free (this->required_programs);
+ if (this->required_packages)
+ g_list_free (this->required_packages);
}
void
@@ -143,6 +150,70 @@
return this->iconfile;
}
+void
+npw_header_add_required_program (NPWHeader* this, const gchar* program)
+{
+ this->required_programs =
+ g_list_prepend (this->required_programs,
+ g_string_chunk_insert (this->owner->string_pool,
+ program));
+
+}
+
+void
+npw_header_add_required_package (NPWHeader* this, const gchar* package)
+{
+ this->required_packages =
+ g_list_prepend (this->required_packages,
+ g_string_chunk_insert (this->owner->string_pool,
+ package));
+}
+
+GList*
+npw_header_check_required_programs (NPWHeader* this)
+{
+ GList *node = NULL;
+ GList *failed_programs = NULL;
+ for (node = this->required_programs; node; node = g_list_next (node))
+ {
+ if (!anjuta_util_prog_is_installed (node->data, FALSE))
+ {
+ failed_programs = g_list_prepend (failed_programs, node->data);
+ }
+ }
+ return failed_programs;
+}
+
+static gboolean
+package_is_installed (const gchar *package)
+{
+ int status;
+ int exit_status;
+ pid_t pid;
+ if ((pid = fork()) == 0)
+ {
+ execlp ("pkg-config", "pkg-config", "--exists", package, NULL);
+ }
+ waitpid (pid, &status, 0);
+ exit_status = WEXITSTATUS (status);
+ return (exit_status == 0);
+}
+
+GList*
+npw_header_check_required_packages (NPWHeader* this)
+{
+ GList *node = NULL;
+ GList *failed_packages = NULL;
+ for (node = this->required_packages; node; node = g_list_next (node))
+ {
+ if (!package_is_installed (node->data))
+ {
+ failed_packages = g_list_prepend (failed_packages, node->data);
+ }
+ }
+ return failed_packages;
+}
+
gboolean
npw_header_is_leaf(const NPWHeader* this)
{
Modified: trunk/plugins/project-wizard/header.h
==============================================================================
--- trunk/plugins/project-wizard/header.h (original)
+++ trunk/plugins/project-wizard/header.h Sun Apr 6 12:08:33 2008
@@ -44,6 +44,20 @@
void npw_header_set_iconfile (NPWHeader* this, const gchar* confile);
const gchar* npw_header_get_iconfile (const NPWHeader* this);
+void npw_header_add_required_program (NPWHeader* this, const gchar* program);
+
+/* Returns list of missing programs, or NULL if none is missing
+ * Only the glist should be freed, not the strings within
+ */
+GList* npw_header_check_required_programs (NPWHeader* this);
+
+void npw_header_add_required_package (NPWHeader* this, const gchar* package);
+
+/* Returns list of missing packages, or NULL if none is missing
+ * Only the glist should be freed, not the strings within
+ */
+GList* npw_header_check_required_packages (NPWHeader* this);
+
gboolean npw_header_is_leaf(const NPWHeader* this);
NPWHeaderList* npw_header_list_new (void);
Modified: trunk/plugins/project-wizard/parser.c
==============================================================================
--- trunk/plugins/project-wizard/parser.c (original)
+++ trunk/plugins/project-wizard/parser.c Sun Apr 6 12:08:33 2008
@@ -43,6 +43,8 @@
NPW_NAME_TAG,
NPW_DESCRIPTION_TAG,
NPW_CATEGORY_TAG,
+ NPW_REQUIRED_PROGRAM_TAG,
+ NPW_REQUIRED_PACKAGE_TAG,
NPW_ICON_TAG,
NPW_PAGE_TAG,
NPW_PROPERTY_TAG,
@@ -160,6 +162,14 @@
{
return NPW_CATEGORY_TAG;
}
+ else if (strcmp ("required-program", name) == 0)
+ {
+ return NPW_REQUIRED_PROGRAM_TAG;
+ }
+ else if (strcmp ("required-package", name) == 0)
+ {
+ return NPW_REQUIRED_PACKAGE_TAG;
+ }
else if (strcmp ("page", name) == 0)
{
return NPW_PAGE_TAG;
@@ -386,6 +396,8 @@
case NPW_DESCRIPTION_TAG:
case NPW_ICON_TAG:
case NPW_CATEGORY_TAG:
+ case NPW_REQUIRED_PROGRAM_TAG:
+ case NPW_REQUIRED_PACKAGE_TAG:
known = TRUE;
break;
default:
@@ -517,6 +529,12 @@
parser_critical (parser->ctx, "Duplicated category tag");
}
break;
+ case NPW_REQUIRED_PROGRAM_TAG:
+ npw_header_add_required_program (parser->header, text);
+ break;
+ case NPW_REQUIRED_PACKAGE_TAG:
+ npw_header_add_required_package (parser->header, text);
+ break;
case NPW_PROJECT_WIZARD_TAG:
/* Nothing to do */
break;
Modified: trunk/plugins/project-wizard/templates/anjuta-plugin.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/anjuta-plugin.wiz (original)
+++ trunk/plugins/project-wizard/templates/anjuta-plugin.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,10 @@
<description>Anjuta plugin project that uses libanjuta framework</description>
<icon>anjuta-plugin-logo.png</icon>
<category>C</category>
+ <required-program>automake</required-program>
+ <required-program>autoconf</required-program>
+ <required-program>make</required-program>
+ <required-package>libanjuta-1.0</required-package>
</project-wizard>
<page name="basic" _label="Basic information" _description="General Project Information">
Modified: trunk/plugins/project-wizard/templates/cpp.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/cpp.wiz (original)
+++ trunk/plugins/project-wizard/templates/cpp.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,9 @@
<description>A generic C++ project</description>
<icon>cpp-logo.png</icon>
<category>C++</category>
+ <required-program>automake</required-program>
+ <required-program>autoconf</required-program>
+ <required-program>make</required-program>
</project-wizard>
<page name="basic" _label="Basic information" _description="General Project Information">
Modified: trunk/plugins/project-wizard/templates/django.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/django.wiz (original)
+++ trunk/plugins/project-wizard/templates/django.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,7 @@
<description>Python webproject using Django Web Framework</description>
<icon>django-logo.png</icon>
<category>Python</category>
+ <required-program>django-admin.py</required-program>
</project-wizard>
<page name="basic" _label="Django Project information" _description="General Project Information">
Modified: trunk/plugins/project-wizard/templates/gcj.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/gcj.wiz (original)
+++ trunk/plugins/project-wizard/templates/gcj.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,10 @@
<description>A generic natively compiled java project using the GNU Java Compiler (gcj)</description>
<icon>gcj-logo.png</icon>
<category>Java</category>
+ <required-program>automake</required-program>
+ <required-program>autoconf</required-program>
+ <required-program>make</required-program>
+ <required-program>gcj</required-program>
</project-wizard>
<page name="basic" _label="Basic information" _description="General Project Information">
Modified: trunk/plugins/project-wizard/templates/gnome.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/gnome.wiz (original)
+++ trunk/plugins/project-wizard/templates/gnome.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,12 @@
<description>A generic GNOME project</description>
<icon>gnome-logo.png</icon>
<category>C</category>
+ <required-program>automake</required-program>
+ <required-program>autoconf</required-program>
+ <required-program>make</required-program>
+ <required-package>libgnome-2.0 >= 2.14</required-package>
+ <required-package>libgnomeui-2.0 >= 2.14</required-package>
+ <required-package>libglade-2.0 >= 2.6.0</required-package>
</project-wizard>
<page name="basic" _label="Basic information" _description="General Project Information">
Modified: trunk/plugins/project-wizard/templates/gtk.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/gtk.wiz (original)
+++ trunk/plugins/project-wizard/templates/gtk.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,11 @@
<description>A generic GTK+ project</description>
<icon>gtk-logo.png</icon>
<category>C</category>
+ <required-program>automake</required-program>
+ <required-program>autoconf</required-program>
+ <required-program>make</required-program>
+ <required-package>gtk+-2.0 >= 2.8</required-package>
+ <required-package>libglade-2.0 >= 2.6.0</required-package>
</project-wizard>
<page name="basic" _label="Basic information" _description="General Project Information">
Modified: trunk/plugins/project-wizard/templates/gtkmm.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/gtkmm.wiz (original)
+++ trunk/plugins/project-wizard/templates/gtkmm.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,11 @@
<description>A generic GTKmm (C++) project</description>
<icon>gtkmm-logo.png</icon>
<category>C++</category>
+ <required-program>automake</required-program>
+ <required-program>autoconf</required-program>
+ <required-program>make</required-program>
+ <required-package>gtkmm-2.4 >= 2.8</required-package>
+ <required-package>libglademm-2.4 >= 2.6</required-package>
</project-wizard>
<page name="basic" _label="Basic information" _description="General Project Information">
Modified: trunk/plugins/project-wizard/templates/java.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/java.wiz (original)
+++ trunk/plugins/project-wizard/templates/java.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,10 @@
<description>A generic java project using automake project management</description>
<icon>java-logo.png</icon>
<category>Java</category>
+ <required-program>automake</required-program>
+ <required-program>autoconf</required-program>
+ <required-program>make</required-program>
+ <required-program>java</required-program>
</project-wizard>
<page name="basic" _label="Basic information" _description="General Project Information">
Modified: trunk/plugins/project-wizard/templates/minimal.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/minimal.wiz (original)
+++ trunk/plugins/project-wizard/templates/minimal.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,9 @@
<description>A generic minimal and flat project </description>
<icon>terminal-logo.png</icon>
<category>C</category>
+ <required-program>automake</required-program>
+ <required-program>autoconf</required-program>
+ <required-program>make</required-program>
</project-wizard>
<page name="basic" _label="Basic information" _description="General Project Information">
Modified: trunk/plugins/project-wizard/templates/mkfile.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/mkfile.wiz (original)
+++ trunk/plugins/project-wizard/templates/mkfile.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,7 @@
<description>Makefile-based project</description>
<icon>mkfile-logo.png</icon>
<category>C</category>
+ <required-program>make</required-program>
</project-wizard>
<page name="options" _label="Project options" _description="Project directory, output file etc.">
Modified: trunk/plugins/project-wizard/templates/python.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/python.wiz (original)
+++ trunk/plugins/project-wizard/templates/python.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,10 @@
<description>A generic python project using automake project management</description>
<icon>python-logo.png</icon>
<category>Python</category>
+ <required-program>automake</required-program>
+ <required-program>autoconf</required-program>
+ <required-program>make</required-program>
+ <required-program>python</required-program>
</project-wizard>
<page name="basic" _label="Basic information" _description="General Project Information">
Modified: trunk/plugins/project-wizard/templates/sdl.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/sdl.wiz (original)
+++ trunk/plugins/project-wizard/templates/sdl.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,9 @@
<description>A sample SDL project</description>
<icon>appwiz_sdl.png</icon>
<category>C</category>
+ <required-program>automake</required-program>
+ <required-program>autoconf</required-program>
+ <required-program>make</required-program>
</project-wizard>
<page name="basic" _label="Basic information" _description="General Project Information">
Modified: trunk/plugins/project-wizard/templates/terminal.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/terminal.wiz (original)
+++ trunk/plugins/project-wizard/templates/terminal.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,9 @@
<description>A generic project</description>
<icon>terminal-logo.png</icon>
<category>C</category>
+ <required-program>automake</required-program>
+ <required-program>autoconf</required-program>
+ <required-program>make</required-program>
</project-wizard>
<page name="basic" _label="Basic information" _description="General Project Information">
Modified: trunk/plugins/project-wizard/templates/wxwin.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/wxwin.wiz (original)
+++ trunk/plugins/project-wizard/templates/wxwin.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,9 @@
<description>A generic wx Widgets project</description>
<icon>wxwin-logo.png</icon>
<category>C++</category>
+ <required-program>automake</required-program>
+ <required-program>autoconf</required-program>
+ <required-program>make</required-program>
</project-wizard>
<page name="basic" _label="Basic information" _description="General Project Information">
Modified: trunk/plugins/project-wizard/templates/xlib-dock.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/xlib-dock.wiz (original)
+++ trunk/plugins/project-wizard/templates/xlib-dock.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,9 @@
<description>A generic Xlib dock applet</description>
<icon>xlib-logo.png</icon>
<category>C</category>
+ <required-program>automake</required-program>
+ <required-program>autoconf</required-program>
+ <required-program>make</required-program>
</project-wizard>
<page name="basic" _label="Basic information" _description="General Project Information">
Modified: trunk/plugins/project-wizard/templates/xlib.wiz
==============================================================================
--- trunk/plugins/project-wizard/templates/xlib.wiz (original)
+++ trunk/plugins/project-wizard/templates/xlib.wiz Sun Apr 6 12:08:33 2008
@@ -3,6 +3,9 @@
<description>A generic Xlib project</description>
<icon>xlib-logo.png</icon>
<category>C</category>
+ <required-program>automake</required-program>
+ <required-program>autoconf</required-program>
+ <required-program>make</required-program>
</project-wizard>
<page name="basic" _label="Basic information" _description="General Project Information">
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]