diff --git a/obexd/plugins/phonebook-tracker.c b/obexd/plugins/phonebook-tracker.c
index 3f63dcb..1f1f693 100644
--- a/obexd/plugins/phonebook-tracker.c
+++ b/obexd/plugins/phonebook-tracker.c
contact->numbers = g_slist_append(contact->numbers, number);
}
-static gchar *find_email(GSList *emails, const char *email)
+static struct phonebook_email *find_email(GSList *emails, const char *address,
+ int type)
{
GSList *l;
- for (l = emails; l; l = l->next)
- if (g_strcmp0(l->data, email) == 0)
- return l->data;
+ for (l = emails; l; l = l->next) {
+ struct phonebook_email *email = l->data;
+ if (g_strcmp0(email->address, address) == 0 &&
+ email->type == type)
+ return email;
+ }
return NULL;
}
-static void add_email(struct phonebook_contact *contact, const char *email)
+static void add_email(struct phonebook_contact *contact, const char *address,
+ int type)
{
- if (email == NULL || strlen(email) == 0)
+ struct phonebook_email *email;
+
+ if (address == NULL || strlen(address) == 0)
return;
/* Not adding email if there is already added with the same value */
- if (find_email(contact->emails, email))
+ if (find_email(contact->emails, address, type))
return;
- contact->emails = g_slist_append(contact->emails, g_strdup(email));
+ email = g_new0(struct phonebook_email, 1);
+ email->address = g_strdup(address);
+ email->type = type;
+
+ contact->emails = g_slist_append(contact->emails, email);
}
static GString *gen_vcards(GSList *contacts,
add_phone_number(contact, reply[COL_FAX_NUMBER], TEL_TYPE_FAX);
/* Adding emails */
- add_email(contact, reply[COL_HOME_EMAIL]);
- add_email(contact, reply[COL_WORK_EMAIL]);
+ add_email(contact, reply[COL_HOME_EMAIL], EMAIL_TYPE_HOME);
+ add_email(contact, reply[COL_WORK_EMAIL], EMAIL_TYPE_WORK);
DBG("contact %p", contact);
diff --git a/obexd/plugins/vcard.c b/obexd/plugins/vcard.c
index 0eed8ae..a20ab4d 100644
--- a/obexd/plugins/vcard.c
+++ b/obexd/plugins/vcard.c
vcard_printf(vcards, "%s:%s", buf, field);
}
-static void vcard_printf_email(GString *vcards, const char *email)
+static void vcard_printf_email(GString *vcards, uint8_t format,
+ const char *address,
+ enum phonebook_email_type category)
{
+ const char *category_string = "";
+ char field[LEN_MAX];
int len = 0;
- if (email)
- len = strlen(email);
+ if (!address || !(len = strlen(address)))
+ return;
- if (len) {
- char field[LEN_MAX];
- add_slash(field, email, LEN_MAX, len);
- vcard_printf(vcards,
- "EMAIL;TYPE=INTERNET:%s", field);
+ switch (category){
+ case EMAIL_TYPE_HOME:
+ if (format == FORMAT_VCARD21)
+ category_string = "INTERNET;HOME";
+ else if (format == FORMAT_VCARD30)
+ category_string = "TYPE=INTERNET;TYPE=HOME";
+ break;
+ case EMAIL_TYPE_WORK:
+ if (format == FORMAT_VCARD21)
+ category_string = "INTERNET;WORK";
+ else if (format == FORMAT_VCARD30)
+ category_string = "TYPE=INTERNET;TYPE=WORK";
+ break;
+ default:
+ if (format == FORMAT_VCARD21)
+ category_string = "INTERNET";
+ else if (format == FORMAT_VCARD30)
+ category_string = "TYPE=INTERNET";
}
+
+ add_slash(field, address, LEN_MAX, len);
+ vcard_printf(vcards,"EMAIL;%s:%s", category_string, field);
}
static gboolean org_fields_present(struct phonebook_contact *contact)
if (filter & FILTER_EMAIL) {
GSList *l;
- for (l = contact->emails; l; l = l->next)
- vcard_printf_email(vcards, l->data);
+ for (l = contact->emails; l; l = l->next){
+ struct phonebook_email *email = l->data;
+
+ vcard_printf_email(vcards, format, email->address, email->type);
+ }
}
if (filter & FILTER_ADR)
g_free(number);
}
+static void email_free(gpointer data, gpointer user_data)
+{
+ struct phonebook_email *email = data;
+
+ g_free(email->address);
+ g_free(email);
+}
+
void phonebook_contact_free(struct phonebook_contact *contact)
{
if (contact == NULL)
g_slist_foreach(contact->numbers, number_free, NULL);
g_slist_free(contact->numbers);
- g_slist_foreach(contact->emails, (GFunc) g_free, NULL);
+ g_slist_foreach(contact->emails, email_free, NULL);
g_slist_free(contact->emails);
g_free(contact->fullname);
diff --git a/obexd/plugins/vcard.h b/obexd/plugins/vcard.h
index 0f52425..a22dfc1 100644
--- a/obexd/plugins/vcard.h
+++ b/obexd/plugins/vcard.h
TEL_TYPE_OTHER,
};
+enum phonebook_email_type {
+ EMAIL_TYPE_HOME,
+ EMAIL_TYPE_WORK,
+ EMAIL_TYPE_OTHER,
+};
+
enum phonebook_call_type {
CALL_TYPE_NOT_A_CALL,
CALL_TYPE_MISSED,
int type;
};
+struct phonebook_email {
+ char *address;
+ int type;
+};
+
struct phonebook_contact {
char *fullname;
char *given;