[gnome-keyring: 3/12] gcr: Add gcr_collection_contains() as a virtual interface method.



commit 1f25d9c2798f6f16b54f86e88410e51592704962
Author: Stef Walter <stefw collabora co uk>
Date:   Mon Sep 5 16:03:36 2011 +0200

    gcr: Add gcr_collection_contains() as a virtual interface method.
    
     * And deprecate gcr_simple_collection_contains()
     * This is because this method is hard to implement at a higher layer
       efficiently, and the collection itself needs to get involved.

 docs/reference/gcr/gcr-sections.txt |    5 +++--
 gcr/gcr-collection.c                |   18 ++++++++++++++++++
 gcr/gcr-collection.h                |   10 ++++++++--
 gcr/gcr-deprecated.h                |    4 ++++
 gcr/gcr-gnupg-collection.c          |   17 +++++++++++++++++
 gcr/gcr-simple-collection.c         |   14 +++++++++++++-
 gcr/gcr-simple-collection.h         |    3 ---
 7 files changed, 63 insertions(+), 8 deletions(-)
---
diff --git a/docs/reference/gcr/gcr-sections.txt b/docs/reference/gcr/gcr-sections.txt
index e69ad89..46a6a92 100644
--- a/docs/reference/gcr/gcr-sections.txt
+++ b/docs/reference/gcr/gcr-sections.txt
@@ -228,10 +228,11 @@ GCR_TYPE_COMPARABLE
 <SECTION>
 <FILE>gcr-collection</FILE>
 GcrCollection
-gcr_collection_emit_added
-gcr_collection_emit_removed
 gcr_collection_get_length
 gcr_collection_get_objects
+gcr_collection_contains
+gcr_collection_emit_added
+gcr_collection_emit_removed
 <SUBSECTION Standard>
 gcr_collection_get_type
 GCR_COLLECTION
diff --git a/gcr/gcr-collection.c b/gcr/gcr-collection.c
index 5493bbc..aa7a60f 100644
--- a/gcr/gcr-collection.c
+++ b/gcr/gcr-collection.c
@@ -142,6 +142,24 @@ gcr_collection_get_objects (GcrCollection *self)
 }
 
 /**
+ * gcr_collection_contains:
+ * @self: the collection
+ *
+ * Check whether the collection contains an object or not.
+ *
+ * Returns: whether the collection contains this object
+ */
+gboolean
+gcr_collection_contains (GcrCollection *self,
+                         GObject *object)
+{
+	g_return_val_if_fail (GCR_IS_COLLECTION (self), FALSE);
+	g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
+	g_return_val_if_fail (GCR_COLLECTION_GET_INTERFACE (self)->contains, FALSE);
+	return GCR_COLLECTION_GET_INTERFACE (self)->contains (self, object);
+}
+
+/**
  * gcr_collection_emit_added:
  * @self: The collection
  * @object: The object that was added
diff --git a/gcr/gcr-collection.h b/gcr/gcr-collection.h
index 4e572c6..2616394 100644
--- a/gcr/gcr-collection.h
+++ b/gcr/gcr-collection.h
@@ -45,9 +45,12 @@ struct _GcrCollectionIface {
 	void (*removed) (GcrCollection *self, GObject *object);
 
 	/* virtual */
-	guint (*get_length) (GcrCollection *self);
+	guint    (*get_length)  (GcrCollection *self);
 
-	GList* (*get_objects) (GcrCollection *self);
+	GList*   (*get_objects) (GcrCollection *self);
+
+	gboolean (*contains)    (GcrCollection *self,
+	                         GObject *object);
 
 	/*< private >*/
 	gpointer dummy1;
@@ -65,6 +68,9 @@ guint               gcr_collection_get_length             (GcrCollection *self);
 
 GList*              gcr_collection_get_objects            (GcrCollection *self);
 
+gboolean            gcr_collection_contains               (GcrCollection *self,
+                                                           GObject *object);
+
 void                gcr_collection_emit_added             (GcrCollection *self,
                                                            GObject *object);
 
diff --git a/gcr/gcr-deprecated.h b/gcr/gcr-deprecated.h
index bb88629..3eb0a62 100644
--- a/gcr/gcr-deprecated.h
+++ b/gcr/gcr-deprecated.h
@@ -35,6 +35,7 @@
 
 #include "gcr-importer.h"
 #include "gcr-parser.h"
+#include "gcr-simple-collection.h"
 #include "gcr-viewer.h"
 
 #ifndef GCR_DISABLE_DEPRECATED
