diff options
Diffstat (limited to 'addressbook/backend/ebook/e-card.c')
-rw-r--r-- | addressbook/backend/ebook/e-card.c | 454 |
1 files changed, 280 insertions, 174 deletions
diff --git a/addressbook/backend/ebook/e-card.c b/addressbook/backend/ebook/e-card.c index 57619b0080..4ac7dd0efa 100644 --- a/addressbook/backend/ebook/e-card.c +++ b/addressbook/backend/ebook/e-card.c @@ -13,6 +13,7 @@ #include "e-card.h" #include <gal/util/e-i18n.h> +#include <gal/widgets/e-unicode.h> #include <ctype.h> #include <stdio.h> @@ -82,7 +83,7 @@ enum { #if 0 static VObject *card_convert_to_vobject (ECard *crd); #endif -static void parse(ECard *card, VObject *vobj); +static void parse(ECard *card, VObject *vobj, char *default_charset); static void e_card_init (ECard *card); static void e_card_class_init (ECardClass *klass); @@ -90,48 +91,48 @@ static void e_card_destroy (GtkObject *object); static void e_card_set_arg (GtkObject *object, GtkArg *arg, guint arg_id); static void e_card_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); -static void assign_string(VObject *vobj, char **string); +static void assign_string(VObject *vobj, char *default_charset, char **string); -char *e_v_object_get_child_value(VObject *vobj, char *name); +char *e_v_object_get_child_value(VObject *vobj, char *name, char *default_charset); static ECardDate e_card_date_from_string (char *str); -static void parse_bday(ECard *card, VObject *object); -static void parse_full_name(ECard *card, VObject *object); -static void parse_file_as(ECard *card, VObject *object); -static void parse_name(ECard *card, VObject *object); -static void parse_email(ECard *card, VObject *object); -static void parse_phone(ECard *card, VObject *object); -static void parse_address(ECard *card, VObject *object); -static void parse_address_label(ECard *card, VObject *object); -static void parse_url(ECard *card, VObject *object); -static void parse_org(ECard *card, VObject *object); -static void parse_office(ECard *card, VObject *object); -static void parse_title(ECard *card, VObject *object); -static void parse_role(ECard *card, VObject *object); -static void parse_manager(ECard *card, VObject *object); -static void parse_assistant(ECard *card, VObject *object); -static void parse_nickname(ECard *card, VObject *object); -static void parse_spouse(ECard *card, VObject *object); -static void parse_anniversary(ECard *card, VObject *object); -static void parse_mailer(ECard *card, VObject *object); -static void parse_fburl(ECard *card, VObject *object); -static void parse_note(ECard *card, VObject *object); -static void parse_related_contacts(ECard *card, VObject *object); -static void parse_categories(ECard *card, VObject *object); -static void parse_wants_html(ECard *card, VObject *object); -static void parse_list(ECard *card, VObject *object); -static void parse_list_show_addresses(ECard *card, VObject *object); -static void parse_arbitrary(ECard *card, VObject *object); -static void parse_id(ECard *card, VObject *object); -static void parse_last_use(ECard *card, VObject *object); -static void parse_use_score(ECard *card, VObject *object); +static void parse_bday(ECard *card, VObject *object, char *default_charset); +static void parse_full_name(ECard *card, VObject *object, char *default_charset); +static void parse_file_as(ECard *card, VObject *object, char *default_charset); +static void parse_name(ECard *card, VObject *object, char *default_charset); +static void parse_email(ECard *card, VObject *object, char *default_charset); +static void parse_phone(ECard *card, VObject *object, char *default_charset); +static void parse_address(ECard *card, VObject *object, char *default_charset); +static void parse_address_label(ECard *card, VObject *object, char *default_charset); +static void parse_url(ECard *card, VObject *object, char *default_charset); +static void parse_org(ECard *card, VObject *object, char *default_charset); +static void parse_office(ECard *card, VObject *object, char *default_charset); +static void parse_title(ECard *card, VObject *object, char *default_charset); +static void parse_role(ECard *card, VObject *object, char *default_charset); +static void parse_manager(ECard *card, VObject *object, char *default_charset); +static void parse_assistant(ECard *card, VObject *object, char *default_charset); +static void parse_nickname(ECard *card, VObject *object, char *default_charset); +static void parse_spouse(ECard *card, VObject *object, char *default_charset); +static void parse_anniversary(ECard *card, VObject *object, char *default_charset); +static void parse_mailer(ECard *card, VObject *object, char *default_charset); +static void parse_fburl(ECard *card, VObject *object, char *default_charset); +static void parse_note(ECard *card, VObject *object, char *default_charset); +static void parse_related_contacts(ECard *card, VObject *object, char *default_charset); +static void parse_categories(ECard *card, VObject *object, char *default_charset); +static void parse_wants_html(ECard *card, VObject *object, char *default_charset); +static void parse_list(ECard *card, VObject *object, char *default_charset); +static void parse_list_show_addresses(ECard *card, VObject *object, char *default_charset); +static void parse_arbitrary(ECard *card, VObject *object, char *default_charset); +static void parse_id(ECard *card, VObject *object, char *default_charset); +static void parse_last_use(ECard *card, VObject *object, char *default_charset); +static void parse_use_score(ECard *card, VObject *object, char *default_charset); static ECardPhoneFlags get_phone_flags (VObject *vobj); static void set_phone_flags (VObject *vobj, ECardPhoneFlags flags); static ECardAddressFlags get_address_flags (VObject *vobj); static void set_address_flags (VObject *vobj, ECardAddressFlags flags); -typedef void (* ParsePropertyFunc) (ECard *card, VObject *object); +typedef void (* ParsePropertyFunc) (ECard *card, VObject *object, char *default_charset); struct { char *key; @@ -203,20 +204,14 @@ e_card_get_type (void) return card_type; } -/** - * e_card_new: - * @vcard: a string in vCard format - * - * Returns: a new #ECard that wraps the @vcard. - */ ECard * -e_card_new (char *vcard) +e_card_new_with_default_charset (char *vcard, char *default_charset) { ECard *card = E_CARD(gtk_type_new(e_card_get_type())); VObject *vobj = Parse_MIME(vcard, strlen(vcard)); while(vobj) { VObject *next; - parse(card, vobj); + parse(card, vobj, default_charset); next = nextVObjectInList(vobj); cleanVObject(vobj); vobj = next; @@ -230,10 +225,22 @@ e_card_new (char *vcard) return card; } +/** + * e_card_new: + * @vcard: a string in vCard format + * + * Returns: a new #ECard that wraps the @vcard. + */ +ECard * +e_card_new (char *vcard) +{ + return e_card_new_with_default_charset (vcard, "UTF-8"); +} + ECard * e_card_duplicate(ECard *card) { - char *vcard = e_card_get_vcard(card); + char *vcard = e_card_get_vcard_assume_utf8(card); ECard *new_card = e_card_new(vcard); g_free (vcard); @@ -370,35 +377,50 @@ e_card_date_to_string (ECardDate *dt) } static VObject * -e_card_get_vobject (ECard *card) +addPropValueUTF8(VObject *o, const char *p, const char *v) +{ + VObject *prop = addPropValue (o, p, v); + if (!e_utf8_is_ascii (v)) + addPropValue (prop, "CHARSET", "UTF-8"); + return prop; +} + +#define ADD_PROP_VALUE(o, p, v) (assumeUTF8 ? (addPropValue ((o), (p), (v))) : addPropValueUTF8 ((o), (p), (v))) +#define ADD_PROP_VALUE_SET_IS_ASCII(o, p, v) (addPropValue ((o), (p), (v)), is_ascii = is_ascii && e_utf8_is_ascii ((v))) + +static VObject * +e_card_get_vobject (ECard *card, gboolean assumeUTF8) { VObject *vobj; vobj = newVObject (VCCardProp); if ( card->file_as && *card->file_as ) - addPropValue(vobj, "X-EVOLUTION-FILE-AS", card->file_as); + ADD_PROP_VALUE(vobj, "X-EVOLUTION-FILE-AS", card->file_as); else if (card->file_as) addProp(vobj, "X-EVOLUTION-FILE_AS"); if ( card->fname ) - addPropValue(vobj, VCFullNameProp, card->fname); + ADD_PROP_VALUE(vobj, VCFullNameProp, card->fname); else if (card->fname) addProp(vobj, VCFullNameProp); if ( card->name && (card->name->prefix || card->name->given || card->name->additional || card->name->family || card->name->suffix) ) { VObject *nameprop; + gboolean is_ascii = TRUE; nameprop = addProp(vobj, VCNameProp); if ( card->name->prefix ) - addPropValue(nameprop, VCNamePrefixesProp, card->name->prefix); - if ( card->name->given ) - addPropValue(nameprop, VCGivenNameProp, card->name->given); + ADD_PROP_VALUE_SET_IS_ASCII(nameprop, VCNamePrefixesProp, card->name->prefix); + if ( card->name->given ) + ADD_PROP_VALUE_SET_IS_ASCII(nameprop, VCGivenNameProp, card->name->given); if ( card->name->additional ) - addPropValue(nameprop, VCAdditionalNamesProp, card->name->additional); + ADD_PROP_VALUE_SET_IS_ASCII(nameprop, VCAdditionalNamesProp, card->name->additional); if ( card->name->family ) - addPropValue(nameprop, VCFamilyNameProp, card->name->family); + ADD_PROP_VALUE_SET_IS_ASCII(nameprop, VCFamilyNameProp, card->name->family); if ( card->name->suffix ) - addPropValue(nameprop, VCNameSuffixesProp, card->name->suffix); + ADD_PROP_VALUE_SET_IS_ASCII(nameprop, VCNameSuffixesProp, card->name->suffix); + if (!(is_ascii || assumeUTF8)) + addPropValue (nameprop, "CHARSET", "UTF-8"); } else if (card->name) addProp(vobj, VCNameProp); @@ -409,24 +431,28 @@ e_card_get_vobject (ECard *card) for ( ; e_iterator_is_valid(iterator) ;e_iterator_next(iterator) ) { VObject *addressprop; ECardDeliveryAddress *address = (ECardDeliveryAddress *) e_iterator_get(iterator); + gboolean is_ascii = TRUE; + addressprop = addProp(vobj, VCAdrProp); set_address_flags (addressprop, address->flags); if ( address->po ) - addPropValue(addressprop, VCPostalBoxProp, address->po); + ADD_PROP_VALUE_SET_IS_ASCII(addressprop, VCPostalBoxProp, address->po); if ( address->ext ) - addPropValue(addressprop, VCExtAddressProp, address->ext); + ADD_PROP_VALUE_SET_IS_ASCII(addressprop, VCExtAddressProp, address->ext); if ( address->street ) - addPropValue(addressprop, VCStreetAddressProp, address->street); + ADD_PROP_VALUE_SET_IS_ASCII(addressprop, VCStreetAddressProp, address->street); if ( address->city ) - addPropValue(addressprop, VCCityProp, address->city); + ADD_PROP_VALUE_SET_IS_ASCII(addressprop, VCCityProp, address->city); if ( address->region ) - addPropValue(addressprop, VCRegionProp, address->region); + ADD_PROP_VALUE_SET_IS_ASCII(addressprop, VCRegionProp, address->region); if ( address->code ) - addPropValue(addressprop, VCPostalCodeProp, address->code); + ADD_PROP_VALUE_SET_IS_ASCII(addressprop, VCPostalCodeProp, address->code); if ( address->country ) - addPropValue(addressprop, VCCountryNameProp, address->country); + ADD_PROP_VALUE_SET_IS_ASCII(addressprop, VCCountryNameProp, address->country); addProp(addressprop, VCQuotedPrintableProp); + if (!(is_ascii || assumeUTF8)) + addPropValue (addressprop, "CHARSET", "UTF-8"); } gtk_object_unref(GTK_OBJECT(iterator)); } @@ -437,7 +463,7 @@ e_card_get_vobject (ECard *card) VObject *labelprop; ECardAddrLabel *address_label = (ECardAddrLabel *) e_iterator_get(iterator); if (address_label->data) - labelprop = addPropValue(vobj, VCDeliveryLabelProp, address_label->data); + labelprop = ADD_PROP_VALUE(vobj, VCDeliveryLabelProp, address_label->data); else labelprop = addProp(vobj, VCDeliveryLabelProp); @@ -452,7 +478,7 @@ e_card_get_vobject (ECard *card) for ( ; e_iterator_is_valid(iterator) ;e_iterator_next(iterator) ) { VObject *phoneprop; ECardPhone *phone = (ECardPhone *) e_iterator_get(iterator); - phoneprop = addPropValue(vobj, VCTelephoneProp, phone->number); + phoneprop = ADD_PROP_VALUE(vobj, VCTelephoneProp, phone->number); set_phone_flags (phoneprop, phone->flags); } @@ -463,7 +489,7 @@ e_card_get_vobject (ECard *card) EIterator *iterator = e_list_get_iterator(card->email); for ( ; e_iterator_is_valid(iterator) ;e_iterator_next(iterator) ) { VObject *emailprop; - emailprop = addPropValue(vobj, VCEmailAddressProp, (char *) e_iterator_get(iterator)); + emailprop = ADD_PROP_VALUE(vobj, VCEmailAddressProp, (char *) e_iterator_get(iterator)); addProp (emailprop, VCInternetProp); } gtk_object_unref(GTK_OBJECT(iterator)); @@ -472,81 +498,84 @@ e_card_get_vobject (ECard *card) if ( card->bday ) { char *value; value = e_card_date_to_string (card->bday); - addPropValue(vobj, VCBirthDateProp, value); + ADD_PROP_VALUE(vobj, VCBirthDateProp, value); g_free(value); } if (card->url) - addPropValue(vobj, VCURLProp, card->url); + ADD_PROP_VALUE(vobj, VCURLProp, card->url); if (card->org || card->org_unit) { VObject *orgprop; + gboolean is_ascii = TRUE; orgprop = addProp(vobj, VCOrgProp); if (card->org) - addPropValue(orgprop, VCOrgNameProp, card->org); + ADD_PROP_VALUE_SET_IS_ASCII(orgprop, VCOrgNameProp, card->org); if (card->org_unit) - addPropValue(orgprop, VCOrgUnitProp, card->org_unit); + ADD_PROP_VALUE_SET_IS_ASCII(orgprop, VCOrgUnitProp, card->org_unit); + if (!(is_ascii || assumeUTF8)) + addPropValue (orgprop, "CHARSET", "UTF-8"); } if (card->office) - addPropValue(vobj, "X-EVOLUTION-OFFICE", card->office); + ADD_PROP_VALUE(vobj, "X-EVOLUTION-OFFICE", card->office); if (card->title) - addPropValue(vobj, VCTitleProp, card->title); + ADD_PROP_VALUE(vobj, VCTitleProp, card->title); if (card->role) - addPropValue(vobj, VCBusinessRoleProp, card->role); + ADD_PROP_VALUE(vobj, VCBusinessRoleProp, card->role); if (card->manager) - addPropValue(vobj, "X-EVOLUTION-MANAGER", card->manager); + ADD_PROP_VALUE(vobj, "X-EVOLUTION-MANAGER", card->manager); if (card->assistant) - addPropValue(vobj, "X-EVOLUTION-ASSISTANT", card->assistant); + ADD_PROP_VALUE(vobj, "X-EVOLUTION-ASSISTANT", card->assistant); if (card->nickname) - addPropValue(vobj, "NICKNAME", card->nickname); + ADD_PROP_VALUE(vobj, "NICKNAME", card->nickname); if (card->spouse) - addPropValue(vobj, "X-EVOLUTION-SPOUSE", card->spouse); + ADD_PROP_VALUE(vobj, "X-EVOLUTION-SPOUSE", card->spouse); if ( card->anniversary ) { char *value; value = e_card_date_to_string (card->anniversary); - addPropValue(vobj, "X-EVOLUTION-ANNIVERSARY", value); + ADD_PROP_VALUE(vobj, "X-EVOLUTION-ANNIVERSARY", value); g_free(value); } if (card->mailer) { - addPropValue(vobj, VCMailerProp, card->mailer); + ADD_PROP_VALUE(vobj, VCMailerProp, card->mailer); } if (card->fburl) - addPropValue(vobj, "FBURL", card->fburl); + ADD_PROP_VALUE(vobj, "FBURL", card->fburl); if (card->note) { VObject *noteprop; - noteprop = addPropValue(vobj, VCNoteProp, card->note); + noteprop = ADD_PROP_VALUE(vobj, VCNoteProp, card->note); addProp(noteprop, VCQuotedPrintableProp); } if (card->last_use) { char *value; value = e_card_date_to_string (card->last_use); - addPropValue (vobj, "X-EVOLUTION-LAST-USE", value); + ADD_PROP_VALUE (vobj, "X-EVOLUTION-LAST-USE", value); g_free (value); } if (card->raw_use_score > 0) { char *value; value = g_strdup_printf ("%f", card->raw_use_score); - addPropValue (vobj, "X-EVOLUTION-USE-SCORE", value); + ADD_PROP_VALUE (vobj, "X-EVOLUTION-USE-SCORE", value); g_free (value); } if (card->related_contacts && *card->related_contacts) { - addPropValue(vobj, XEV_RELATED_CONTACTS, card->related_contacts); + ADD_PROP_VALUE(vobj, XEV_RELATED_CONTACTS, card->related_contacts); } if (card->categories) { @@ -571,17 +600,17 @@ e_card_get_vobject (ECard *card) stringptr --; *stringptr = 0; } - addPropValue (vobj, "CATEGORIES", string); + ADD_PROP_VALUE (vobj, "CATEGORIES", string); g_free(string); } if (card->wants_html_set) { - addPropValue (vobj, XEV_WANTS_HTML, card->wants_html ? "TRUE" : "FALSE"); + ADD_PROP_VALUE (vobj, XEV_WANTS_HTML, card->wants_html ? "TRUE" : "FALSE"); } if (card->list) { - addPropValue (vobj, XEV_LIST, "TRUE"); - addPropValue (vobj, XEV_LIST_SHOW_ADDRESSES, card->list_show_addresses ? "TRUE" : "FALSE"); + ADD_PROP_VALUE (vobj, XEV_LIST, "TRUE"); + ADD_PROP_VALUE (vobj, XEV_LIST_SHOW_ADDRESSES, card->list_show_addresses ? "TRUE" : "FALSE"); } if (card->arbitrary) { @@ -590,12 +619,12 @@ e_card_get_vobject (ECard *card) const ECardArbitrary *arbitrary = e_iterator_get(iterator); VObject *arb_object; if (arbitrary->value) { - arb_object = addPropValue (vobj, XEV_ARBITRARY, arbitrary->value); + arb_object = ADD_PROP_VALUE (vobj, XEV_ARBITRARY, arbitrary->value); } else { arb_object = addProp (vobj, XEV_ARBITRARY); } if (arbitrary->type) { - addPropValue (arb_object, "TYPE", arbitrary->type); + ADD_PROP_VALUE (arb_object, "TYPE", arbitrary->type); } if (arbitrary->key) { addProp (arb_object, arbitrary->key); @@ -603,7 +632,7 @@ e_card_get_vobject (ECard *card) } } - addPropValue (vobj, VCUniqueStringProp, card->id); + ADD_PROP_VALUE (vobj, VCUniqueStringProp, card->id); #if 0 if (crd->photo.prop.used) { @@ -618,7 +647,7 @@ e_card_get_vobject (ECard *card) for (node = crd->xtension.l; node; node = node->next) { CardXProperty *xp = (CardXProperty *) node->data; - addPropValue (vobj, xp->name, xp->data); + ADD_PROP_VALUE (vobj, xp->name, xp->data); add_CardProperty (vobj, &xp->prop); } } @@ -627,7 +656,7 @@ e_card_get_vobject (ECard *card) char *str; str = card_timezn_str (crd->timezn); - vprop = addPropValue (vobj, VCTimeZoneProp, str); + vprop = ADD_PROP_VALUE (vobj, VCTimeZoneProp, str); free (str); add_CardProperty (vprop, &crd->timezn.prop); } @@ -636,7 +665,7 @@ e_card_get_vobject (ECard *card) char *str; str = card_geopos_str (crd->geopos); - vprop = addPropValue (vobj, VCGeoLocationProp, str); + vprop = ADD_PROP_VALUE (vobj, VCGeoLocationProp, str); free (str); add_CardProperty (vprop, &crd->geopos.prop); } @@ -656,7 +685,7 @@ e_card_get_vobject (ECard *card) vprop = addPropSizedValue (vobj, VCPronunciationProp, crd->sound.data, crd->sound.size); else - vprop = addPropValue (vobj, VCPronunciationProp, + vprop = ADD_PROP_VALUE (vobj, VCPronunciationProp, crd->sound.data); add_SoundType (vprop, crd->sound.type); @@ -664,7 +693,7 @@ e_card_get_vobject (ECard *card) } if (crd->key.prop.used) { - vprop = addPropValue (vobj, VCPublicKeyProp, crd->key.data); + vprop = ADD_PROP_VALUE (vobj, VCPublicKeyProp, crd->key.data); add_KeyType (vprop, crd->key.type); add_CardProperty (vprop, &crd->key.prop); } @@ -684,7 +713,21 @@ e_card_get_vcard (ECard *card) VObject *vobj; char *temp, *ret_val; - vobj = e_card_get_vobject (card); + vobj = e_card_get_vobject (card, FALSE); + temp = writeMemVObject(NULL, NULL, vobj); + ret_val = g_strdup(temp); + free(temp); + cleanVObject(vobj); + return ret_val; +} + +char * +e_card_get_vcard_assume_utf8 (ECard *card) +{ + VObject *vobj; + char *temp, *ret_val; + + vobj = e_card_get_vobject (card, TRUE); temp = writeMemVObject(NULL, NULL, vobj); ret_val = g_strdup(temp); free(temp); @@ -711,7 +754,7 @@ e_card_list_get_vcard (GList *list) VObject *tempvobj; ECard *card = list->data; - tempvobj = e_card_get_vobject (card); + tempvobj = e_card_get_vobject (card, FALSE); addList (&vobj, tempvobj); } temp = writeMemVObjects(NULL, NULL, vobj); @@ -722,43 +765,43 @@ e_card_list_get_vcard (GList *list) } static void -parse_file_as(ECard *card, VObject *vobj) +parse_file_as(ECard *card, VObject *vobj, char *default_charset) { if ( card->file_as ) g_free(card->file_as); - assign_string(vobj, &(card->file_as)); + assign_string(vobj, default_charset, &(card->file_as)); } static void -parse_name(ECard *card, VObject *vobj) +parse_name(ECard *card, VObject *vobj, char *default_charset) { if ( card->name ) { e_card_name_free(card->name); } card->name = g_new(ECardName, 1); - card->name->family = e_v_object_get_child_value (vobj, VCFamilyNameProp); - card->name->given = e_v_object_get_child_value (vobj, VCGivenNameProp); - card->name->additional = e_v_object_get_child_value (vobj, VCAdditionalNamesProp); - card->name->prefix = e_v_object_get_child_value (vobj, VCNamePrefixesProp); - card->name->suffix = e_v_object_get_child_value (vobj, VCNameSuffixesProp); + card->name->family = e_v_object_get_child_value (vobj, VCFamilyNameProp, default_charset); + card->name->given = e_v_object_get_child_value (vobj, VCGivenNameProp, default_charset); + card->name->additional = e_v_object_get_child_value (vobj, VCAdditionalNamesProp, default_charset); + card->name->prefix = e_v_object_get_child_value (vobj, VCNamePrefixesProp, default_charset); + card->name->suffix = e_v_object_get_child_value (vobj, VCNameSuffixesProp, default_charset); } static void -parse_full_name(ECard *card, VObject *vobj) +parse_full_name(ECard *card, VObject *vobj, char *default_charset) { if ( card->fname ) g_free(card->fname); - assign_string(vobj, &(card->fname)); + assign_string(vobj, default_charset, &(card->fname)); } static void -parse_email(ECard *card, VObject *vobj) +parse_email(ECard *card, VObject *vobj, char *default_charset) { char *next_email; EList *list; - assign_string(vobj, &next_email); + assign_string(vobj, default_charset, &next_email); gtk_object_get(GTK_OBJECT(card), "email", &list, NULL); @@ -766,8 +809,9 @@ parse_email(ECard *card, VObject *vobj) g_free (next_email); } +/* Deal with charset */ static void -parse_bday(ECard *card, VObject *vobj) +parse_bday(ECard *card, VObject *vobj, char *default_charset) { if ( vObjectValueType (vobj) ) { char *str = fakeCString (vObjectUStringZValue (vobj)); @@ -780,12 +824,12 @@ parse_bday(ECard *card, VObject *vobj) } static void -parse_phone(ECard *card, VObject *vobj) +parse_phone(ECard *card, VObject *vobj, char *default_charset) { ECardPhone *next_phone = g_new(ECardPhone, 1); EList *list; - assign_string(vobj, &(next_phone->number)); + assign_string(vobj, default_charset, &(next_phone->number)); next_phone->flags = get_phone_flags(vobj); gtk_object_get(GTK_OBJECT(card), @@ -796,19 +840,19 @@ parse_phone(ECard *card, VObject *vobj) } static void -parse_address(ECard *card, VObject *vobj) +parse_address(ECard *card, VObject *vobj, char *default_charset) { ECardDeliveryAddress *next_addr = g_new(ECardDeliveryAddress, 1); EList *list; next_addr->flags = get_address_flags (vobj); - next_addr->po = e_v_object_get_child_value (vobj, VCPostalBoxProp); - next_addr->ext = e_v_object_get_child_value (vobj, VCExtAddressProp); - next_addr->street = e_v_object_get_child_value (vobj, VCStreetAddressProp); - next_addr->city = e_v_object_get_child_value (vobj, VCCityProp); - next_addr->region = e_v_object_get_child_value (vobj, VCRegionProp); - next_addr->code = e_v_object_get_child_value (vobj, VCPostalCodeProp); - next_addr->country = e_v_object_get_child_value (vobj, VCCountryNameProp); + next_addr->po = e_v_object_get_child_value (vobj, VCPostalBoxProp, default_charset); + next_addr->ext = e_v_object_get_child_value (vobj, VCExtAddressProp, default_charset); + next_addr->street = e_v_object_get_child_value (vobj, VCStreetAddressProp, default_charset); + next_addr->city = e_v_object_get_child_value (vobj, VCCityProp, default_charset); + next_addr->region = e_v_object_get_child_value (vobj, VCRegionProp, default_charset); + next_addr->code = e_v_object_get_child_value (vobj, VCPostalCodeProp, default_charset); + next_addr->country = e_v_object_get_child_value (vobj, VCCountryNameProp, default_charset); gtk_object_get(GTK_OBJECT(card), "address", &list, @@ -818,13 +862,13 @@ parse_address(ECard *card, VObject *vobj) } static void -parse_address_label(ECard *card, VObject *vobj) +parse_address_label(ECard *card, VObject *vobj, char *default_charset) { ECardAddrLabel *next_addr = g_new(ECardAddrLabel, 1); EList *list; next_addr->flags = get_address_flags (vobj); - assign_string(vobj, &next_addr->data); + assign_string(vobj, default_charset, &next_addr->data); gtk_object_get(GTK_OBJECT(card), "address_label", &list, @@ -834,85 +878,86 @@ parse_address_label(ECard *card, VObject *vobj) } static void -parse_url(ECard *card, VObject *vobj) +parse_url(ECard *card, VObject *vobj, char *default_charset) { if (card->url) g_free(card->url); - assign_string(vobj, &(card->url)); + assign_string(vobj, default_charset, &(card->url)); } static void -parse_org(ECard *card, VObject *vobj) +parse_org(ECard *card, VObject *vobj, char *default_charset) { char *temp; - temp = e_v_object_get_child_value(vobj, VCOrgNameProp); + temp = e_v_object_get_child_value(vobj, VCOrgNameProp, default_charset); g_free(card->org); card->org = temp; - temp = e_v_object_get_child_value(vobj, VCOrgUnitProp); + temp = e_v_object_get_child_value(vobj, VCOrgUnitProp, default_charset); g_free(card->org_unit); card->org_unit = temp; } static void -parse_office(ECard *card, VObject *vobj) +parse_office(ECard *card, VObject *vobj, char *default_charset) { if ( card->office ) g_free(card->office); - assign_string(vobj, &(card->office)); + assign_string(vobj, default_charset, &(card->office)); } static void -parse_title(ECard *card, VObject *vobj) +parse_title(ECard *card, VObject *vobj, char *default_charset) { if ( card->title ) g_free(card->title); - assign_string(vobj, &(card->title)); + assign_string(vobj, default_charset, &(card->title)); } static void -parse_role(ECard *card, VObject *vobj) +parse_role(ECard *card, VObject *vobj, char *default_charset) { if (card->role) g_free(card->role); - assign_string(vobj, &(card->role)); + assign_string(vobj, default_charset, &(card->role)); } static void -parse_manager(ECard *card, VObject *vobj) +parse_manager(ECard *card, VObject *vobj, char *default_charset) { if ( card->manager ) g_free(card->manager); - assign_string(vobj, &(card->manager)); + assign_string(vobj, default_charset, &(card->manager)); } static void -parse_assistant(ECard *card, VObject *vobj) +parse_assistant(ECard *card, VObject *vobj, char *default_charset) { if ( card->assistant ) g_free(card->assistant); - assign_string(vobj, &(card->assistant)); + assign_string(vobj, default_charset, &(card->assistant)); } static void -parse_nickname(ECard *card, VObject *vobj) +parse_nickname(ECard *card, VObject *vobj, char *default_charset) { if (card->nickname) g_free(card->nickname); - assign_string(vobj, &(card->nickname)); + assign_string(vobj, default_charset, &(card->nickname)); } static void -parse_spouse(ECard *card, VObject *vobj) +parse_spouse(ECard *card, VObject *vobj, char *default_charset) { if ( card->spouse ) g_free(card->spouse); - assign_string(vobj, &(card->spouse)); + assign_string(vobj, default_charset, &(card->spouse)); } +/* Deal with charset */ static void -parse_anniversary(ECard *card, VObject *vobj) +parse_anniversary(ECard *card, VObject *vobj, char *default_charset) { if ( vObjectValueType (vobj) ) { char *str = fakeCString (vObjectUStringZValue (vobj)); @@ -925,32 +970,32 @@ parse_anniversary(ECard *card, VObject *vobj) } static void -parse_mailer(ECard *card, VObject *vobj) +parse_mailer(ECard *card, VObject *vobj, char *default_charset) { if ( card->mailer ) g_free(card->mailer); - assign_string(vobj, &(card->mailer)); + assign_string(vobj, default_charset, &(card->mailer)); } static void -parse_fburl(ECard *card, VObject *vobj) +parse_fburl(ECard *card, VObject *vobj, char *default_charset) { g_free(card->fburl); - assign_string(vobj, &(card->fburl)); + assign_string(vobj, default_charset, &(card->fburl)); } static void -parse_note(ECard *card, VObject *vobj) +parse_note(ECard *card, VObject *vobj, char *default_charset) { g_free(card->note); - assign_string(vobj, &(card->note)); + assign_string(vobj, default_charset, &(card->note)); } static void -parse_related_contacts(ECard *card, VObject *vobj) +parse_related_contacts(ECard *card, VObject *vobj, char *default_charset) { g_free(card->related_contacts); - assign_string(vobj, &(card->related_contacts)); + assign_string(vobj, default_charset, &(card->related_contacts)); } static void @@ -1009,8 +1054,9 @@ do_parse_categories(ECard *card, char *str) g_free(copy); } +/* Deal with charset */ static void -parse_categories(ECard *card, VObject *vobj) +parse_categories(ECard *card, VObject *vobj, char *default_charset) { if ( vObjectValueType (vobj) ) { char *str = fakeCString (vObjectUStringZValue (vobj)); @@ -1019,8 +1065,9 @@ parse_categories(ECard *card, VObject *vobj) } } +/* Deal with charset */ static void -parse_wants_html(ECard *card, VObject *vobj) +parse_wants_html(ECard *card, VObject *vobj, char *default_charset) { if ( vObjectValueType (vobj) ) { char *str = fakeCString (vObjectUStringZValue (vobj)); @@ -1036,8 +1083,9 @@ parse_wants_html(ECard *card, VObject *vobj) } } +/* Deal with charset */ static void -parse_list(ECard *card, VObject *vobj) +parse_list(ECard *card, VObject *vobj, char *default_charset) { if ( vObjectValueType (vobj) ) { char *str = fakeCString (vObjectUStringZValue (vobj)); @@ -1051,8 +1099,9 @@ parse_list(ECard *card, VObject *vobj) } } +/* Deal with charset */ static void -parse_list_show_addresses(ECard *card, VObject *vobj) +parse_list_show_addresses(ECard *card, VObject *vobj, char *default_charset) { if ( vObjectValueType (vobj) ) { char *str = fakeCString (vObjectUStringZValue (vobj)); @@ -1084,7 +1133,7 @@ struct VObject { }; static void -parse_arbitrary(ECard *card, VObject *vobj) +parse_arbitrary(ECard *card, VObject *vobj, char *default_charset) { ECardArbitrary *arbitrary = e_card_arbitrary_new(); VObjectIterator iterator; @@ -1094,14 +1143,14 @@ parse_arbitrary(ECard *card, VObject *vobj) const char *name = vObjectName(temp); if (name && !strcmp(name, "TYPE")) { g_free(arbitrary->type); - assign_string(temp, &(arbitrary->type)); + assign_string(temp, default_charset, &(arbitrary->type)); } else { g_free(arbitrary->key); arbitrary->key = g_strdup(name); } } - assign_string(vobj, &(arbitrary->value)); + assign_string(vobj, default_charset, &(arbitrary->value)); gtk_object_get(GTK_OBJECT(card), "arbitrary", &list, @@ -1111,14 +1160,15 @@ parse_arbitrary(ECard *card, VObject *vobj) } static void -parse_id(ECard *card, VObject *vobj) +parse_id(ECard *card, VObject *vobj, char *default_charset) { g_free(card->id); - assign_string(vobj, &(card->id)); + assign_string(vobj, default_charset, &(card->id)); } +/* Deal with charset */ static void -parse_last_use(ECard *card, VObject *vobj) +parse_last_use(ECard *card, VObject *vobj, char *default_charset) { if ( vObjectValueType (vobj) ) { char *str = fakeCString (vObjectUStringZValue (vobj)); @@ -1130,8 +1180,9 @@ parse_last_use(ECard *card, VObject *vobj) } } +/* Deal with charset */ static void -parse_use_score(ECard *card, VObject *vobj) +parse_use_score(ECard *card, VObject *vobj, char *default_charset) { card->raw_use_score = 0; @@ -1143,20 +1194,20 @@ parse_use_score(ECard *card, VObject *vobj) } static void -parse_attribute(ECard *card, VObject *vobj) +parse_attribute(ECard *card, VObject *vobj, char *default_charset) { ParsePropertyFunc function = g_hash_table_lookup(E_CARD_CLASS(GTK_OBJECT(card)->klass)->attribute_jump_table, vObjectName(vobj)); if ( function ) - function(card, vobj); + function(card, vobj, default_charset); } static void -parse(ECard *card, VObject *vobj) +parse(ECard *card, VObject *vobj, char *default_charset) { VObjectIterator iterator; initPropIterator(&iterator, vobj); while(moreIteration (&iterator)) { - parse_attribute(card, nextVObject(&iterator)); + parse_attribute(card, nextVObject(&iterator), default_charset); } if (!card->fname) { card->fname = g_strdup(""); @@ -2278,14 +2329,14 @@ e_card_init (ECard *card) } GList * -e_card_load_cards_from_file(const char *filename) +e_card_load_cards_from_file_with_default_charset(const char *filename, char *default_charset) { VObject *vobj = Parse_MIME_FromFileName((char *) filename); GList *list = NULL; while(vobj) { VObject *next; ECard *card = E_CARD(gtk_type_new(e_card_get_type())); - parse(card, vobj); + parse(card, vobj, default_charset); next = nextVObjectInList(vobj); cleanVObject(vobj); vobj = next; @@ -2296,14 +2347,20 @@ e_card_load_cards_from_file(const char *filename) } GList * -e_card_load_cards_from_string(const char *str) +e_card_load_cards_from_file(const char *filename) +{ + return e_card_load_cards_from_file_with_default_charset (filename, "UTF-8"); +} + +GList * +e_card_load_cards_from_string_with_default_charset(const char *str, char *default_charset) { VObject *vobj = Parse_MIME(str, strlen (str)); GList *list = NULL; while(vobj) { VObject *next; ECard *card = E_CARD(gtk_type_new(e_card_get_type())); - parse(card, vobj); + parse(card, vobj, default_charset); next = nextVObjectInList(vobj); cleanVObject(vobj); vobj = next; @@ -2313,6 +2370,12 @@ e_card_load_cards_from_string(const char *str) return list; } +GList * +e_card_load_cards_from_string(const char *str) +{ + return e_card_load_cards_from_string_with_default_charset (str, "UTF-8"); +} + void e_card_free_empty_lists (ECard *card) { @@ -2348,24 +2411,49 @@ e_card_free_empty_lists (ECard *card) } static void -assign_string(VObject *vobj, char **string) +assign_string(VObject *vobj, char *default_charset, char **string) { int type = vObjectValueType(vobj); char *str; + char *charset = default_charset; + gboolean free_charset = FALSE; + VObject *charset_obj; + + if ((charset_obj = isAPropertyOf (vobj, "CHARSET"))) { + switch (vObjectValueType (charset_obj)) { + case VCVT_STRINGZ: + charset = (char *) vObjectStringZValue(charset_obj); + break; + case VCVT_USTRINGZ: + charset = fakeCString (vObjectUStringZValue (charset_obj)); + free_charset = TRUE; + break; + } + } switch(type) { case VCVT_STRINGZ: - *string = g_strdup (vObjectStringZValue(vobj)); + if (strcmp (charset, "UTF-8")) + *string = e_utf8_from_charset_string (charset, vObjectStringZValue(vobj)); + else + *string = g_strdup(vObjectStringZValue(vobj)); break; case VCVT_USTRINGZ: - str = (vObjectValueType (vobj) ? fakeCString (vObjectUStringZValue (vobj)) : calloc(1, 1)); - *string = g_strdup(str); + str = fakeCString (vObjectUStringZValue (vobj)); + if (strcmp (charset, "UTF-8")) + *string = e_utf8_from_charset_string (charset, str); + else + *string = g_strdup(str); free(str); break; default: *string = g_strdup(""); break; } + + if (free_charset) { + free (charset); + } } #if 0 @@ -3800,19 +3888,37 @@ e_card_date_from_string (char *str) } char * -e_v_object_get_child_value(VObject *vobj, char *name) +e_v_object_get_child_value(VObject *vobj, char *name, char *default_charset) { char *ret_val; VObjectIterator iterator; + gboolean free_charset = FALSE; + VObject *charset_obj; + + if ((charset_obj = isAPropertyOf (vobj, "CHARSET"))) { + switch (vObjectValueType (charset_obj)) { + case VCVT_STRINGZ: + default_charset = (char *) vObjectStringZValue(charset_obj); + break; + case VCVT_USTRINGZ: + default_charset = fakeCString (vObjectUStringZValue (charset_obj)); + free_charset = TRUE; + break; + } + } + initPropIterator(&iterator, vobj); while(moreIteration (&iterator)) { VObject *attribute = nextVObject(&iterator); const char *id = vObjectName(attribute); if ( ! strcmp(id, name) ) { - assign_string(attribute, &ret_val); + assign_string(attribute, default_charset, &ret_val); return ret_val; } } + if (free_charset) + free (default_charset); + return NULL; } @@ -4006,7 +4112,7 @@ e_card_list_send (GList *cards, ECardDisposition disposition) while (cards != NULL) { ECard *card = cards->data; EIterator *iterator; - const gchar *name, *addr; + gchar *name, *addr; char *file_as; gboolean is_list, is_hidden, free_name_addr; EList *email; @@ -4047,7 +4153,7 @@ e_card_list_send (GList *cards, ECardDisposition disposition) } else { /* is just a plain old card */ name = file_as; - addr = e_iterator_get (iterator); + addr = (char *) e_iterator_get (iterator); } } |