evolution-data-server/bnc-170052-eds-crash.patch

185 lines
7.0 KiB
Diff
Raw Normal View History

--- addressbook/backends/groupwise/e-book-backend-groupwise.c 2006-06-09 15:05:45.000000000 +0530
+++ addressbook/backends/groupwise/e-book-backend-groupwise-new.c 2006-06-09 14:35:19.000000000 +0530
@@ -73,12 +73,12 @@ struct _EBookBackendGroupwisePrivate {
int mode;
int cache_timeout;
EBookBackendSummary *summary;
+ GMutex *update_cache_mutex;
GMutex *update_mutex;
DB *file_db;
DB_ENV *env;
/* for future use */
void *reserved1;
- void *reserved2;
};
static GStaticMutex global_env_lock = G_STATIC_MUTEX_INIT;
@@ -1170,6 +1170,7 @@ e_book_backend_groupwise_create_contact
e_contact_set (contact, E_CONTACT_UID, id);
g_free (id);
e_book_backend_db_cache_add_contact (egwb->priv->file_db, contact);
+ egwb->priv->file_db->sync(egwb->priv->file_db, 0);
e_book_backend_summary_add_contact (egwb->priv->summary, contact);
e_data_book_respond_create(book, opid, GNOME_Evolution_Addressbook_Success, contact);
@@ -1223,6 +1224,7 @@ e_book_backend_groupwise_remove_contacts
e_book_backend_db_cache_remove_contact (ebgw->priv->file_db, id);
e_book_backend_summary_remove_contact (ebgw->priv->summary, id);
}
+ ebgw->priv->file_db->sync(ebgw->priv->file_db, 0);
e_data_book_respond_remove_contacts (book, opid,
GNOME_Evolution_Addressbook_Success, deleted_ids);
return;
@@ -1358,6 +1360,7 @@ e_book_backend_groupwise_modify_contact
e_book_backend_db_cache_remove_contact (egwb->priv->file_db, id);
e_book_backend_summary_remove_contact (egwb->priv->summary, id);
e_book_backend_db_cache_add_contact (egwb->priv->file_db, contact);
+ egwb->priv->file_db->sync(egwb->priv->file_db, 0);
e_book_backend_summary_add_contact (egwb->priv->summary, contact);
}
else
@@ -2691,6 +2694,8 @@ update_cache (EBookBackendGroupwise *ebg
if (!ebgw)
return FALSE;
+ g_mutex_lock (ebgw->priv->update_cache_mutex);
+
if (enable_debug) {
g_get_current_time(&start);
printf("updating cache for %s\n", ebgw->priv->book_name);
@@ -2729,6 +2734,7 @@ update_cache (EBookBackendGroupwise *ebg
bonobo_object_unref (book_view);
if (enable_debug)
printf("No connection with the server \n");
+ g_mutex_unlock (ebgw->priv->update_cache_mutex);
return FALSE;
}
@@ -2738,6 +2744,7 @@ update_cache (EBookBackendGroupwise *ebg
contact = e_contact_new ();
fill_contact_from_gw_item (contact, E_GW_ITEM (gw_items->data),
ebgw->priv->categories_by_id);
+
e_contact_set (contact, E_CONTACT_BOOK_URI, ebgw->priv->original_uri);
id = e_contact_get_const (contact, E_CONTACT_UID);
@@ -2782,6 +2789,7 @@ update_cache (EBookBackendGroupwise *ebg
printf("updating the cache for %s complated in %ld.%03ld seconds for %d contacts\n",
ebgw->priv->book_name, diff / 1000, diff % 1000, contact_num);
}
+ g_mutex_unlock (ebgw->priv->update_cache_mutex);
return FALSE;
}
@@ -2797,6 +2805,7 @@ update_address_book_deltas (EBookBackend
EContact *contact;
EDataBookView *book_view;
GroupwiseBackendSearchClosure *closure;
+ EGwItem *item;
if (!ebgw)
return FALSE;
@@ -2827,6 +2836,9 @@ update_address_book_deltas (EBookBackend
if (enable_debug)
printf ("sequence is reset, rebuilding cache...\n");
build_cache (ebgw);
+ add_sequence_to_cache (priv->file_db, server_first_sequence,
+ server_last_sequence, server_last_po_rebuild_time);
+ ebgw->priv->file_db->sync (ebgw->priv->file_db, 0);
g_mutex_unlock (priv->update_mutex);
return TRUE;
}
@@ -2844,6 +2856,7 @@ update_address_book_deltas (EBookBackend
add_sequence_to_cache (priv->file_db, server_first_sequence,
server_last_sequence, server_last_po_rebuild_time);
ebgw->priv->file_db->sync (ebgw->priv->file_db, 0);
+ g_mutex_unlock (priv->update_mutex);
return TRUE;
}
@@ -2896,6 +2909,8 @@ update_address_book_deltas (EBookBackend
if (add_list == NULL && delete_list == NULL) {
if (enable_debug)
printf("sequence differs but no changes found !!!\n");
+ add_sequence_to_cache (priv->file_db, server_first_sequence,
+ server_last_sequence, server_last_po_rebuild_time);
g_mutex_unlock (priv->update_mutex);
return TRUE;
}
@@ -2945,6 +2960,20 @@ update_address_book_deltas (EBookBackend
E_GW_ITEM (add_list->data),
ebgw->priv->categories_by_id);
+ /* When a distribution list is modified the server sends me a delete and add response.
+ But it doesnt send me the members, so i have to explicitly request the server for the members of the distribution list */
+
+ if (e_contact_get (contact, E_CONTACT_IS_LIST)) {
+ if(enable_debug)
+ printf ("Contact List modified fetching the members of the contact list\n");
+
+ status = e_gw_connection_get_item (ebgw->priv->cnc, ebgw->priv->container_id, e_contact_get (contact, E_CONTACT_UID), "name email default members", &item);
+ g_object_unref (contact);
+ contact = e_contact_new ();
+ fill_contact_from_gw_item (contact, item, ebgw->priv->categories_by_id);
+ g_object_unref (item);
+ }
+
if (enable_debug)
printf("contact email:%s, contact name:%s\n", (char *)e_contact_get(contact, E_CONTACT_EMAIL_1),(char *) e_contact_get(contact, E_CONTACT_GIVEN_NAME));
e_contact_set (contact,
@@ -2977,7 +3006,6 @@ update_address_book_deltas (EBookBackend
}
cache_last_sequence += contact_num;
-
/* cache is updated, now adding the sequence information to the cache */
add_sequence_to_cache (priv->file_db, server_first_sequence,
@@ -3054,11 +3082,15 @@ e_book_backend_groupwise_authenticate_us
const char *cache_refresh_interval_set;
int cache_refresh_interval = CACHE_REFRESH_INTERVAL;
- if (enable_debug)
- printf ("authenticate user ............\n");
ebgw = E_BOOK_BACKEND_GROUPWISE (backend);
priv = ebgw->priv;
+ if (enable_debug) {
+ printf ("authenticate user ............\n");
+ if(priv->book_name)
+ printf("book_name:%s\n", priv->book_name);
+ }
+
switch (ebgw->priv->mode) {
case GNOME_Evolution_Addressbook_MODE_LOCAL:
@@ -3094,9 +3126,6 @@ e_book_backend_groupwise_authenticate_us
id = NULL;
is_writable = FALSE;
- if (enable_debug)
- if(priv->book_name)
- printf("book_name:%s\n", priv->book_name);
status = e_gw_connection_get_address_book_id (priv->cnc, priv->book_name, &id, &is_writable);
if (status == E_GW_CONNECTION_STATUS_INVALID_CONNECTION)
status = e_gw_connection_get_address_book_id (priv->cnc, priv->book_name, &id, &is_writable);
@@ -3632,6 +3661,8 @@ e_book_backend_groupwise_dispose (GObjec
}
if (bgw->priv->update_mutex)
g_mutex_free (bgw->priv->update_mutex);
+ if (bgw->priv->update_cache_mutex)
+ g_mutex_free (bgw->priv->update_cache_mutex);
g_free (bgw->priv);
bgw->priv = NULL;
@@ -3690,8 +3721,8 @@ e_book_backend_groupwise_init (EBookBack
priv->original_uri = NULL;
priv->cache_timeout = 0;
priv->update_mutex = g_mutex_new();
+ priv->update_cache_mutex = g_mutex_new ();
priv->reserved1 = NULL;
- priv->reserved2 = NULL;
backend->priv = priv;
if (g_getenv ("GROUPWISE_DEBUG")) {