@@ -54,6 +55,9 @@ void              gcr_importer_set_parser                     (GcrImporter *self
 
 GQuark            gcr_error_get_domain                        (void) G_GNUC_CONST;
 
+gboolean          gcr_simple_collection_contains              (GcrSimpleCollection *self,
+                                                               GObject *object);
+
 #endif /* GCR_DISABLE_DEPRECATED */
 
 G_END_DECLS
diff --git a/gcr/gcr-gnupg-collection.c b/gcr/gcr-gnupg-collection.c
index 9a64ebd..26405a4 100644
--- a/gcr/gcr-gnupg-collection.c
+++ b/gcr/gcr-gnupg-collection.c
@@ -169,11 +169,28 @@ gcr_gnupg_collection_real_get_objects (GcrCollection *coll)
 	return g_hash_table_get_values (self->pv->items);
 }
 
+static gboolean
+gcr_gnupg_collection_real_contains (GcrCollection *collection,
+                                    GObject *object)
+{
+	GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (collection);
+	GcrGnupgKey *key;
+
+	if (!GCR_IS_GNUPG_KEY (object))
+		return FALSE;
+	key = g_hash_table_lookup (self->pv->items,
+	                           _gcr_gnupg_key_get_keyid (GCR_GNUPG_KEY (object)));
+	if (key != NULL && G_OBJECT (key) == object)
+		return TRUE;
+	return FALSE;
+}
+
 static void
 _gcr_collection_iface (GcrCollectionIface *iface)
 {
 	iface->get_length = gcr_gnupg_collection_real_get_length;
 	iface->get_objects = gcr_gnupg_collection_real_get_objects;
+	iface->contains = gcr_gnupg_collection_real_contains;
 }
 
 /**
diff --git a/gcr/gcr-simple-collection.c b/gcr/gcr-simple-collection.c
index fe0788f..17e1f1c 100644
--- a/gcr/gcr-simple-collection.c
+++ b/gcr/gcr-simple-collection.c
@@ -22,6 +22,7 @@
 #include "config.h"
 
 #include "gcr-collection.h"
+#include "gcr-deprecated.h"
 #include "gcr-internal.h"
 #include "gcr-simple-collection.h"
 
@@ -119,11 +120,20 @@ gcr_simple_collection_real_get_objects (GcrCollection *coll)
 	return g_hash_table_get_keys (self->pv->items);
 }
 
+static gboolean
+gcr_simple_collection_real_contains (GcrCollection *collection,
+                                     GObject *object)
+{
+	GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (collection);
+	return g_hash_table_lookup (self->pv->items, object) ? TRUE : FALSE;
+}
+
 static void
 gcr_collection_iface (GcrCollectionIface *iface)
 {
 	iface->get_length = gcr_simple_collection_real_get_length;
 	iface->get_objects = gcr_simple_collection_real_get_objects;
+	iface->contains = gcr_simple_collection_real_contains;
 }
 
 /* -----------------------------------------------------------------------------
@@ -187,6 +197,8 @@ gcr_simple_collection_remove (GcrSimpleCollection *self, GObject *object)
  *
  * Check if the collection contains a certain object.
  *
+ * Deprecated: use gcr_collection_contains() instead
+ *
  * Returns: %TRUE if the collection contains the object.
  */
 gboolean
@@ -194,5 +206,5 @@ gcr_simple_collection_contains (GcrSimpleCollection *self, GObject *object)
 {
 	g_return_val_if_fail (GCR_IS_SIMPLE_COLLECTION (self), FALSE);
 	g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
-	return g_hash_table_lookup (self->pv->items, object) ? TRUE : FALSE;
+	return gcr_collection_contains (GCR_COLLECTION (self), object);
 }
diff --git a/gcr/gcr-simple-collection.h b/gcr/gcr-simple-collection.h
index 3ee0947..52def96 100644
--- a/gcr/gcr-simple-collection.h
+++ b/gcr/gcr-simple-collection.h
@@ -61,9 +61,6 @@ void                gcr_simple_collection_add                     (GcrSimpleColl
 void                gcr_simple_collection_remove                  (GcrSimpleCollection *self,
                                                                    GObject *object);
 
-gboolean            gcr_simple_collection_contains                (GcrSimpleCollection *self,
-                                                                   GObject *object);
-
 G_END_DECLS
 
 #endif /* __GCR_SIMPLE_COLLECTION_H__ */



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