static void e_contact_editor_fullname_dispose (GObject *object) { EContactEditorFullname *e_contact_editor_fullname; e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (object); if (e_contact_editor_fullname->builder) { g_object_unref (e_contact_editor_fullname->builder); e_contact_editor_fullname->builder = NULL; } if (e_contact_editor_fullname->name) { e_contact_name_free (e_contact_editor_fullname->name); e_contact_editor_fullname->name = NULL; } /* Chain up to parent's dispose() method. */ G_OBJECT_CLASS (e_contact_editor_fullname_parent_class)->dispose (object); }
static void e_contact_editor_fullname_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { EContactEditorFullname *e_contact_editor_fullname; e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (object); switch (property_id) { case PROP_NAME: e_contact_name_free (e_contact_editor_fullname->name); if (g_value_get_pointer (value) != NULL) { e_contact_editor_fullname->name = e_contact_name_copy ( g_value_get_pointer (value)); fill_in_info (e_contact_editor_fullname); } else { e_contact_editor_fullname->name = NULL; } break; case PROP_EDITABLE: { gboolean editable; gint i; const gchar *widget_names[] = { "comboentry-title", "comboentry-suffix", "entry-first", "entry-middle", "entry-last", "label-title", "label-suffix", "label-first", "label-middle", "label-last", NULL }; editable = g_value_get_boolean (value); e_contact_editor_fullname->editable = editable; for (i = 0; widget_names[i] != NULL; i++) { GtkWidget *widget; widget = e_builder_get_widget ( e_contact_editor_fullname->builder, widget_names[i]); if (GTK_IS_ENTRY (widget)) { gtk_editable_set_editable ( GTK_EDITABLE (widget), editable); } else if (GTK_IS_COMBO_BOX (widget)) { GtkWidget *child; child = gtk_bin_get_child (GTK_BIN (widget)); gtk_editable_set_editable ( GTK_EDITABLE (child), editable); gtk_widget_set_sensitive (widget, editable); } else if (GTK_IS_LABEL (widget)) { gtk_widget_set_sensitive (widget, editable); } } break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } }
static void use_common_book_client (EBookClient *book_client, MatchSearchInfo *info) { EContact *contact = info->contact; EContactName *contact_name; GList *contact_email; gchar *query_parts[MAX_QUERY_PARTS + 1]; gint p = 0; gchar *contact_file_as, *qj; EBookQuery *query = NULL; gint i; if (book_client == NULL) { info->cb (info->contact, NULL, EAB_CONTACT_MATCH_NONE, info->closure); match_search_info_free (info); return; } contact_file_as = e_contact_get (contact, E_CONTACT_FILE_AS); if (contact_file_as) { query_parts[p++] = g_strdup_printf ("(contains \"file_as\" \"%s\")", contact_file_as); g_free (contact_file_as); } if (!e_contact_get (contact, E_CONTACT_IS_LIST)) { contact_name = e_contact_get (contact, E_CONTACT_NAME); if (contact_name) { if (contact_name->given && *contact_name->given) query_parts[p++] = g_strdup_printf ("(contains \"full_name\" \"%s\")", contact_name->given); if (contact_name->additional && *contact_name->additional) query_parts[p++] = g_strdup_printf ("(contains \"full_name\" \"%s\")", contact_name->additional); if (contact_name->family && *contact_name->family) query_parts[p++] = g_strdup_printf ("(contains \"full_name\" \"%s\")", contact_name->family); e_contact_name_free (contact_name); } contact_email = e_contact_get (contact, E_CONTACT_EMAIL); if (contact_email) { GList *iter; for (iter = contact_email; iter && p < MAX_QUERY_PARTS; iter = iter->next) { gchar *addr = g_strdup (iter->data); if (addr && *addr) { gchar *s = addr; while (*s) { if (*s == '@') { *s = '\0'; break; } ++s; } query_parts[p++] = g_strdup_printf ("(beginswith \"email\" \"%s\")", addr); g_free (addr); } } } g_list_foreach (contact_email, (GFunc) g_free, NULL); g_list_free (contact_email); } /* Build up our full query from the parts. */ query_parts[p] = NULL; qj = g_strjoinv (" ", query_parts); for (i = 0; query_parts[i] != NULL; i++) g_free (query_parts[i]); if (p > 1) { gchar *s; s = g_strdup_printf ("(or %s)", qj); query = e_book_query_from_string (s); g_free (s); } else if (p == 1) { query = e_book_query_from_string (qj); } else { query = NULL; } if (query) { gchar *query_str = e_book_query_to_string (query); e_book_client_get_contacts (book_client, query_str, NULL, query_cb, info); g_free (query_str); } else query_cb (G_OBJECT (book_client), NULL, info); g_free (qj); if (query) e_book_query_unref (query); }
EABContactMatchType eab_contact_compare_name (EContact *contact1, EContact *contact2) { EContactName *a, *b; gint matches = 0, possible = 0; gboolean family_match = FALSE; g_return_val_if_fail (E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE); g_return_val_if_fail (E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE); a = e_contact_get (contact1, E_CONTACT_NAME); b = e_contact_get (contact2, E_CONTACT_NAME); if (a == NULL || b == NULL) { g_free (a); g_free (b); return EAB_CONTACT_MATCH_NOT_APPLICABLE; } if (a->given && b->given && *a->given && *b->given) { ++possible; if (name_fragment_match_with_synonyms (a->given, b->given, FALSE /* both inputs are complete */)) { ++matches; } } if (a->additional && b->additional && *a->additional && *b->additional) { ++possible; if (name_fragment_match_with_synonyms (a->additional, b->additional, FALSE /* both inputs are complete */)) { ++matches; } } if (a->family && b->family && *a->family && *b->family) { ++possible; /* We don't allow "loose matching" (i.e. John vs. Jon) on family names */ if (!e_utf8_casefold_collate (a->family, b->family)) { ++matches; family_match = TRUE; } } e_contact_name_free (a); e_contact_name_free (b); /* Now look at the # of matches and try to intelligently map * an EAB_CONTACT_MATCH_* type to it. Special consideration is given * to family-name matches. */ if (possible == 0) return EAB_CONTACT_MATCH_NOT_APPLICABLE; if (possible == 1) return family_match ? EAB_CONTACT_MATCH_VAGUE : EAB_CONTACT_MATCH_NONE; if (possible == matches) return family_match ? EAB_CONTACT_MATCH_EXACT : EAB_CONTACT_MATCH_PARTIAL; if (possible == matches + 1) return family_match ? EAB_CONTACT_MATCH_VAGUE : EAB_CONTACT_MATCH_NONE; return EAB_CONTACT_MATCH_NONE; }
EABContactMatchType eab_contact_compare_name_to_string_full (EContact *contact, const gchar *str, gboolean allow_partial_matches, gint *matched_parts_out, EABContactMatchPart *first_matched_part_out, gint *matched_character_count_out) { gchar **namev, **givenv = NULL, **addv = NULL, **familyv = NULL; gint matched_parts = EAB_CONTACT_MATCH_PART_NONE; EABContactMatchPart first_matched_part = EAB_CONTACT_MATCH_PART_NONE; EABContactMatchPart this_part_match = EAB_CONTACT_MATCH_PART_NOT_APPLICABLE; EABContactMatchType match_type; EContactName *contact_name; gint match_count = 0, matched_character_count = 0, fragment_count; gint i, j; gchar *str_cpy, *s; g_return_val_if_fail (E_IS_CONTACT (contact), EAB_CONTACT_MATCH_NOT_APPLICABLE); if (!e_contact_get_const (contact, E_CONTACT_FULL_NAME)) return EAB_CONTACT_MATCH_NOT_APPLICABLE; if (str == NULL) return EAB_CONTACT_MATCH_NOT_APPLICABLE; str_cpy = s = g_strdup (str); while (*s) { if (*s == ',' || *s == '"') *s = ' '; ++s; } namev = g_strsplit (str_cpy, " ", 0); g_free (str_cpy); contact_name = e_contact_get (contact, E_CONTACT_NAME); if (contact_name->given) givenv = g_strsplit (contact_name->given, " ", 0); if (contact_name->additional) addv = g_strsplit (contact_name->additional, " ", 0); if (contact_name->family) familyv = g_strsplit (contact_name->family, " ", 0); e_contact_name_free (contact_name); fragment_count = 0; for (i = 0; givenv && givenv[i]; ++i) ++fragment_count; for (i = 0; addv && addv[i]; ++i) ++fragment_count; for (i = 0; familyv && familyv[i]; ++i) ++fragment_count; for (i = 0; namev[i] && this_part_match != EAB_CONTACT_MATCH_PART_NONE; ++i) { if (*namev[i]) { this_part_match = EAB_CONTACT_MATCH_PART_NONE; /* When we are allowing partials, we are strict about the matches we allow. * Does this make sense? Not really, but it does the right thing for the purposes * of completion. */ if (givenv && this_part_match == EAB_CONTACT_MATCH_PART_NONE) { for (j = 0; givenv[j]; ++j) { if (name_fragment_match_with_synonyms (givenv[j], namev[i], allow_partial_matches)) { this_part_match = EAB_CONTACT_MATCH_PART_GIVEN_NAME; /* We remove a piece of a name once it has been matched against, so * that "john john" won't match "john doe". */ g_free (givenv[j]); givenv[j] = g_strdup (""); break; } } } if (addv && this_part_match == EAB_CONTACT_MATCH_PART_NONE) { for (j = 0; addv[j]; ++j) { if (name_fragment_match_with_synonyms (addv[j], namev[i], allow_partial_matches)) { this_part_match = EAB_CONTACT_MATCH_PART_ADDITIONAL_NAME; g_free (addv[j]); addv[j] = g_strdup (""); break; } } } if (familyv && this_part_match == EAB_CONTACT_MATCH_PART_NONE) { for (j = 0; familyv[j]; ++j) { if (allow_partial_matches ? name_fragment_match_with_synonyms (familyv[j], namev[i], allow_partial_matches) : !e_utf8_casefold_collate (familyv[j], namev[i])) { this_part_match = EAB_CONTACT_MATCH_PART_FAMILY_NAME; g_free (familyv[j]); familyv[j] = g_strdup (""); break; } } } if (this_part_match != EAB_CONTACT_MATCH_PART_NONE) { ++match_count; matched_character_count += g_utf8_strlen (namev[i], -1); matched_parts |= this_part_match; if (first_matched_part == EAB_CONTACT_MATCH_PART_NONE) first_matched_part = this_part_match; } } } match_type = EAB_CONTACT_MATCH_NONE; if (this_part_match != EAB_CONTACT_MATCH_PART_NONE) { if (match_count > 0) match_type = EAB_CONTACT_MATCH_VAGUE; if (fragment_count == match_count) { match_type = EAB_CONTACT_MATCH_EXACT; } else if (fragment_count == match_count + 1) { match_type = EAB_CONTACT_MATCH_PARTIAL; } } if (matched_parts_out) *matched_parts_out = matched_parts; if (first_matched_part_out) *first_matched_part_out = first_matched_part; if (matched_character_count_out) *matched_character_count_out = matched_character_count; g_strfreev (namev); g_strfreev (givenv); g_strfreev (addv); g_strfreev (familyv); return match_type; }
static EContact * ecard_from_remote_record(EAddrConduitContext *ctxt, GnomePilotRecord *remote, EContact *in_contact) { struct Address address; EContact *contact; EContactName *name; EContactAddress *eaddress; EContactField mailing_address; char *txt, *find, *full_name; EContactField next_mail, next_home, next_work, next_fax; EContactField next_other, next_main, next_pager, next_mobile; int i; #ifdef PILOT_LINK_0_12 pi_buffer_t * buffer; #endif g_return_val_if_fail(remote!=NULL,NULL); memset (&address, 0, sizeof (struct Address)); #ifdef PILOT_LINK_0_12 buffer = pi_buffer_new(DLP_BUF_SIZE); if(buffer == NULL){ pi_set_error(ctxt->dbi->pilot_socket, PI_ERR_GENERIC_MEMORY); return NULL; } if(pi_buffer_append(buffer, remote->record, remote->length)==NULL){ pi_set_error(ctxt->dbi->pilot_socket, PI_ERR_GENERIC_MEMORY); return NULL; } unpack_Address (&address, buffer, address_v1); pi_buffer_free(buffer); #else unpack_Address (&address, remote->record, remote->length); #endif if (in_contact == NULL) contact = e_contact_new (); else contact = e_contact_duplicate (in_contact); /* Name */ name = e_contact_name_new (); name->given = get_entry_text (address, entryFirstname); name->family = get_entry_text (address, entryLastname); full_name = e_contact_name_to_string (name); e_contact_set (contact, E_CONTACT_FULL_NAME, full_name); e_contact_name_free (name); /* File As */ if (!full_name || !*full_name) set_contact_text (contact, E_CONTACT_FILE_AS, address, entryCompany); g_free (full_name); /* Title and Company */ set_contact_text (contact, E_CONTACT_TITLE, address, entryTitle); set_contact_text (contact, E_CONTACT_ORG, address, entryCompany); /* Address */ mailing_address = -1; if ((eaddress = e_contact_get (contact, ctxt->cfg->default_address))) { mailing_address = ctxt->cfg->default_address; e_contact_address_free (eaddress); } else { for (i = E_CONTACT_FIRST_ADDRESS_ID; i <= E_CONTACT_LAST_ADDRESS_ID; i++) { if ((eaddress = e_contact_get (contact, i))) { e_contact_address_free (eaddress); mailing_address = i; break; } } } if (mailing_address == -1) mailing_address = ctxt->cfg->default_address; eaddress = g_new0 (EContactAddress, 1); txt = get_entry_text (address, entryAddress); if (txt && (find = strchr (txt, '\n')) != NULL) { *find = '\0'; find++; } else { find = NULL; } eaddress->street = txt; eaddress->ext = find != NULL ? g_strdup (find) : g_strdup (""); eaddress->locality = get_entry_text (address, entryCity); eaddress->region = get_entry_text (address, entryState); eaddress->country = get_entry_text (address, entryCountry); eaddress->code = get_entry_text (address, entryZip); e_contact_set (contact, mailing_address, eaddress); e_contact_address_free (eaddress); /* Phone numbers */ get_next_init (&next_mail, &next_home, &next_work, &next_fax, &next_other, &next_main, &next_pager, &next_mobile); for (i = entryPhone1; i <= entryPhone5; i++) { int phonelabel = address.phoneLabel[i - entryPhone1]; char *phonenum = get_entry_text (address, i); if (phonelabel == LABEL_EMAIL && !is_next_done (next_mail)) { e_contact_set (contact, next_mail, phonenum); next_mail = get_next_mail (&next_mail); } else if (phonelabel == LABEL_HOME && !is_next_done (next_home)) { e_contact_set (contact, next_home, phonenum); next_home = get_next_home (&next_home); } else if (phonelabel == LABEL_WORK && !is_next_done (next_work)) { e_contact_set (contact, next_work, phonenum); next_work = get_next_work (&next_work); } else if (phonelabel == LABEL_FAX && !is_next_done (next_fax)) { e_contact_set (contact, next_fax, phonenum); next_fax = get_next_fax (&next_fax); } else if (phonelabel == LABEL_OTHER && !is_next_done (next_other)) { e_contact_set (contact, next_other, phonenum); next_other = get_next_other (&next_other); } else if (phonelabel == LABEL_MAIN && !is_next_done (next_main)) { e_contact_set (contact, next_main, phonenum); next_main = get_next_main (&next_main); } else if (phonelabel == LABEL_PAGER && !is_next_done (next_pager)) { e_contact_set (contact, next_pager, phonenum); next_pager = get_next_pager (&next_pager); } else if (phonelabel == LABEL_MOBILE && !is_next_done (next_mobile)) { e_contact_set (contact, next_mobile, phonenum); next_mobile = get_next_mobile (&next_mobile); } g_free (phonenum); } /* Note */ set_contact_text (contact, E_CONTACT_NOTE, address, entryNote); free_Address(&address); return contact; }