[libgda] GI annotations improvements and auto Vala bindings generation



commit 73faf78f1c97e1d2049cf1bde0072e76484214d1
Author: Vivien Malerba <malerba gnome-db org>
Date:   Thu Sep 22 21:20:08 2011 +0200

    GI annotations improvements and auto Vala bindings generation
    
    Many thanks to Daniel Espinosa

 configure.ac                                  |   57 +++++++++++++++++++++++++
 libgda/.gitignore                             |    1 +
 libgda/Makefile.am                            |   16 +++++++
 libgda/gda-connection.c                       |    4 +-
 libgda/gda-data-model.c                       |    6 +-
 libgda/gda-meta-store.c                       |    2 +-
 libgda/gda-meta-struct.c                      |    2 +-
 libgda/gda-meta-struct.h                      |    8 ++--
 libgda/gda-server-provider.h                  |   14 ++++++
 libgda/gda-set.c                              |    4 +-
 libgda/gda-set.h                              |   20 +++++++++
 libgda/gda-statement-extra.h                  |   10 ++++
 libgda/gda-transaction-status.h               |    8 ++++
 libgda/gda-tree-manager.c                     |    2 +-
 libgda/gda-types.h                            |    4 ++
 libgda/gda-util.c                             |    2 +-
 libgda/gda-xa-transaction.c                   |    4 +-
 libgda/providers-support/gda-pstmt.h          |    9 ++++
 libgda/sql-parser/gda-statement-struct-decl.h |   10 +++-
 19 files changed, 163 insertions(+), 20 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 2c75189..d19daf3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -464,6 +464,62 @@ AC_ARG_ENABLE([gi-system-install],
     [enable_gi_system_install=$enableval],[enable_gi_system_install=yes])
 AM_CONDITIONAL(ENABLE_GI_SYSTEM_INSTALL, [test x"$enable_gi_system_install" = "xyes"])
 
+
+dnl ******************************
+dnl Check for Vala Compiler
+dnl ******************************
+
+AC_ARG_ENABLE([vala],
+    AS_HELP_STRING([--enable-vala], [Enable support for Vala bindings generation [default=auto]]),
+    [enable_vala=$enableval],[enable_vala=auto])
+
+have_vala=no
+if test "x$found_introspection" = "xyes"
+then
+    VALA_MODULES="libvala-0.12"
+    PKG_CHECK_MODULES(VALA, $VALA_MODULES,
+	AC_DEFINE(HAVE_VALA, [], [Defined if Vala support is enabled])
+	have_vala=yes
+    )
+    if test "x$have_vala" = "xyes"
+    then
+	    VALA_BINDIR=`pkg-config $VALA_MODULES --variable=bindir`
+	    AC_SUBST(VALA_BINDIR)
+	    VALA_COMPILER="$VALA_BINDIR/valac"
+	    AC_SUBST(VALA_COMPILER)
+	    VALA_VAPIGEN=`pkg-config $VALA_MODULES --variable=vapigen`
+	    AC_SUBST(VALA_VAPIGEN)
+	    VALA_VAPIDIR=`pkg-config $VALA_MODULES --variable=vapidir`
+	    AC_SUBST(VALA_VAPIDIR)
+	    
+        if test "x$enable_vala" = xauto
+        then
+            enable_vala=yes
+        fi
+    else
+        if test "x$enable_vala" = xyes
+        then
+            AC_MSG_ERROR([Vala support was requested but not available])
+        fi
+        if test "x$enable_vala" = xauto
+        then
+            enable_gda_gi=no
+        fi
+    fi
+else
+    if test "x$enable_vala" = xyes
+    then
+	AC_MSG_ERROR([Vala bindings for Libgda are requested but not available])
+    fi
+    if test "x$enable_vala" = xauto
+    then
+    	enable_vala=no
+    fi
+fi
+AM_CONDITIONAL(ENABLE_VALA, [test "$enable_vala" = "yes"])
+
+
+
 dnl ******************************
 dnl Checks for libcrypto
 dnl ******************************
