The attached patch should handle embedded vcards properly. It will break if there are several fields embedding vcards though. I can fix that if you feel that's important to get that right. Christophe Le sam, 01/05/2004 à 09:11 -0700, Chris Toshok a écrit : > this won't work, as vcards can actually contain other embedded vcards. > Of course, those vcards probably break the parser, but we shouldn't be > breaking them elsewhere as well. > > Chris > > On Sat, 2004-05-01 at 14:25 +0200, Christophe Fergeau wrote: > > Hi, > > > > eab_contact_list_from_string currently expects vcards to be separated by > > 2 new lines characters when they are concatenated in a single file. The > > attached patch looks for an "END:VCARD" string instead. > > > > Christophe > _______________________________________________ > Evolution-patches mailing list > Evolution-patches lists ximian com > http://lists.ximian.com/mailman/listinfo/evolution-patches > >
Index: addressbook/ChangeLog =================================================================== RCS file: /cvs/gnome/evolution/addressbook/ChangeLog,v retrieving revision 1.1684 diff -u -r1.1684 ChangeLog --- addressbook/ChangeLog 30 Apr 2004 18:23:16 -0000 1.1684 +++ addressbook/ChangeLog 2 May 2004 11:15:18 -0000 @@ -1,3 +1,9 @@ +2004-05-01 Christophe Fergeau <teuf gnome org> + + * util/eab-book-util.c (eab_contact_list_from_string): don't assume + that if a file contains several vcards, they will be neatly separated + by \n\n + 2004-04-30 Chris Toshok <toshok ximian com> * util/e-destination.c (e_destination_set_contact): don't use Index: addressbook/util/eab-book-util.c =================================================================== RCS file: /cvs/gnome/evolution/addressbook/util/eab-book-util.c,v retrieving revision 1.4 diff -u -r1.4 eab-book-util.c --- addressbook/util/eab-book-util.c 23 Jan 2004 19:35:02 -0000 1.4 +++ addressbook/util/eab-book-util.c 2 May 2004 11:15:18 -0000 @@ -179,46 +179,80 @@ return retval; } -GList* -eab_contact_list_from_string (const char *str) + +#define VCARD_START "BEGIN:VCARD" +#define VCARD_END "END:VCARD" + +static gchar * +eab_get_contact_from_string (const char *str) { - GList *contacts = NULL; - GString *gstr = g_string_new (""); - char *p = (char*)str; - char *q; - char *blank_line; - - while (*p) { - if (*p != '\r') g_string_append_c (gstr, *p); - - p++; - } - - p = g_string_free (gstr, FALSE); - q = p; - do { - char *temp; - - blank_line = strstr (q, "\n\n"); - if (blank_line) { - temp = g_strndup (q, blank_line - q); - } - else { - temp = g_strdup (q); + gchar *begin; + gchar *end; + gchar *it; + int count; + int i; + gchar *result; + + if (str == NULL) { + return NULL; + } + + begin = strstr (str, VCARD_START); + if (begin == NULL) { + return NULL; + } + end = strstr (begin, VCARD_END); + if (end == NULL) { + return NULL; + } + end += strlen (VCARD_END); + + it = strstr (begin + strlen (VCARD_START), VCARD_START); + count = 0; + /* Skip BEGIN:VCARD tags of embedded VCards */ + while ((it != NULL) && (it < end)) { + it = strstr (it + strlen (VCARD_START), VCARD_START); + count++; + } + if (it == NULL) { + goto done; + } + + it = end; + /* Find the real END:VCARD tag if the VCard contains embedded VCards */ + for (i = 0; i < count; i++) { + it = strstr (it, VCARD_END); + if (it == NULL) { + goto done; } + it += strlen (VCARD_END); + } + end = it; - contacts = g_list_append (contacts, e_contact_new_from_vcard (temp)); + done: + result = g_strndup (begin, end - begin + 1); + return g_strstrip (result); +} - g_free (temp); - if (blank_line) - q = blank_line + 2; - else - q = NULL; - } while (blank_line); +GList* +eab_contact_list_from_string (const char *str) +{ + GList *contacts = NULL; + gchar *it = str; + gchar *vcard = g_strdup (""); - g_free (p); + while (vcard != NULL) { + gchar *next; + it += strlen (vcard); + next = eab_get_contact_from_string (it); + g_free (vcard); + vcard = next; + if ((vcard != NULL) && (vcard != '\0')) { + contacts = g_list_append (contacts, e_contact_new_from_vcard (vcard)); + } + } return contacts; }
Attachment:
signature.asc
Description: Ceci est une partie de message =?ISO-8859-1?Q?num=E9riquement?= =?ISO-8859-1?Q?_sign=E9e?=