#include <libebook/e-book.h>

gboolean
e_book_glue_ebook_get_changes (EBook* ebook,
			       const char* change_id,
			       GSList** newcontacts,
			       GSList** updated,
			       GSList** removed,
			       GError** error)
{
  GList* changes = NULL;
  GList* l;
  EBookChange* ebc;
  EContact* contact;
  const char* uid = NULL;
  
  GSList *added = NULL, *modified = NULL, *deleted = NULL;

  if (!ebook)
    return FALSE;

  if (!e_book_get_changes (ebook, (char *)change_id, &changes, error))
    return FALSE;

  if (!changes)
    return FALSE;

  for (l = changes; l; l = l->next) {
    contact = NULL;
    ebc = l->data;

    switch (ebc->change_type) {
    case E_BOOK_CHANGE_CARD_ADDED:
      contact = e_contact_duplicate (ebc->contact);
      added = g_slist_prepend (added, contact);
      break;
    case E_BOOK_CHANGE_CARD_MODIFIED:
      contact = e_contact_duplicate (ebc->contact);
      modified = g_slist_prepend (modified, contact);
      break;
    case E_BOOK_CHANGE_CARD_DELETED:
      uid = e_contact_get_const (ebc->contact, E_CONTACT_UID);
      deleted = g_slist_prepend (deleted, g_strdup (uid));
      break;
    }    
  }

  e_book_free_change_list (changes);

  if (added)
    *newcontacts = g_slist_reverse (added);

  if (modified)
    *updated = g_slist_reverse (modified);

  if (deleted)
    *removed = g_slist_reverse (deleted);

  return TRUE;
}


syntax highlighted by Code2HTML, v. 0.9.1