/* we try to be as forgiving as we possibly can here - this isn't a * validator. Almost nothing is considered a fatal error. We always * try to return *something*. */ static void parse (EVCard *evc, const char *str) { char *buf ; char *p; EVCardAttribute *attr; buf = make_valid_utf8 (str); //buf = fold_lines (buf); d(printf ("BEFORE FOLDING:\n")); d(printf (str)); d(printf ("\n\nAFTER FOLDING:\n")); d(printf (buf)); p = buf; attr = read_attribute (&p); if (!attr || attr->group || g_ascii_strcasecmp (attr->name, "begin")) { g_warning ("vcard began without a BEGIN:VCARD\n"); } if (attr && !g_ascii_strcasecmp (attr->name, "begin")) { e_vcard_attribute_free (attr); attr = NULL; } else if (attr) e_vcard_add_attribute (evc, attr); while (*p) { EVCardAttribute *next_attr = read_attribute (&p); if (next_attr) { attr = next_attr; if (g_ascii_strcasecmp (next_attr->name, "end")) e_vcard_add_attribute (evc, next_attr); else break; } } if (!attr || attr->group || g_ascii_strcasecmp (attr->name, "end")) { g_warning ("vcard ended without END:VCARD\n"); } if (attr && !g_ascii_strcasecmp (attr->name, "end")) e_vcard_attribute_free (attr); g_free (buf); evc->priv->attributes = g_list_reverse (evc->priv->attributes); }
/** * e_vcard_add_attribute_with_value: * @evcard: an #EVCard * @attr: an #EVCardAttribute to add * @value: a value to assign to the attribute * * Adds @attr to @evcard, setting it to @value. **/ void e_vcard_add_attribute_with_value (EVCard *evcard, EVCardAttribute *attr, const char *value) { g_return_if_fail (E_IS_VCARD (evcard)); g_return_if_fail (attr != NULL); e_vcard_attribute_add_value (attr, value); e_vcard_add_attribute (evcard, attr); }
static char *evcard_to_string(EVCard *evcard, unsigned int format, uint64_t filter) { EVCard *evcard2; GList *l; char *vcard; if (!filter) return e_vcard_to_string(evcard, EVC_FORMAT_VCARD_30); /* XXX There is no support for VCARD 2.1 at this time */ /* * Mandatory attributes for vCard 2.1 are VERSION ,N and TEL. * Mandatory attributes for vCard 3.0 are VERSION, N, FN and TEL */ filter = format == EVC_FORMAT_VCARD_30 ? filter | 0x87: filter | 0x85; l = e_vcard_get_attributes(evcard); evcard2 = e_vcard_new(); for (; l; l = g_list_next(l)) { EVCardAttribute *attrib = l->data; const char *name; int i; if (!attrib) continue; name = e_vcard_attribute_get_name(attrib); for (i = 0; attribute_mask[i] != NULL; i++) { if (!(filter & (1 << i))) continue; if (g_strcmp0(name, attribute_mask[i]) != 0) continue; e_vcard_add_attribute(evcard2, e_vcard_attribute_copy(attrib)); } } vcard = e_vcard_to_string(evcard2, format); g_object_unref(evcard2); return vcard; }
/** * e_vcard_add_attribute_with_values: * @evcard: an @EVCard * @attr: an #EVCardAttribute to add * @Varargs: a %NULL-terminated list of values to assign to the attribute * * Adds @attr to @evcard, assigning the list of values to it. **/ void e_vcard_add_attribute_with_values (EVCard *evcard, EVCardAttribute *attr, ...) { va_list ap; char *v; g_return_if_fail (E_IS_VCARD (evcard)); g_return_if_fail (attr != NULL); va_start (ap, attr); while ((v = va_arg (ap, char*))) { e_vcard_attribute_add_value (attr, v); } va_end (ap); e_vcard_add_attribute (evcard, attr); }
static EVCardAttribute * contacts_add_attr (EVCard *contact, const gchar *vcard_field) { const ContactsField *field = contacts_get_contacts_field (vcard_field); if (field) { guint j; /* Create missing attribute */ EVCardAttribute *attr = e_vcard_attribute_new ( "", vcard_field); /* Initialise values */ for (j = contacts_get_structured_field_size ( e_vcard_attribute_get_name (attr)); j > 0; j--) e_vcard_attribute_add_value (attr, ""); /* Add to contact */ e_vcard_add_attribute (contact, attr); return attr; } return NULL; }
static void contacts_entry_changed (GtkWidget *widget, EContactChangeData *data) { GList *v, *values = contacts_entries_get_values (data->widget, NULL); e_vcard_attribute_remove_values (data->attr); /* Note: First element of a structured field is type, so remove it */ if (g_list_length (values) > 1) { GList *type = g_list_last (values); values = g_list_remove_link (values, type); g_free (type->data); g_list_free (type); } for (v = g_list_last (values); v; v = v->prev) { e_vcard_attribute_add_value (data->attr, (const gchar *)v->data); } if (!g_ascii_strcasecmp (e_vcard_attribute_get_name (data->attr), EVC_FN)) { /* add N and X-EVOLUTION-FILE-AS attributes */ ENameWestern *name; gchar *file_as; EVCardAttribute *attr; EVCard *evc = E_VCARD (data->contact); name = e_name_western_parse ((char*)values->data); /* Add "N" attribute */ attr = e_vcard_get_attribute (evc, EVC_N); if (attr) e_vcard_attribute_remove_values (attr); else { attr = e_vcard_attribute_new ("", EVC_N); e_vcard_add_attribute (evc, attr); } #define SAFESTR(x) (x) ? x : "" e_vcard_attribute_add_value (attr, SAFESTR (name->last)); e_vcard_attribute_add_value (attr, SAFESTR (name->first)); e_vcard_attribute_add_value (attr, SAFESTR (name->middle)); e_vcard_attribute_add_value (attr, SAFESTR (name->prefix)); e_vcard_attribute_add_value (attr, SAFESTR (name->suffix)); /* Add file-as attribute for evolution */ file_as = g_strdup_printf ("%s, %s", name->last, name->first); attr = e_vcard_get_attribute (evc, EVC_X_FILE_AS); if (attr) e_vcard_remove_attribute (evc, attr); attr = e_vcard_attribute_new ("", EVC_X_FILE_AS); e_vcard_add_attribute_with_value (evc, attr, file_as); g_free (file_as); g_free (name); } g_list_foreach (values, (GFunc)g_free, NULL); g_list_free (values); *data->changed = TRUE; }