static void verify_premodify_and_prepare_contact (EContact *contact) { EVCardAttribute *attr; /* ensure there is no email address to begin with, then add one */ g_assert (!e_vcard_get_attribute (E_VCARD (contact), EVC_EMAIL)); attr = e_vcard_attribute_new (NULL, EVC_EMAIL); e_vcard_add_attribute_with_value (E_VCARD (contact), attr, EMAIL_ADD); }
static void create_new_contact_from_number (gchar *number) { GtkWidget *dialog, *name, *label; dialog = gtk_dialog_new_with_buttons ("Save as Contact", NULL, GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); label = gtk_label_new ("Enter a name for the contact"); name = gtk_entry_new (); gtk_box_pack_start_defaults (GTK_BOX (GTK_DIALOG(dialog)->vbox), label); gtk_box_pack_start_defaults (GTK_BOX (GTK_DIALOG(dialog)->vbox), name); gtk_widget_show (label); gtk_widget_show (name); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { EContact *contact; EBook *book; EVCardAttribute *attr; /* create contact */ contact = e_contact_new (); /* add name */ e_contact_set (contact, E_CONTACT_FULL_NAME, (const gpointer)gtk_entry_get_text (GTK_ENTRY (name))); /* (const gpointer) removes a useless warning) */ /* add number */ attr = e_vcard_attribute_new ("", EVC_TEL); e_vcard_add_attribute_with_value (E_VCARD (contact), attr, number); hito_vcard_attribute_set_type (attr, "Other"); /* open address book */ /* TODO: check GErrors */ book = e_book_new_system_addressbook (NULL); e_book_open (book, FALSE, NULL); /* add contact to address book, and close */ e_book_add_contact (book, contact, NULL); g_object_unref (book); g_object_unref (contact); } gtk_widget_destroy (dialog); }
static void resolve_list_card (LDIFImporter *gci, EContact *contact) { GList *email, *l; GList *email_attrs = NULL; gchar *full_name; /* set file_as to full_name so we don't later try and figure * out a first/last name for the list. */ full_name = e_contact_get (contact, E_CONTACT_FULL_NAME); if (full_name) e_contact_set (contact, E_CONTACT_FILE_AS, full_name); g_free (full_name); /* FIMXE getting might not be implemented in ebook */ email = e_contact_get (contact, E_CONTACT_EMAIL); for (l = email; l; l = l->next) { /* mozilla stuffs dn's in the EMAIL list for contact lists */ gchar *dn = l->data; EContact *dn_contact = g_hash_table_lookup (gci->dn_contact_hash, dn); /* break list chains here, since we don't support them just yet */ if (dn_contact && !e_contact_get (dn_contact, E_CONTACT_IS_LIST)) { EDestination *dest; EVCardAttribute *attr = e_vcard_attribute_new (NULL, EVC_EMAIL); /* Hard-wired for default e-mail, since * netscape only exports 1 email address. */ dest = e_destination_new (); e_destination_set_contact (dest, dn_contact, 0); e_destination_export_to_vcard_attribute (dest, attr); g_object_unref (dest); email_attrs = g_list_append (email_attrs, attr); } } e_contact_set_attributes (contact, E_CONTACT_EMAIL, email_attrs); g_list_foreach (email, (GFunc) g_free, NULL); g_list_free (email); g_list_foreach (email_attrs, (GFunc) e_vcard_attribute_free, NULL); g_list_free (email_attrs); }
/** * e_vcard_attribute_copy: * @attr: attribute to copy * * Makes a copy of @attr. * * Return value: A new #EVCardAttribute identical to @attr. **/ EVCardAttribute* e_vcard_attribute_copy (EVCardAttribute *attr) { EVCardAttribute *a; GList *p; g_return_val_if_fail (attr != NULL, NULL); a = e_vcard_attribute_new (attr->group, attr->name); for (p = attr->values; p; p = p->next) e_vcard_attribute_add_value (a, p->data); for (p = attr->params; p; p = p->next) e_vcard_attribute_add_param (a, e_vcard_attribute_param_copy (p->data)); return a; }
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 gboolean test_vcard (const gchar *vcard_str) { EVCard *vc1, *vc2; gchar *str; /* Do not parse */ vc1 = e_vcard_new_from_string (vcard_str); str = e_vcard_to_string (vc1, EVC_FORMAT_VCARD_30); g_return_val_if_fail (str != NULL, FALSE); g_return_val_if_fail (g_ascii_strcasecmp (str, vcard_str) == 0, FALSE); g_return_val_if_fail (e_vcard_is_parsed (vc1) == FALSE, FALSE); g_free (str); /* parse */ e_vcard_get_attribute (vc1, "UID"); g_return_val_if_fail (e_vcard_is_parsed (vc1) == TRUE, FALSE); str = e_vcard_to_string (vc1, EVC_FORMAT_VCARD_30); g_return_val_if_fail (str != NULL, FALSE); g_return_val_if_fail (g_ascii_strcasecmp (str, vcard_str) == 0, FALSE); g_free (str); /* parse */ e_vcard_get_attribute (vc1, "FN"); g_return_val_if_fail (e_vcard_is_parsed (vc1) == TRUE, FALSE); str = e_vcard_to_string (vc1, EVC_FORMAT_VCARD_30); g_return_val_if_fail (str != NULL, FALSE); g_return_val_if_fail (g_ascii_strcasecmp (str, vcard_str) == 0, FALSE); g_free (str); g_object_unref (vc1); /* do not parse */ vc1 = e_vcard_new_from_string (vcard_str); /* Setting the UID does not cause vCard parsing */ e_vcard_append_attribute_with_value (vc1, e_vcard_attribute_new (NULL, "UID"), "other-uid"); g_return_val_if_fail (e_vcard_is_parsed (vc1) == FALSE, FALSE); /* Retrieving the UID should not cause vCard parsing either */ g_return_val_if_fail (compare_single_value (vc1, "UID", "other-uid"), FALSE); g_return_val_if_fail (e_vcard_is_parsed (vc1) == FALSE, FALSE); /* Getting FN attribute WILL cause parsing */ e_vcard_get_attribute (vc1, "FN"); g_return_val_if_fail (e_vcard_is_parsed (vc1) == TRUE, FALSE); g_object_unref (vc1); /* parse */ vc1 = e_vcard_new_from_string (vcard_str); g_return_val_if_fail (e_vcard_is_parsed (vc1) == FALSE, FALSE); e_vcard_remove_attributes (vc1, NULL, "UID"); g_return_val_if_fail (e_vcard_is_parsed (vc1) == TRUE, FALSE); e_vcard_append_attribute_with_value (vc1, e_vcard_attribute_new (NULL, "UID"), "other-uid"); g_return_val_if_fail (compare_single_value (vc1, "UID", "other-uid"), FALSE); str = e_vcard_to_string (vc1, EVC_FORMAT_VCARD_30); vc2 = e_vcard_new_from_string (str); g_free (str); g_return_val_if_fail (compare_single_value (vc2, "UID", "other-uid"), FALSE); g_object_unref (vc2); /* parse */ e_vcard_get_attribute (vc1, "FN"); g_return_val_if_fail (e_vcard_is_parsed (vc1) == TRUE, FALSE); g_return_val_if_fail (compare_single_value (vc1, "UID", "other-uid"), FALSE); str = e_vcard_to_string (vc1, EVC_FORMAT_VCARD_30); vc2 = e_vcard_new_from_string (str); g_return_val_if_fail (e_vcard_is_parsed (vc2) == FALSE, FALSE); g_free (str); g_return_val_if_fail (compare_single_value (vc2, "UID", "other-uid"), FALSE); g_return_val_if_fail (has_only_one (vc1, "UID"), FALSE); g_return_val_if_fail (has_only_one (vc2, "UID"), FALSE); g_object_unref (vc2); g_object_unref (vc1); return TRUE; }
static void import_contact (EBookClient *book_client, gchar *line) { gchar **strings, *addr, **addrs; gint i; GList *list; /*EContactName *name;*/ EContact *card; gsize len; GError *error = NULL; card = e_contact_new (); strings = g_strsplit (line, "\t", 5); if (strings[0] && strings[1] && strings[2]) { gchar *new_uid = NULL; e_contact_set (card, E_CONTACT_NICKNAME, strings[0]); e_contact_set (card, E_CONTACT_FULL_NAME, strings[1]); addr = strings[2]; len = strlen (addr); if (addr[0] == '(' && addr[len - 1] == ')') { addr[0] = 0; addr[len - 1] = 0; addrs = g_strsplit (addr + 1, ",", 0); list = NULL; /* XXX So ... this api is just insane ... we set * plain strings as the contact email if it * is a normal contact, but need to do this * XML crap for mailing lists. */ for (i = 0; addrs[i]; i++) { EDestination *d; EVCardAttribute *attr; d = e_destination_new (); e_destination_set_email (d, addrs[i]); attr = e_vcard_attribute_new (NULL, EVC_EMAIL); e_destination_export_to_vcard_attribute (d, attr); list = g_list_append (list, attr); g_object_unref (d); } e_contact_set_attributes (card, E_CONTACT_EMAIL, list); g_list_foreach (list, (GFunc) e_vcard_attribute_free, NULL); g_list_free (list); g_strfreev (addrs); e_contact_set (card, E_CONTACT_IS_LIST, GINT_TO_POINTER (TRUE)); } else { e_contact_set (card, E_CONTACT_EMAIL_1, strings[2]); } /*name = e_contact_name_from_string(strings[1]);*/ if (strings[3] && strings[4]) e_contact_set (card, E_CONTACT_NOTE, strings[4]); e_book_client_add_contact_sync ( book_client, card, &new_uid, NULL, &error); if (error != NULL) { g_warning ( "%s: Failed to add contact: %s", G_STRFUNC, error->message); g_error_free (error); } else { g_free (new_uid); } g_object_unref (card); } g_strfreev (strings); }
static void add_number_to_contact (gchar *number) { EBook *book; EBookQuery *query; EBookView *view; GtkWidget *window, *contacts_treeview, *scroll, *groups_combo; GtkTreeModel *store, *group_store, *contact_filter; GError *err = NULL; window = gtk_dialog_new_with_buttons ("Add to Contact", NULL, 0, "Cancel", GTK_RESPONSE_CANCEL, "Add", GTK_RESPONSE_OK, NULL); gtk_dialog_set_has_separator (GTK_DIALOG (window), FALSE); book = e_book_new_system_addressbook (&err); if (err) return; e_book_open (book, FALSE, &err); if (err) return; query = e_book_query_any_field_contains (NULL); e_book_get_book_view (book, query, NULL, 0, &view, &err); if (err) return; e_book_query_unref (query); e_book_view_start (view); store = hito_contact_store_new (view); group_store = hito_group_store_new (); hito_group_store_set_view (HITO_GROUP_STORE (group_store), view); hito_group_store_add_group (HITO_GROUP_STORE (group_store), hito_all_group_new ()); hito_group_store_add_group (HITO_GROUP_STORE (group_store), hito_separator_group_new (-99)); hito_group_store_add_group (HITO_GROUP_STORE (group_store), hito_separator_group_new (99)); hito_group_store_add_group (HITO_GROUP_STORE (group_store), hito_no_category_group_new ()); contact_filter = hito_contact_model_filter_new (HITO_CONTACT_STORE (store)); groups_combo = hito_group_combo_new (HITO_GROUP_STORE (group_store)); hito_group_combo_connect_filter (HITO_GROUP_COMBO (groups_combo), HITO_CONTACT_MODEL_FILTER (contact_filter)); gtk_box_pack_start_defaults (GTK_BOX (GTK_DIALOG (window)->vbox), groups_combo); gtk_combo_box_set_active (GTK_COMBO_BOX (groups_combo), 0); contacts_treeview = hito_contact_view_new (HITO_CONTACT_STORE (store), HITO_CONTACT_MODEL_FILTER (contact_filter)); scroll = moko_finger_scroll_new (); gtk_widget_set_size_request (scroll, -1, 300); gtk_box_pack_start_defaults (GTK_BOX (GTK_DIALOG (window)->vbox), scroll); gtk_container_add (GTK_CONTAINER (scroll), contacts_treeview); gtk_widget_show_all (scroll); gtk_widget_show_all (groups_combo); if (gtk_dialog_run (GTK_DIALOG (window)) == GTK_RESPONSE_OK) { GtkTreeIter iter; EContact *contact; EVCardAttribute *attr; GtkTreeModel *model; GtkTreeSelection *selection; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (contacts_treeview)); if (gtk_tree_selection_get_selected (selection, &model, &iter)) { gtk_tree_model_get (model, &iter, COLUMN_CONTACT, &contact, -1); if (contact) { attr = e_vcard_attribute_new ("", EVC_TEL); e_vcard_add_attribute_with_value (E_VCARD (contact), attr, number); hito_vcard_attribute_set_type (attr, "Other"); e_book_async_commit_contact (book, contact, NULL, NULL); g_object_unref (contact); } } } gtk_widget_destroy (window); g_object_unref (book); }
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; }
/* reads an entire attribute from the input buffer, leaving p pointing at the start of the next line (past the \r\n) */ static EVCardAttribute* read_attribute (char **p) { char *attr_group = NULL; char *attr_name = NULL; EVCardAttribute *attr = NULL; GString *str; char *lp; gboolean is_qp = FALSE; /* first read in the group/name */ str = g_string_new (""); for( lp = skip_newline( *p, is_qp ); *lp != '\n' && *lp != '\r' && *lp != '\0'; lp = skip_newline( lp, is_qp ) ) { if (*lp == ':' || *lp == ';') { if (str->len != 0) { /* we've got a name, break out to the value/attribute parsing */ attr_name = g_string_free (str, FALSE); break; } else { /* a line of the form: * (group.)?[:;] * * since we don't have an attribute * name, skip to the end of the line * and try again. */ g_string_free (str, TRUE); *p = lp; skip_to_next_line(p); goto lose; } } else if (*lp == '.') { if (attr_group) { g_warning ("extra `.' in attribute specification. ignoring extra group `%s'", str->str); g_string_free (str, TRUE); str = g_string_new (""); } if (str->len != 0) { attr_group = g_string_free (str, FALSE); str = g_string_new (""); } } else if (g_unichar_isalnum (g_utf8_get_char (lp)) || *lp == '-' || *lp == '_') { g_string_append_unichar (str, g_utf8_get_char (lp)); } else { g_warning ("invalid character found in attribute group/name"); g_string_free (str, TRUE); *p = lp; skip_to_next_line(p); goto lose; } lp = g_utf8_next_char(lp); } if (!attr_name) { skip_to_next_line (p); goto lose; } attr = e_vcard_attribute_new (attr_group, attr_name); g_free (attr_group); g_free (attr_name); if (*lp == ';') { /* skip past the ';' */ lp = g_utf8_next_char(lp); read_attribute_params (attr, &lp, &is_qp); if (is_qp) attr->encoding = EVC_ENCODING_RAW; } if (*lp == ':') { /* skip past the ':' */ lp = g_utf8_next_char(lp); read_attribute_value (attr, &lp, is_qp); } *p = lp; if (!attr->values) goto lose; return attr; lose: if (attr) e_vcard_attribute_free (attr); return NULL; }