@@ -943,6 +999,7 @@ echo "   Building GTK+ UI extension: `if test x$have_ui != xno; then echo yes; e
 echo "   Building Libxslt extension: `if test x$have_xslt != xno; then echo yes; else echo no; fi`"
 echo "   Building libgda GObject Introspection: `if test x$enable_gda_gi != xno; then echo yes; else echo no; fi`"
 echo "   Building libgda-ui GObject Introspection: `if test x$enable_gdaui_gi != xno; then echo yes; else echo no; fi`"
+echo "   Building Vala Bindings: `if test x$enable_vala != xno; then echo yes; else echo no; fi`"
 echo "   Compiled providers:"
 echo "      Berkeley DB = $bdb_found"
 echo "      Berkeley DB SQL = $bdbsql_found"
diff --git a/libgda/.gitignore b/libgda/.gitignore
index 47187cf..64a3184 100644
--- a/libgda/.gitignore
+++ b/libgda/.gitignore
@@ -8,3 +8,4 @@ gda-enum-types.h
 libgda.def
 Gda-5.0.gir
 Gda-5.0.typelib
+*.vapi
diff --git a/libgda/Makefile.am b/libgda/Makefile.am
index 432fc73..c84741c 100644
--- a/libgda/Makefile.am
+++ b/libgda/Makefile.am
@@ -358,3 +358,19 @@ typelibs_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
 
 CLEANFILES += $(INTROSPECTION_GIRS) $(typelibs_DATA)
 endif
+
+if ENABLE_VALA
+
+vapi: libgda-5.0.vapi
+
+libgda-5.0.vapi: Gda-5.0.gir
+	$(VALA_VAPIGEN) --library libgda-5.0 --pkg libxml-2.0 Gda-5.0.gir 
+
+vapidir = $(VALA_VAPIDIR)
+vapi_DATA=libgda-5.0.vapi
+
+EXTRA_DIST += \
+        $(vapi_DATA)
+
+CLEANFILES += libgda-5.0.vapi
+endif
diff --git a/libgda/gda-connection.c b/libgda/gda-connection.c
index c2852ab..845f370 100644
--- a/libgda/gda-connection.c
+++ b/libgda/gda-connection.c
@@ -2742,7 +2742,7 @@ gda_connection_quote_sql_identifier (GdaConnection *cnc, const gchar *id)
  * @stmt: a #GdaStatement object
  * @params: (allow-none): a #GdaSet object (which can be obtained using gda_statement_get_parameters()), or %NULL
  * @flags: SQL rendering flags, as #GdaStatementSqlFlag OR'ed values
- * @params_used: (allow-none) (element-type GdaHolder) (out) (transfer container): a place to store the list of individual #GdaHolder objects within @params which have been used
+ * @params_used: (allow-none) (element-type Gda.Holder) (out) (transfer container): a place to store the list of individual #GdaHolder objects within @params which have been used
  * @error: a place to store errors, or %NULL
  *
  * Renders @stmt as an SQL statement, adapted to the SQL dialect used by @cnc
