[glabels] Expose all supported fields in vcard backend



commit 0f07e3243d10acd2343adbc711bee89baf568023
Author: Jim Evins <evins snaught com>
Date:   Sun Nov 8 11:44:20 2009 -0500

    Expose all supported fields in vcard backend
    
    The original version of the vcard merge backend only supported 3 hard-coded
    fields.  This modification exposes all supported fields, via the libebook
    API.  It also uses the "pretty names" for field names, exactly as the
    evolution merge backend does.
    
    An "off-by-one" error in the evolution merge backend has also been fixed --
    exposing one more field.

 src/merge-evolution.c |    2 +-
 src/merge-vcard.c     |   74 +++++++++++++++++++++++++++----------------------
 2 files changed, 42 insertions(+), 34 deletions(-)
---
diff --git a/src/merge-evolution.c b/src/merge-evolution.c
index 36f7bf2..488dd3d 100644
--- a/src/merge-evolution.c
+++ b/src/merge-evolution.c
@@ -363,7 +363,7 @@ gl_merge_evolution_open (glMerge *merge)
                 *field_id = e_contact_field_id(iter->data);
 
                 /* above this value, the data aren't strings anymore */
-                if (*field_id >= E_CONTACT_LAST_SIMPLE_STRING) {
+                if (*field_id > E_CONTACT_LAST_SIMPLE_STRING) {
                         g_free (field_id);
                         continue;
                 }
diff --git a/src/merge-vcard.c b/src/merge-vcard.c
index 69d205d..27ee9b0 100644
--- a/src/merge-vcard.c
+++ b/src/merge-vcard.c
@@ -193,18 +193,17 @@ static GList *
 gl_merge_vcard_get_key_list (glMerge *merge)
 {
         glMergeVCard   *merge_vcard;
-        GList          *key_list;
+        GList          *key_list = NULL;
+        EContactField   field_id;
         
         gl_debug (DEBUG_MERGE, "BEGIN");
 
         merge_vcard = GL_MERGE_VCARD (merge);
 
-        /* extremely simple approach until I can list the available keys from the
-         * server, and return them. */
-        key_list = NULL;
-        key_list = g_list_append (key_list, g_strdup ("full_name"));
-        key_list = g_list_append (key_list, g_strdup ("home_address"));
-        key_list = g_list_append (key_list, g_strdup ("work_address"));
+        for ( field_id = E_CONTACT_FIELD_FIRST; field_id <= E_CONTACT_LAST_SIMPLE_STRING; field_id++ )
+        {
+                key_list = g_list_append (key_list, g_strdup (e_contact_pretty_name (field_id)));
+        }
 
         gl_debug (DEBUG_MERGE, "END");
 
@@ -218,8 +217,7 @@ gl_merge_vcard_get_key_list (glMerge *merge)
 static gchar *
 gl_merge_vcard_get_primary_key (glMerge *merge)
 {
-        /* For now, let's always assume the full name is the primary key. */
-        return g_strdup ("full_name");
+        return g_strdup (e_contact_pretty_name(E_CONTACT_FILE_AS));
 }
 
 
@@ -271,6 +269,7 @@ gl_merge_vcard_get_record (glMerge *merge)
 {
         glMergeVCard  *merge_vcard;
         glMergeRecord *record;
+        EContactField  field_id;
         glMergeField  *field;
 
         char *vcard;
@@ -294,26 +293,21 @@ gl_merge_vcard_get_record (glMerge *merge)
          * into the glMergeRecord structure. When done, free up the resources for
          * that contact */
 
-        /* get the full name */
-        field = g_new0 (glMergeField, 1);
-        field->key = g_strdup ("full_name");
-        field->value = g_strdup (e_contact_get_const(contact, E_CONTACT_FULL_NAME));
-
-        record->field_list = g_list_append (record->field_list, field);
-
-        /* get the home address */
-        field = g_new0 (glMergeField, 1);
-        field->key = g_strdup ("home_address");
-        field->value = g_strdup (e_contact_get_const(contact, E_CONTACT_ADDRESS_LABEL_HOME));
+        for ( field_id = E_CONTACT_FIELD_FIRST; field_id <= E_CONTACT_LAST_SIMPLE_STRING; field_id++ )
+        {
+                gchar *value;
+                value = g_strdup (e_contact_get_const (contact, field_id));
 
-        record->field_list = g_list_append (record->field_list, field);
+                if (value) {
+                        field = g_new0 (glMergeField, 1);
+                        field->key = g_strdup (e_contact_pretty_name (field_id));
+                        field->value = value;
+                        record->field_list = g_list_prepend (record->field_list, field);
+                }
+        }
 
-        /* get the work address */
-        field = g_new0 (glMergeField, 1);
-        field->key = g_strdup ("work_address");
-        field->value = g_strdup (e_contact_get_const(contact, E_CONTACT_ADDRESS_LABEL_WORK));
+        record->field_list = g_list_reverse (record->field_list);
 
-        record->field_list = g_list_append (record->field_list, field);
 
         /* free the contact */
         g_object_unref (contact);
@@ -363,17 +357,31 @@ parse_next_vcard (FILE *fp)
 
         vcard = g_malloc0(size);
 
-        while (fgets(line, sizeof(line), fp) && found_end == FALSE) {
-                if (found_begin == TRUE) {
-                        if (g_str_has_prefix(line, "END:VCARD")) { found_end = TRUE; }
-                } else {
-                        if (g_str_has_prefix(line, "BEGIN:VCARD")) { found_begin = TRUE; } 
-                        else { continue; }/* skip lines not in a vcard */
+        while (fgets(line, sizeof(line), fp) && found_end == FALSE)
+        {
+                if (found_begin == TRUE)
+                {
+                        if (g_ascii_strncasecmp(line, "END:VCARD", strlen("END:VCARD")) == 0)
+                        {
+                                found_end = TRUE;
+                        }
+                }
+                else
+                {
+                        if (g_ascii_strncasecmp(line, "BEGIN:VCARD", strlen("BEGIN:VCARD")) == 0)
+                        {
+                                found_begin = TRUE;
+                        } 
+                        else
+                        {
+                                continue; /* skip lines not in a vcard */
+                        }
                 }
 
                 /* if the buffer passed us isn't big enough, reallocate it */
                 cursize += strlen(line);
-                if (cursize >= size) {
+                if (cursize >= size)
+                {
                         size *= 2;
                         vcard = (char *)g_realloc(vcard, size); /* aborts program on error */
                 }



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