aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/backend
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/backend')
-rw-r--r--addressbook/backend/pas/pas-backend-summary.c65
1 files changed, 34 insertions, 31 deletions
diff --git a/addressbook/backend/pas/pas-backend-summary.c b/addressbook/backend/pas/pas-backend-summary.c
index 18e56f61a6..55c9144ed3 100644
--- a/addressbook/backend/pas/pas-backend-summary.c
+++ b/addressbook/backend/pas/pas-backend-summary.c
@@ -58,6 +58,7 @@ struct _PASBackendSummaryPrivate {
typedef struct {
char *id;
char *nickname;
+ char *full_name;
char *given_name;
char *surname;
char *file_as;
@@ -71,6 +72,7 @@ typedef struct {
it's not stored on disk. */
guint16 id_len;
guint16 nickname_len;
+ guint16 full_name_len; /* version 3.0 field */
guint16 given_name_len;
guint16 surname_len;
guint16 file_as_len;
@@ -90,14 +92,17 @@ typedef struct {
#define PAS_SUMMARY_FILE_VERSION_1_0 1000
#define PAS_SUMMARY_FILE_VERSION_2_0 2000
+#define PAS_SUMMARY_FILE_VERSION_3_0 3000
-#define PAS_SUMMARY_FILE_VERSION PAS_SUMMARY_FILE_VERSION_2_0
+#define PAS_SUMMARY_FILE_VERSION PAS_SUMMARY_FILE_VERSION_3_0
static void
free_summary_item (PASBackendSummaryItem *item)
{
g_free (item->id);
g_free (item->nickname);
+ g_free (item->full_name);
+ g_free (item->given_name);
g_free (item->surname);
g_free (item->file_as);
g_free (item->email_1);
@@ -125,7 +130,7 @@ pas_backend_summary_new (const char *summary_path, int flush_timeout_millis)
summary->priv->summary_path = g_strdup (summary_path);
summary->priv->flush_timeout_millis = flush_timeout_millis;
- summary->priv->file_version = PAS_SUMMARY_FILE_VERSION_1_0;
+ summary->priv->file_version = PAS_SUMMARY_FILE_VERSION_3_0;
return summary;
}
@@ -246,40 +251,20 @@ pas_backend_summary_load_header (PASBackendSummary *summary, FILE *fp,
header->file_version = ntohl (header->file_version);
+ if (header->file_version < PAS_SUMMARY_FILE_VERSION) {
+ return FALSE; /* this will cause the entire summary to be rebuilt */
+ }
+
rv = fread (&header->num_items, sizeof (header->num_items), 1, fp);
if (rv != 1)
return FALSE;
header->num_items = ntohl (header->num_items);
- if (header->file_version == PAS_SUMMARY_FILE_VERSION) {
- rv = fread (&header->summary_mtime, sizeof (header->summary_mtime), 1, fp);
- if (rv != 1)
- return FALSE;
- header->summary_mtime = ntohl (header->summary_mtime);
- }
- else {
- if (header->file_version == PAS_SUMMARY_FILE_VERSION_1_0) {
- /* the header lacks the mtime of the file.
- set it to the mtime of the on-disk file,
- and we'll save it out properly next time */
- int fd;
- struct stat sb;
-
- fd = fileno (fp);
- if (fstat (fd, &sb) == -1) {
- g_warning ("error fstat'ing summary file.");
- /* just set the mtime to zero and hope for the best */
- header->summary_mtime = 0;
- }
- header->summary_mtime = sb.st_mtime;
- summary->priv->upgraded = TRUE;
- }
- else {
- /* unknown version */
- return FALSE;
- }
- }
+ rv = fread (&header->summary_mtime, sizeof (header->summary_mtime), 1, fp);
+ if (rv != 1)
+ return FALSE;
+ header->summary_mtime = ntohl (header->summary_mtime);
return TRUE;
}
@@ -309,7 +294,7 @@ pas_backend_summary_load_item (PASBackendSummary *summary,
char *buf;
FILE *fp = summary->priv->fp;
- if (summary->priv->file_version <= PAS_SUMMARY_FILE_VERSION_2_0) {
+ if (summary->priv->file_version >= PAS_SUMMARY_FILE_VERSION_3_0) {
PASBackendSummaryDiskItem disk_item;
int rv = fread (&disk_item, sizeof (disk_item), 1, fp);
if (rv != 1)
@@ -317,6 +302,7 @@ pas_backend_summary_load_item (PASBackendSummary *summary,
disk_item.id_len = ntohs (disk_item.id_len);
disk_item.nickname_len = ntohs (disk_item.nickname_len);
+ disk_item.full_name_len = ntohs (disk_item.full_name_len);
disk_item.given_name_len = ntohs (disk_item.given_name_len);
disk_item.surname_len = ntohs (disk_item.surname_len);
disk_item.file_as_len = ntohs (disk_item.file_as_len);
@@ -344,6 +330,15 @@ pas_backend_summary_load_item (PASBackendSummary *summary,
item->nickname = buf;
}
+ if (disk_item.full_name_len) {
+ buf = read_string (fp, disk_item.full_name_len);
+ if (!buf) {
+ free_summary_item (item);
+ return FALSE;
+ }
+ item->full_name = buf;
+ }
+
if (disk_item.given_name_len) {
buf = read_string (fp, disk_item.given_name_len);
if (!buf) {
@@ -553,6 +548,9 @@ pas_backend_summary_save_item (PASBackendSummary *summary, FILE *fp, PASBackendS
len = item->given_name ? strlen (item->given_name) : 0;
disk_item.given_name_len = htons (len);
+ len = item->full_name ? strlen (item->full_name) : 0;
+ disk_item.full_name_len = htons (len);
+
len = item->surname ? strlen (item->surname) : 0;
disk_item.surname_len = htons (len);
@@ -576,6 +574,8 @@ pas_backend_summary_save_item (PASBackendSummary *summary, FILE *fp, PASBackendS
return FALSE;
if (!save_string (item->nickname, fp))
return FALSE;
+ if (!save_string (item->full_name, fp))
+ return FALSE;
if (!save_string (item->given_name, fp))
return FALSE;
if (!save_string (item->surname, fp))
@@ -676,6 +676,7 @@ pas_backend_summary_add_card (PASBackendSummary *summary, const char *vcard)
new_item->id = g_strdup (e_card_simple_get_id (simple));
new_item->nickname = e_card_simple_get (simple, E_CARD_SIMPLE_FIELD_NICKNAME);
+ new_item->full_name = e_card_simple_get (simple, E_CARD_SIMPLE_FIELD_FULL_NAME);
new_item->given_name = e_card_simple_get (simple, E_CARD_SIMPLE_FIELD_GIVEN_NAME);
new_item->surname = e_card_simple_get (simple, E_CARD_SIMPLE_FIELD_FAMILY_NAME);
new_item->file_as = e_card_simple_get (simple, E_CARD_SIMPLE_FIELD_FILE_AS);
@@ -693,6 +694,7 @@ pas_backend_summary_add_card (PASBackendSummary *summary, const char *vcard)
summary->priv->size += sizeof (PASBackendSummaryItem);
summary->priv->size += new_item->id ? strlen (new_item->id) : 0;
summary->priv->size += new_item->nickname ? strlen (new_item->nickname) : 0;
+ summary->priv->size += new_item->full_name ? strlen (new_item->full_name) : 0;
summary->priv->size += new_item->given_name ? strlen (new_item->given_name) : 0;
summary->priv->size += new_item->surname ? strlen (new_item->surname) : 0;
summary->priv->size += new_item->file_as ? strlen (new_item->file_as) : 0;
@@ -1033,6 +1035,7 @@ pas_backend_summary_get_summary_vcard(PASBackendSummary *summary, const char *id
e_card_simple_set (simple, E_CARD_SIMPLE_FIELD_GIVEN_NAME, item->given_name);
e_card_simple_set (simple, E_CARD_SIMPLE_FIELD_FAMILY_NAME, item->surname);
e_card_simple_set (simple, E_CARD_SIMPLE_FIELD_NICKNAME, item->nickname);
+ e_card_simple_set (simple, E_CARD_SIMPLE_FIELD_FULL_NAME, item->full_name);
e_card_simple_set_email (simple, E_CARD_SIMPLE_EMAIL_ID_EMAIL, item->email_1);
e_card_simple_set_email (simple, E_CARD_SIMPLE_EMAIL_ID_EMAIL_2, item->email_2);
e_card_simple_set_email (simple, E_CARD_SIMPLE_EMAIL_ID_EMAIL_3, item->email_3);