Bug #638948 - NNTP folder doesn't implement Expunge
authorMilan Crha <mcrha@redhat.com>
Tue, 11 Jan 2011 10:38:59 +0000 (11:38 +0100)
committerMilan Crha <mcrha@redhat.com>
Tue, 11 Jan 2011 10:38:59 +0000 (11:38 +0100)
camel/camel-disco-folder.c
camel/providers/nntp/camel-nntp-folder.c

index 65e1031..9283010 100644 (file)
@@ -176,6 +176,7 @@ disco_expunge_uids (CamelFolder *folder,
 
        switch (camel_disco_store_status (CAMEL_DISCO_STORE (parent_store))) {
        case CAMEL_DISCO_STORE_ONLINE:
+               g_return_val_if_fail (disco_folder_class->expunge_uids_online != NULL, FALSE);
                success = disco_folder_class->expunge_uids_online (
                        folder, uids, error);
                CAMEL_CHECK_GERROR (
@@ -183,6 +184,7 @@ disco_expunge_uids (CamelFolder *folder,
                return success;
 
        case CAMEL_DISCO_STORE_OFFLINE:
+               g_return_val_if_fail (disco_folder_class->expunge_uids_offline != NULL, FALSE);
                success = disco_folder_class->expunge_uids_offline (
                        folder, uids, error);
                CAMEL_CHECK_GERROR (
@@ -190,6 +192,7 @@ disco_expunge_uids (CamelFolder *folder,
                return success;
 
        case CAMEL_DISCO_STORE_RESYNCING:
+               g_return_val_if_fail (disco_folder_class->expunge_uids_resyncing != NULL, FALSE);
                success = disco_folder_class->expunge_uids_resyncing (
                        folder, uids, error);
                CAMEL_CHECK_GERROR (
@@ -217,6 +220,7 @@ disco_append_message_sync (CamelFolder *folder,
 
        switch (camel_disco_store_status (CAMEL_DISCO_STORE (parent_store))) {
        case CAMEL_DISCO_STORE_ONLINE:
+               g_return_val_if_fail (disco_folder_class->append_online != NULL, FALSE);
                success = disco_folder_class->append_online (
                        folder, message, info,
                        appended_uid, cancellable, error);
@@ -224,6 +228,7 @@ disco_append_message_sync (CamelFolder *folder,
                return success;
 
        case CAMEL_DISCO_STORE_OFFLINE:
+               g_return_val_if_fail (disco_folder_class->append_offline != NULL, FALSE);
                success = disco_folder_class->append_offline (
                        folder, message, info,
                        appended_uid, cancellable, error);
@@ -231,6 +236,7 @@ disco_append_message_sync (CamelFolder *folder,
                return success;
 
        case CAMEL_DISCO_STORE_RESYNCING:
+               g_return_val_if_fail (disco_folder_class->append_resyncing != NULL, FALSE);
                success = disco_folder_class->append_resyncing (
                        folder, message, info,
                        appended_uid, cancellable, error);
@@ -286,6 +292,7 @@ disco_refresh_info_sync (CamelFolder *folder,
                return TRUE;
 
        disco_folder_class = CAMEL_DISCO_FOLDER_GET_CLASS (folder);
+       g_return_val_if_fail (disco_folder_class->refresh_info_online != NULL, FALSE);
 
        success = disco_folder_class->refresh_info_online (
                folder, cancellable, error);
@@ -314,16 +321,19 @@ disco_synchronize_sync (CamelFolder *folder,
 
        switch (camel_disco_store_status (CAMEL_DISCO_STORE (parent_store))) {
        case CAMEL_DISCO_STORE_ONLINE:
+               g_return_val_if_fail (disco_folder_class->sync_online != NULL, FALSE);
                success = disco_folder_class->sync_online (folder, error);
                CAMEL_CHECK_GERROR (folder, sync_online, success, error);
                return success;
 
        case CAMEL_DISCO_STORE_OFFLINE:
+               g_return_val_if_fail (disco_folder_class->sync_offline != NULL, FALSE);
                success = disco_folder_class->sync_offline (folder, error);
                CAMEL_CHECK_GERROR (folder, sync_offline, success, error);
                return success;
 
        case CAMEL_DISCO_STORE_RESYNCING:
+               g_return_val_if_fail (disco_folder_class->sync_resyncing != NULL, FALSE);
                success = disco_folder_class->sync_resyncing (folder, error);
                CAMEL_CHECK_GERROR (folder, sync_resyncing, success, error);
                return success;
@@ -350,6 +360,7 @@ disco_transfer_messages_to_sync (CamelFolder *source,
 
        switch (camel_disco_store_status (CAMEL_DISCO_STORE (parent_store))) {
        case CAMEL_DISCO_STORE_ONLINE:
+               g_return_val_if_fail (disco_folder_class->transfer_online != NULL, FALSE);
                success = disco_folder_class->transfer_online (
                        source, uids, dest, transferred_uids,
                        delete_originals, cancellable, error);
@@ -357,6 +368,7 @@ disco_transfer_messages_to_sync (CamelFolder *source,
                return success;
 
        case CAMEL_DISCO_STORE_OFFLINE:
+               g_return_val_if_fail (disco_folder_class->transfer_offline != NULL, FALSE);
                success = disco_folder_class->transfer_offline (
                        source, uids, dest, transferred_uids,
                        delete_originals, cancellable, error);
@@ -364,6 +376,7 @@ disco_transfer_messages_to_sync (CamelFolder *source,
                return success;
 
        case CAMEL_DISCO_STORE_RESYNCING:
+               g_return_val_if_fail (disco_folder_class->transfer_resyncing != NULL, FALSE);
                success = disco_folder_class->transfer_resyncing (
                        source, uids, dest, transferred_uids,
                        delete_originals, cancellable, error);
index 5c0e1b3..1857c23 100644 (file)
@@ -576,6 +576,32 @@ nntp_folder_transfer_message (CamelFolder *source,
        return FALSE;
 }
 
+static gboolean
+nntp_folder_expunge_uids_offline (CamelFolder *folder, GPtrArray *uids, GError **error)
+{
+       CamelFolderChangeInfo *changes;
+       gint ii;
+
+       g_return_val_if_fail (folder != NULL, FALSE);
+       g_return_val_if_fail (CAMEL_IS_NNTP_FOLDER (folder), FALSE);
+       g_return_val_if_fail (uids != NULL, FALSE);
+       g_return_val_if_fail (folder->summary != NULL, FALSE);
+
+       /* can only remove deleted messages from a local cache */
+
+       changes = camel_folder_change_info_new ();
+       for (ii = 0; ii < uids->len; ii++) {
+               camel_folder_summary_remove_uid (folder->summary, uids->pdata[ii]);
+               camel_folder_change_info_remove_uid (changes, uids->pdata[ii]);
+       }
+
+       camel_folder_summary_save_to_db (folder->summary, NULL);
+       camel_folder_changed (folder, changes);
+       camel_folder_change_info_free (changes);
+
+       return TRUE;
+}
+
 static void
 camel_nntp_folder_class_init (CamelNNTPFolderClass *class)
 {
@@ -609,6 +635,9 @@ camel_nntp_folder_class_init (CamelNNTPFolderClass *class)
        disco_folder_class->transfer_resyncing = nntp_folder_transfer_message;
        disco_folder_class->transfer_offline = nntp_folder_transfer_message;
        disco_folder_class->refresh_info_online = nntp_folder_refresh_info_online;
+       disco_folder_class->expunge_uids_online = nntp_folder_expunge_uids_offline;
+       disco_folder_class->expunge_uids_offline = nntp_folder_expunge_uids_offline;
+       disco_folder_class->expunge_uids_resyncing = nntp_folder_expunge_uids_offline;
 }
 
 static void