summaryrefslogtreecommitdiff
path: root/camel/camel-folder.c
diff options
context:
space:
mode:
Diffstat (limited to 'camel/camel-folder.c')
-rw-r--r--camel/camel-folder.c106
1 files changed, 65 insertions, 41 deletions
diff --git a/camel/camel-folder.c b/camel/camel-folder.c
index de9ce8543..bd6e74aa7 100644
--- a/camel/camel-folder.c
+++ b/camel/camel-folder.c
@@ -183,6 +183,7 @@ camel_folder_init (gpointer object, gpointer klass)
folder->priv->changed_frozen = camel_folder_change_info_new();
g_static_rec_mutex_init(&folder->priv->lock);
g_static_mutex_init(&folder->priv->change_lock);
+ folder->folder_key = NULL;
}
static void
@@ -194,7 +195,7 @@ camel_folder_finalize (CamelObject *object)
g_free(camel_folder->name);
g_free(camel_folder->full_name);
g_free(camel_folder->description);
-
+ g_free (camel_folder->folder_key);
if (camel_folder->parent_store)
camel_object_unref (camel_folder->parent_store);
@@ -205,11 +206,6 @@ camel_folder_finalize (CamelObject *object)
camel_folder_change_info_free(p->changed_frozen);
- if (camel_folder->cdb) {
- camel_db_close (camel_folder->cdb);
- camel_folder->cdb = NULL;
- }
-
g_static_rec_mutex_free(&p->lock);
g_static_mutex_free(&p->change_lock);
@@ -263,37 +259,8 @@ camel_folder_construct (CamelFolder *folder, CamelStore *parent_store,
folder->name = g_strdup (name);
folder->full_name = g_strdup (full_name);
+ camel_folder_get_hash (folder);
- store_db_path = g_build_filename (service->url->path, CAMEL_DB_FILE, NULL);
- camel_exception_init(&ex);
- if (strlen (store_db_path) < 2) {
- char *store_path = camel_session_get_storage_path ((CamelSession *)camel_service_get_session (service), service, &ex);
-
- g_free (store_db_path);
- store_db_path = g_build_filename (store_path, CAMEL_DB_FILE, NULL);
- g_free (store_path);
- }
-
- folder->cdb = camel_db_open (store_db_path, &ex);
- if (camel_exception_is_set (&ex)) {
- char *store_path;
-
- g_print ("Failure for store_db_path : [%s]\n", store_db_path);
- g_free (store_db_path);
-
- store_path = camel_session_get_storage_path ((CamelSession *)camel_service_get_session (service), service, &ex);
- store_db_path = g_build_filename (store_path, CAMEL_DB_FILE, NULL);
- g_free (store_path);
- camel_exception_clear(&ex);
- folder->cdb = camel_db_open (store_db_path, &ex);
- if (camel_exception_is_set (&ex)) {
- g_print("Retry with %s failed\n", store_db_path);
- g_free(store_db_path);
- camel_exception_clear(&ex);
- return;
- }
- }
- g_free (store_db_path);
}
@@ -1589,7 +1556,8 @@ void
camel_folder_delete (CamelFolder *folder)
{
g_return_if_fail (CAMEL_IS_FOLDER (folder));
-
+ char *url;
+
CAMEL_FOLDER_REC_LOCK (folder, lock);
if (folder->folder_flags & CAMEL_FOLDER_HAS_BEEN_DELETED) {
CAMEL_FOLDER_REC_UNLOCK (folder, lock);
@@ -1603,8 +1571,9 @@ camel_folder_delete (CamelFolder *folder)
CAMEL_FOLDER_REC_UNLOCK (folder, lock);
/* Delete the references of the folder from the DB.*/
- camel_db_delete_folder (folder->cdb, folder->full_name, NULL);
-
+ url = camel_service_get_url(folder->parent_store);
+ camel_db_clear_folder_summary (folder->parent_store->cdb_write, url, folder->full_name, folder->folder_key, NULL);
+ g_free(url);
camel_object_trigger_event (folder, "deleted", NULL);
}
@@ -1637,11 +1606,13 @@ void
camel_folder_rename(CamelFolder *folder, const char *new)
{
char *old;
-
+ char *url = camel_service_get_url(folder->parent_store);
old = g_strdup(folder->full_name);
CF_CLASS (folder)->rename(folder, new);
- camel_db_rename_folder (folder->cdb, old, new, NULL);
+ #warning "DBV2 FOLDER RENAME WONT WORK"
+ camel_db_rename_folder (folder->parent_store->cdb, url, old, new, NULL);
+ g_free(url);
camel_object_trigger_event (folder, "renamed", old);
g_free(old);
}
@@ -2115,6 +2086,59 @@ camel_folder_free_deep (CamelFolder *folder, GPtrArray *array)
}
+char *
+camel_folder_hash(CamelStore *store, char *folder_name, char buffer[8])
+{
+ GChecksum *checksum;
+ guint8 *digest;
+ gsize length;
+ int state = 0, save = 0;
+ char *tmp;
+ int i;
+
+ length = g_checksum_type_get_length (G_CHECKSUM_MD5);
+ digest = g_alloca (length);
+
+ checksum = g_checksum_new (G_CHECKSUM_MD5);
+ tmp = camel_service_get_url((CamelService *)store);
+ g_checksum_update (checksum, (guchar *) tmp, -1);
+ g_free (tmp);
+ g_checksum_update (checksum, (guchar *) folder_name, -1);
+ g_checksum_get_digest (checksum, digest, &length);
+ g_checksum_free (checksum);
+
+ g_base64_encode_step (digest, 6, FALSE, buffer, &state, &save);
+ g_base64_encode_close (FALSE, buffer, &state, &save);
+
+ for (i=0;i<8;i++) {
+ if (buffer[i] == '+')
+ buffer[i] = '.';
+ if (buffer[i] == '/')
+ buffer[i] = '_';
+ }
+}
+
+char *
+camel_folder_make_hash(CamelFolder *folder, char buffer[8])
+{
+ camel_folder_hash (folder->parent_store, folder->full_name, buffer);
+}
+
+const char *
+camel_folder_get_hash(CamelFolder *folder)
+{
+ char buffer[8];
+
+ if (folder->folder_key)
+ return folder->folder_key;
+
+ camel_folder_make_hash (folder, buffer);
+ folder->folder_key = g_strdup_printf("%c%c%c%c%c%c%c%c", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7]);
+
+ return folder->folder_key;
+
+}
+
/**
* camel_folder_change_info_new:
*