@@ -5591,7 +5591,7 @@ gda_connection_get_meta_store_data_v (GdaConnection *cnc, GdaConnectionMetaType
  *
  * Warning: the @cnc object may change the list if connection events occur
  *
- * Returns: (transfer none): a #GList of #GdaConnectionEvent objects (the list should not be modified)
+ * Returns: (transfer none) (element-type Gda.ConnectionEvent): a #GList of #GdaConnectionEvent objects (the list should not be modified)
  */
 const GList *
 gda_connection_get_events (GdaConnection *cnc)
diff --git a/libgda/gda-data-model.c b/libgda/gda-data-model.c
index 94f6fac..52be4c6 100644
--- a/libgda/gda-data-model.c
+++ b/libgda/gda-data-model.c
@@ -772,7 +772,7 @@ gda_data_model_set_value_at (GdaDataModel *model, gint col, gint row, const GVal
  * gda_data_model_set_values:
  * @model: a #GdaDataModel object.
  * @row: row number.
- * @values: (element-type GObject.Value) (transfer none) (allow-none): a list of #GValue (or %NULL), one for at most the number of columns of @model
+ * @values: (element-type GLib.Value) (transfer none) (allow-none): a list of #GValue (or %NULL), one for at most the number of columns of @model
  * @error: a place to store errors, or %NULL
  *
  * In a similar way to gda_data_model_set_value_at(), this method modifies a data model's contents
@@ -867,7 +867,7 @@ gda_data_model_create_iter (GdaDataModel *model)
 /**
  * gda_data_model_append_values:
  * @model: a #GdaDataModel object.
- * @values: (element-type GObject.Value) (allow-none): #GList of #GValue* representing the row to add.  The
+ * @values: (element-type GLib.Value) (allow-none): #GList of #GValue* representing the row to add.  The
  *          length must match model's column count.  These #GValue
  *	    are value-copied (the user is still responsible for freeing them).
  * @error: a place to store errors, or %NULL
@@ -967,7 +967,7 @@ gda_data_model_remove_row (GdaDataModel *model, gint row, GError **error)
 /**
  * gda_data_model_get_row_from_values:
  * @model: a #GdaDataModel object.
- * @values: (element-type GObject.Value): a list of #GValue values (no %NULL is allowed)
+ * @values: (element-type GLib.Value): a list of #GValue values (no %NULL is allowed)
  * @cols_index: (array): an array of #gint containing the column number to match each value of @values
  *
  * Returns the first row where all the values in @values at the columns identified at
diff --git a/libgda/gda-meta-store.c b/libgda/gda-meta-store.c
index 7ab55f1..3b2d4b3 100644
--- a/libgda/gda-meta-store.c
+++ b/libgda/gda-meta-store.c
@@ -397,7 +397,7 @@ gda_meta_store_class_init (GdaMetaStoreClass *klass)
 	/**
 	 * GdaMetaStore::meta-changed
 	 * @store: the #GdaMetaStore instance that emitted the signal
-	 * @changes: a list of changes made, as a #GSList of pointers to #GdaMetaStoreChange (which must not be modified)
+	 * @changes: (element-type Gda.MetaStoreChange): a list of changes made, as a #GSList of pointers to #GdaMetaStoreChange (which must not be modified)
 	 *
 	 * This signal is emitted when the @store's contents have changed (the changes are in the @changes list)
 	 */
diff --git a/libgda/gda-meta-struct.c b/libgda/gda-meta-struct.c
index d22fda0..31c70e7 100644
--- a/libgda/gda-meta-struct.c
+++ b/libgda/gda-meta-struct.c
@@ -1845,7 +1845,7 @@ _meta_struct_get_db_object (GdaMetaStruct *mstruct, const GValue *catalog, const
  * Get a list of all the #GdaMetaDbObject structures representing database objects in @mstruct. Note that
  * no #GdaMetaDbObject structure must not be modified.
  *
- * Returns: (transfer container): a new #GSList list of pointers to #GdaMetaDbObject structures which must be destroyed after usage using g_slist_free(). The individual #GdaMetaDbObject must not be modified.
+ * Returns: (transfer container) (element-type Gda.MetaObject): a new #GSList list of pointers to #GdaMetaDbObject structures which must be destroyed after usage using g_slist_free(). The individual #GdaMetaDbObject must not be modified.
  */
 GSList *
 gda_meta_struct_get_all_db_objects (GdaMetaStruct *mstruct)
diff --git a/libgda/gda-meta-struct.h b/libgda/gda-meta-struct.h
index 66feed5..17b7b9a 100644
--- a/libgda/gda-meta-struct.h
+++ b/libgda/gda-meta-struct.h
@@ -113,12 +113,12 @@ typedef enum {
 
 /**
  * GdaMetaTable:
- * @columns: list of #GdaMetaTableColumn structures, one for each column in the table
+ * @columns: (element-type Gda.MetaTableColumn): list of #GdaMetaTableColumn structures, one for each column in the table
  * @pk_cols_array: index of the columns part of the primary key for the table (WARNING: columns numbering
  *                 here start at 0)
  * @pk_cols_nb: size of the @pk_cols_array array
- * @reverse_fk_list: list of #GdaMetaTableForeignKey where the referenced table is this table
- * @fk_list: list of #GdaMetaTableForeignKey for this table
+ * @reverse_fk_list: (element-type Gda.MetaTableForeignKey): list of #GdaMetaTableForeignKey where the referenced table is this table
+ * @fk_list: (element-type Gda.MetaTableForeignKey): list of #GdaMetaTableForeignKey for this table
  *
  * This structure specifies a #GdaMetaDbObject to represent a table's specific attributes,
  * its contents must not be modified.
@@ -181,7 +181,7 @@ typedef struct {
  * @obj_short_name: the shortest way to name the object
  * @obj_full_name: the full name of the object (in the &lt;schema&gt;.&lt;nameagt; notation
  * @obj_owner: object's owner
- * @depend_list: list of #GdaMetaDbObject pointers on which this object depends (through foreign keys
+ * @depend_list: (element-type Gda.MetaDbObject): list of #GdaMetaDbObject pointers on which this object depends (through foreign keys
  *               or tables used for views)
  *
  * Struture to hold information about each database object (tables, views, ...),
diff --git a/libgda/gda-server-provider.h b/libgda/gda-server-provider.h
index c0572d6..e5fca1a 100644
--- a/libgda/gda-server-provider.h
+++ b/libgda/gda-server-provider.h
@@ -356,6 +356,20 @@ struct _GdaServerProviderClass {
 
 	/* GdaStatement */
 	GdaSqlParser           *(* create_parser)        (GdaServerProvider *provider, GdaConnection *cnc);
+	
+	/**
+	 * statement_to_sql:
+	 * @cnc: a #GdaConnection object
+	 * @stmt: a #GdaStatement object
+	 * @params: (allow-none): a #GdaSet object (which can be obtained using gda_statement_get_parameters()), or %NULL
+	 * @flags: SQL rendering flags, as #GdaStatementSqlFlag OR'ed values
+	 * @params_used: (allow-none) (element-type Gda.Holder) (out) (transfer container): a place to store the list of individual #GdaHolder objects within @params which have been used
+	 * @error: a place to store errors, or %NULL
+	 *
+	 * Renders @stmt as an SQL statement, adapted to the SQL dialect used by @cnc
+	 *
+	 * Returns: a new string, or %NULL if an error occurred
+	 */
 	gchar                  *(* statement_to_sql)     (GdaServerProvider *provider, GdaConnection *cnc, 
 							  GdaStatement *stmt, GdaSet *params, GdaStatementSqlFlag flags,
 							  GSList **params_used, GError **error);
diff --git a/libgda/gda-set.c b/libgda/gda-set.c
index 547b0a9..9f83cb3 100644
--- a/libgda/gda-set.c
+++ b/libgda/gda-set.c
@@ -402,7 +402,7 @@ gda_set_init (GdaSet *set)
 
 /**
  * gda_set_new:
- * @holders: (element-type GdaHolder) (transfer:none): a list of #GdaHolder objects
+ * @holders: (element-type Gda.Holder) (transfer none): a list of #GdaHolder objects
  *
  * Creates a new #GdaSet object, and populates it with the list given as argument.
  * The list can then be freed as it is copied. All the value holders in @holders are referenced counted
@@ -425,7 +425,7 @@ gda_set_new (GSList *holders)
 
 /**
  * gda_set_new_read_only:
- * @holders: (element-type GdaHolder) (transfer:none): a list of #GdaHolder objects
+ * @holders: (element-type Gda.Holder) (transfer none): a list of #GdaHolder objects
  *
  * Creates a new #GdaSet like gda_set_new(), but does not allow modifications to any of the #GdaHolder
  * object in @holders. This function is used for Libgda's database providers' implementation.
diff --git a/libgda/gda-set.h b/libgda/gda-set.h
index 9067d0f..c6b8ad3 100644
--- a/libgda/gda-set.h
+++ b/libgda/gda-set.h
@@ -55,6 +55,11 @@ struct _GdaSetNode {
 	gpointer      _gda_reserved2;
 };
 
+/**
+ * GdaSetGroup:
+ * @nodes: (element-type Gda.SetNode): list of GdaSetNode, at least one entry
+ * @nodes_source: (allow-none):  if NULL, then @nodes contains exactly one entry 
+ */
 struct _GdaSetGroup {
 	GSList       *nodes;       /* list of GdaSetNode, at least one entry */
 	GdaSetSource *nodes_source; /* if NULL, then @nodes contains exactly one entry */
@@ -65,6 +70,12 @@ struct _GdaSetGroup {
 	gpointer      _gda_reserved2;
 };
 
+/**
+ * GdaSetSource:
+ * @data_model: Can't be NULL
+ * @nodes: (element-type Gda.SetNode): list of #GdaSetNode for which source_model == @data_model
+ *
+ **/
 struct _GdaSetSource {
 	GdaDataModel   *data_model;   /* Can't be NULL */
 	GSList         *nodes;        /* list of #GdaSetNode for which source_model == @data_model */
@@ -82,6 +93,15 @@ struct _GdaSetSource {
 #define GDA_SET_GROUP(x) ((GdaSetGroup *)(x))
 
 /* struct for the object's data */
+
+/**
+ * GdaSet:
+ * @holders: (element-type Gda.Holder): list of GdaHolder objects
+ * @nodes_list: (element-type Gda.SetNode): list of GdaSetNode
+ * @sources_list: (element-type Gda.SetSource): list of GdaSetSource 
+ * @groups_list: (element-type Gda.SetGroup): list of GdaSetGroup
+ *
+ */
 struct _GdaSet
 {
 	GObject         object;
diff --git a/libgda/gda-statement-extra.h b/libgda/gda-statement-extra.h
index b1f659d..165cc14 100644
--- a/libgda/gda-statement-extra.h
+++ b/libgda/gda-statement-extra.h
@@ -27,6 +27,16 @@ G_BEGIN_DECLS
 /* private information to implement custom 
  * SQL renderers for GdaStatement objects
  */
+/**
+ * GdaSqlRenderingContext:
+ * @flags:
+ * @params:
+ * @params_used: (element-type Gda.Holder):
+ * @provider: (allow-none):
+ * @cnc: (allow-none):
+ *
+ * Specifies the context in which a #GdaSqlStatement is being converted to SQL.
+ */
 typedef struct _GdaSqlRenderingContext GdaSqlRenderingContext;
 
 /**
diff --git a/libgda/gda-transaction-status.h b/libgda/gda-transaction-status.h
index 51e05ef..4be4d27 100644
--- a/libgda/gda-transaction-status.h
+++ b/libgda/gda-transaction-status.h
@@ -81,6 +81,14 @@ struct _GdaTransactionStatusEvent {
 	gpointer  _gda_reserved2;
 };
 
+/**
+ * GdaTransactionStatus:
+ * @name:
+ * @isolation_level:
+ * @state:
+ * @events: (element-type Gda.TransactionStatusEvent):
+ *
+ */
 struct _GdaTransactionStatus {
 	GObject                    object;
 	
diff --git a/libgda/gda-tree-manager.c b/libgda/gda-tree-manager.c
index dd6afb1..20af905 100644
--- a/libgda/gda-tree-manager.c
+++ b/libgda/gda-tree-manager.c
@@ -458,7 +458,7 @@ gda_tree_manager_add_manager (GdaTreeManager *manager, GdaTreeManager *sub)
  *
  * Get the list of sub managers which have already been added using gda_tree_manager_add_manager()
  *
- * Returns: (transfer none): a list of #GdaTreeMenager which should not be modified.
+ * Returns: (transfer none) (element-type Gda.TreeManager): a list of #GdaTreeMenager which should not be modified.
  *
  * Since: 4.2
  */
diff --git a/libgda/gda-types.h b/libgda/gda-types.h
index 68cf282..da34e47 100644
--- a/libgda/gda-types.h
+++ b/libgda/gda-types.h
@@ -30,6 +30,10 @@ G_BEGIN_DECLS
 
 /* Pointer type for GSList (not a boxed type!) */
 #define GDA_TYPE_SLIST (_gda_slist_get_type())
+/**
+ * GdaSList: (skip)
+ *
+ */
 typedef GSList GdaSList;
 GType   _gda_slist_get_type (void) G_GNUC_CONST;
 
diff --git a/libgda/gda-util.c b/libgda/gda-util.c
index 5b2e9b7..f8a9158 100644
--- a/libgda/gda-util.c
+++ b/libgda/gda-util.c
@@ -594,7 +594,7 @@ gda_utility_data_model_find_column_description (GdaDataSelect *model, const gcha
  * gda_utility_holder_load_attributes:
  * @holder: a #GdaHolder
  * @node: an xmlNodePtr with a &lt;parameter&gt; tag
- * @sources: a list of #GdaDataModel
+ * @sources: (element-type Gda.DataModel): a list of #GdaDataModel
  * @error: a place to store errors, or %NULL
  *
  * Note: this method may set the "source" custom string property
diff --git a/libgda/gda-xa-transaction.c b/libgda/gda-xa-transaction.c
index 66b0aff..6942325 100644
--- a/libgda/gda-xa-transaction.c
+++ b/libgda/gda-xa-transaction.c
@@ -439,7 +439,7 @@ gda_xa_transaction_begin  (GdaXaTransaction *xa_trans, GError **error)
 /**
  * gda_xa_transaction_commit:
  * @xa_trans: a #GdaXaTransaction object
- * @cnc_to_recover: (allow-none): a place to store the list of connections for which the commit phase failed, or %NULL
+ * @cnc_to_recover: (allow-none) (element-type Gda.Connection) (out callee-allocates): a place to store the list of connections for which the commit phase failed, or %NULL
  * @error: a place to store errors, or %NULL
  *
  * Commits a distributed transaction (managed by @xa_trans). The commit is composed of two phases:
@@ -619,7 +619,7 @@ gda_xa_transaction_rollback (GdaXaTransaction *xa_trans, GError **error)
 /**
  * gda_xa_transaction_commit_recovered:
  * @xa_trans: a #GdaXaTransaction object
- * @cnc_to_recover: (allow-none): a place to store the list of connections for which the there were data to recover and which failed to be actually committed, or %NULL
+ * @cnc_to_recover: (allow-none) (element-type Gda.Connection) (out callee-allocates): a place to store the list of connections for which the there were data to recover and which failed to be actually committed, or %NULL
  * @error: (allow-none): a place to store errors, or %NULL
  *
  * Tries to commit the data prepared but which failed to commit (see gda_xa_transaction_commit()). This
diff --git a/libgda/providers-support/gda-pstmt.h b/libgda/providers-support/gda-pstmt.h
index e3953e2..85e79c1 100644
--- a/libgda/providers-support/gda-pstmt.h
+++ b/libgda/providers-support/gda-pstmt.h
@@ -35,6 +35,15 @@ typedef struct _GdaPStmt        GdaPStmt;
 typedef struct _GdaPStmtPrivate GdaPStmtPrivate;
 typedef struct _GdaPStmtClass   GdaPStmtClass;
 
+/**
+ * GdaPStmt:
+ * @sql: actual SQL code used for this prepared statement, mem freed by GdaPStmt
+ * @param_ids: (element-type string): list of parameters' IDs (as gchar *), mem freed by GdaPStmt
+ * @ncols: number of types in array
+ * @types: (array length=ncols) (element-type GLib.Type): array of ncols types
+ * @tmpl_columns: (element-type Gda.Colum): list of #GdaColumn objects which data models created from this prep. statement can copy
+ *
+ */
 struct _GdaPStmt {
 	GObject       object;
 
diff --git a/libgda/sql-parser/gda-statement-struct-decl.h b/libgda/sql-parser/gda-statement-struct-decl.h
index 9cba130..5128107 100644
--- a/libgda/sql-parser/gda-statement-struct-decl.h
+++ b/libgda/sql-parser/gda-statement-struct-decl.h
@@ -58,7 +58,7 @@ typedef struct _GdaSqlStatementCompound GdaSqlStatementCompound;
  * Statement type
  */
 /**
- * GdaSqlStatementType:
+ * GdaSqlStatementType: (skip)
  * @GDA_SQL_STATEMENT_SELECT: a SELECT statement
  * @GDA_SQL_STATEMENT_INSERT: an INSERT statement
  * @GDA_SQL_STATEMENT_UPDATE: an UPDATE statement
@@ -196,7 +196,9 @@ gboolean gda_sql_any_part_foreach (GdaSqlAnyPart *node, GdaSqlForeachFunc func,
  */
 gboolean gda_sql_any_part_check_structure (GdaSqlAnyPart *node, GError **error);
 
-/*
+/**
+ * GdaSqlStatementContentsInfo: (skip)
+ *
  * Contents' infos
  */
 typedef struct {
@@ -219,7 +221,9 @@ typedef struct {
 	gpointer         _gda_reserved4;
 } GdaSqlStatementContentsInfo;
 
-/*
+/**
+ * GdaSqlStatementCheckValidityData: (skip)
+ *
  * Validation against a dictionary
  */
 typedef struct {



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