soylent r246 - trunk/libsoylent



Author: svenp
Date: Wed Jul 30 09:38:27 2008
New Revision: 246
URL: http://svn.gnome.org/viewvc/soylent?rev=246&view=rev

Log:
loading people implemented (processing eview signals)
getting all people works

Modified:
   trunk/libsoylent/sl-book.c
   trunk/libsoylent/sl-book.h

Modified: trunk/libsoylent/sl-book.c
==============================================================================
--- trunk/libsoylent/sl-book.c	(original)
+++ trunk/libsoylent/sl-book.c	Wed Jul 30 09:38:27 2008
@@ -45,6 +45,9 @@
 {
   GError *error;
   EBook *ebook;
+  EBookView *eview;
+  GMainLoop *view_wait_loop;
+  GList *people;
 };
 
 static GObjectClass *parent_class = NULL;
@@ -56,9 +59,18 @@
   const GValue *value, GParamSpec *pspec);
 static void sl_book_get_property (GObject *object, guint property_id,
   GValue *value, GParamSpec *pspec);
-static SlBook *sl_book_new (EBook *ebook);
+static SlBook *sl_book_new (EBook *ebook, GError **error);
 static SlBook *sl_book_new_from_source (ESource *source, GError **error);
 
+static void eview_contacts_added (EBookView *eview, GList *econtacts, 
+                                  SlBook *self);
+static void eview_contacts_changed (EBookView *eview, GList *econtacts, 
+                                    SlBook *self);
+static void eview_contacts_removed (EBookView *eview, GList *econtact_ids, 
+                                    SlBook *self);
+static void eview_sequence_complete (EBookView *eview, EBookViewStatus status, 
+                                     SlBook *self);
+
 GType
 sl_book_get_type (void)
 {
@@ -325,7 +337,7 @@
       return NULL;
     }
   
-  return sl_book_new (ebook);
+  return sl_book_new (ebook, error);
 }
 
 gboolean
@@ -375,11 +387,47 @@
   return TRUE;
 }
 
+gboolean
+sl_book_constr (SlBook *self, GError **error)
+{
+  self->priv->people = NULL;
+  self->priv->eview = NULL;
+  self->priv->view_wait_loop = g_main_loop_new (NULL, FALSE);
+  
+  /* this will query all contacts */
+  EBookQuery *query = e_book_query_any_field_contains ("");
+  
+  /* TODO: Here you can query only certain fields, this would be a great
+   * performance improvement. But we definitely want a list of all people and
+   * for every person a list of all attributes. Is this possible without
+   * querying all fields? */
+  /* TODO: this would also need some refactoring for SlAttribute to support
+   * lazy loading */
+  if (!e_book_get_book_view (self->priv->ebook, query, NULL, 0, 
+                             &self->priv->eview, error))
+    {
+      return FALSE;
+    }
+  
+  g_object_connect (self->priv->eview,
+    "signal::contacts-added", G_CALLBACK (eview_contacts_added), self,
+    "signal::contacts-changed", G_CALLBACK (eview_contacts_changed), self,
+    "signal::contacts-removed", G_CALLBACK (eview_contacts_removed), self,
+    "signal::sequence-complete", G_CALLBACK (eview_sequence_complete), self,
+    NULL);
+  
+  e_book_view_start (self->priv->eview);
+  g_main_loop_run (self->priv->view_wait_loop);
+  
+  return TRUE;
+}
+
 static SlBook *
-sl_book_new (EBook *ebook)
+sl_book_new (EBook *ebook, GError **error)
 {
   g_return_val_if_fail (ebook != NULL && E_IS_BOOK (ebook), NULL);
   SlBook *self = g_object_new (SL_BOOK_TYPE, "ebook", ebook, NULL);
+  sl_book_constr (self, error);
   return self;
 }
 
@@ -399,7 +447,7 @@
       return NULL;
     }
   
-  SlBook *self = sl_book_new (ebook);
+  SlBook *self = sl_book_new (ebook, error);
   g_object_unref (ebook);
   return self;
 }
@@ -419,6 +467,8 @@
   
   sl_entity_set_ebook (entity, self->priv->ebook);
   
+  self->priv->people = g_list_append (self->priv->people, person);
+  
   return TRUE;
 }
 
@@ -431,14 +481,17 @@
     {
       return FALSE;
     }
+  
+  self->priv->people = g_list_remove (self->priv->people, person);
+  
   return TRUE;
 }
 
 GList *
 sl_book_get_people (SlBook *self)
 {
-  g_warning("%s not implemented", __FUNCTION__);
-  return NULL;
+  /* TODO: make this with a libsoylent-query? */
+  return self->priv->people;
 }
 
 SlPerson *
@@ -447,3 +500,44 @@
   g_warning("%s not implemented", __FUNCTION__);
   return NULL;
 }
+
+static void
+eview_contacts_added (EBookView *eview, GList *econtacts, SlBook *self)
+{
+  /* TODO: consider to forget econtact here again */
+  for (; econtacts != NULL; econtacts = econtacts->next)
+    {
+      EContact *econtact = econtacts->data;
+      SlPerson *person = sl_person_new_with_econtact (econtact);
+      self->priv->people = g_list_append (self->priv->people, person);
+    }
+  /* TODO: generate signal if view_wait_loop == NULL */
+}
+
+static void
+eview_contacts_changed (EBookView *eview, GList *econtacts, SlBook *self)
+{
+  g_warning("%s not implemented", __FUNCTION__);
+}
+
+static void
+eview_contacts_removed (EBookView *eview, GList *econtact_ids, SlBook *self)
+{
+  g_warning("%s not implemented", __FUNCTION__);
+}
+
+static void
+eview_sequence_complete (EBookView *eview, EBookViewStatus status, SlBook *self) {
+  if (status != E_BOOK_VIEW_STATUS_OK)
+    {
+      g_critical ("eview status is: %d", status);
+      return;
+    }
+  
+  if (self->priv->view_wait_loop != NULL)
+    {
+      g_main_loop_quit (self->priv->view_wait_loop);
+      g_main_loop_unref (self->priv->view_wait_loop);
+      self->priv->view_wait_loop = NULL;
+    }
+}

Modified: trunk/libsoylent/sl-book.h
==============================================================================
--- trunk/libsoylent/sl-book.h	(original)
+++ trunk/libsoylent/sl-book.h	Wed Jul 30 09:38:27 2008
@@ -85,6 +85,8 @@
 
 gboolean sl_book_setup (GError **error);
 
+gboolean sl_book_constr (SlBook *self, GError **error);
+
 GList *sl_book_get_books (void);
 gboolean sl_book_exists (const gchar *name);
 SlBook *sl_book_create (const gchar *name, GError **error);



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