Changeset 2000

Show
Ignore:
Timestamp:
05/17/07 16:30:45
Author:
pvanhoof
Message:

Recursively removing folders

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/docs/building.txt

    r1185 r2000  
    128128Read requirements.txt 
    129129 
     130For debugging 
     131------------- 
     132CFLAGS="-D_GNU_SOURCE -O0 -Wstrict-prototypes -Wall -g -ggdb" PKG_CONFIG_PATH=/opt/asyncworker/lib/pkgconfig \ 
     133        ./autogen.sh --prefix=/opt/tinymail --enable-asyncworker --enable-tests && make && sudo make install 
     134 
  • trunk/libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-command.c

    r1943 r2000  
    112112 
    113113                store->current_folder = folder; 
     114                //store->current_folder = NULL; 
    114115                if (store->capabilities & IMAP_CAPABILITY_CONDSTORE)  
    115116                        cmd = imap_command_strdup_printf (store, "SELECT %F (CONDSTORE)", folder->full_name); 
     
    275276        len = strlen (full_cmd); 
    276277 
    277         /* printf ("-> %s\n", full_cmd); */ 
    278  
     278         
    279279        nwritten = camel_stream_write (store->ostream, full_cmd, len); 
     280 
     281        imap_debug ("(%d, %d) -> %s\n", len, nwritten, full_cmd); 
    280282 
    281283        /* g_mutex_unlock (store->stream_lock); */ 
  • trunk/libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-store.h

    r1951 r2000  
    2626#define CAMEL_IMAP_STORE_H 1 
    2727 
    28 /* #define IDLE_DEBUG 1 */ 
    29 /* #define IMAP_DEBUG 1 */ 
     28#ifdef DEBUG 
     29#define IDLE_DEBUG 1 
     30#define IMAP_DEBUG 1  
     31#endif 
    3032 
    3133#ifdef IDLE_DEBUG 
    32 #define idle_debug(o)  printf ("%s\n", o) 
     34#define idle_debug     g_print  
    3335#else 
    34 #define idle_debug(o)  
     36#define idle_debug(o, ...)     
    3537#endif 
    3638 
    3739#ifdef IMAP_DEBUG 
    38 #define imap_debug(o)  printf ("%s\n", o) 
     40#define imap_debug     g_print  
    3941#else 
    40 #define imap_debug(o)  
     42#define imap_debug(o, ...)     
    4143#endif 
    4244 
  • trunk/libtinymail-camel/tny-camel-folder.c

    r1997 r2000  
    15501550        TnyFolderStore *a_store=NULL; 
    15511551        TnyFolder *retval = NULL; 
    1552         TnyStoreAccount *acc_to, *acc_from
     1552        TnyStoreAccount *acc_to
    15531553        TnyCamelFolderPriv *fpriv = TNY_CAMEL_FOLDER_GET_PRIVATE (folder); 
    15541554        TnyList *headers; 
     
    27662766 
    27672767static void  
    2768 tny_camel_folder_remove_folder (TnyFolderStore *self, TnyFolder *folder, GError **err) 
    2769 
    2770         TNY_CAMEL_FOLDER_GET_CLASS (self)->remove_folder_func (self, folder, err); 
    2771         return; 
    2772 
    2773  
    2774 static void  
    2775 tny_camel_folder_remove_folder_default (TnyFolderStore *self, TnyFolder *folder, GError **err) 
     2768tny_camel_folder_remove_folder_actual (TnyFolderStore *self, TnyFolder *folder, GError **err) 
    27762769{ 
    27772770        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     
    27822775        CamelException ex = CAMEL_EXCEPTION_INITIALISER; 
    27832776        gboolean changed = FALSE; 
    2784  
    2785         if (!_tny_session_check_operation (TNY_FOLDER_PRIV_GET_SESSION(priv), err,  
    2786                         TNY_FOLDER_STORE_ERROR, TNY_FOLDER_STORE_ERROR_REMOVE_FOLDER)) 
    2787                 return; 
    2788  
    2789         if (!cpriv->folder_name || !priv->folder_name) 
    2790         { 
    2791                 _tny_session_stop_operation (TNY_FOLDER_PRIV_GET_SESSION (priv)); 
    2792                 return; 
    2793         } 
    27942777 
    27952778        g_static_rec_mutex_lock (priv->folder_lock); 
     
    28572840        } 
    28582841 
     2842        return; 
     2843} 
     2844 
     2845static void 
     2846recurse_remove (TnyFolderStore *from, TnyFolder *folder, GError **err) 
     2847{ 
     2848        TnyCamelFolderPriv *fpriv = TNY_CAMEL_FOLDER_GET_PRIVATE (from); 
     2849        GError *nerr = NULL; 
     2850 
     2851        g_static_rec_mutex_lock (fpriv->folder_lock); 
     2852 
     2853        if (TNY_IS_FOLDER_STORE (folder)) 
     2854        { 
     2855                TnyList *folders = tny_simple_list_new (); 
     2856                TnyIterator *iter; 
     2857 
     2858                tny_folder_store_get_folders (TNY_FOLDER_STORE (folder),  
     2859                                folders, NULL, &nerr); 
     2860 
     2861                if (nerr != NULL) 
     2862                { 
     2863                        g_object_unref (folders); 
     2864                        goto exception; 
     2865                } 
     2866 
     2867                iter = tny_list_create_iterator (folders); 
     2868                while (!tny_iterator_is_done (iter)) 
     2869                { 
     2870                        TnyFolder *cur = TNY_FOLDER (tny_iterator_get_current (iter)); 
     2871 
     2872                        recurse_remove (TNY_FOLDER_STORE (folder), cur, &nerr); 
     2873 
     2874                        if (nerr != NULL) 
     2875                        { 
     2876                                g_object_unref (cur); 
     2877                                g_object_unref (iter); 
     2878                                g_object_unref (folders); 
     2879                                goto exception; 
     2880                        } 
     2881 
     2882                        g_object_unref (cur); 
     2883                        tny_iterator_next (iter); 
     2884                } 
     2885                g_object_unref (iter); 
     2886                g_object_unref (folders); 
     2887        } 
     2888 
     2889        tny_debug ("tny_folder_store_remove: actual removal of %s\n",  
     2890                        tny_folder_get_name (folder)); 
     2891 
     2892        tny_camel_folder_remove_folder_actual (from, folder, &nerr); 
     2893 
     2894 
     2895exception: 
     2896 
     2897        if (nerr != NULL) 
     2898                g_propagate_error (err, nerr); 
     2899 
     2900        g_static_rec_mutex_unlock (fpriv->folder_lock); 
     2901 
     2902        return; 
     2903} 
     2904 
     2905static void  
     2906tny_camel_folder_remove_folder (TnyFolderStore *self, TnyFolder *folder, GError **err) 
     2907{ 
     2908        TNY_CAMEL_FOLDER_GET_CLASS (self)->remove_folder_func (self, folder, err); 
     2909} 
     2910 
     2911static void  
     2912tny_camel_folder_remove_folder_default (TnyFolderStore *self, TnyFolder *folder, GError **err) 
     2913{ 
     2914        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     2915        GError *nerr = NULL; 
     2916 
     2917        if (!_tny_session_check_operation (TNY_FOLDER_PRIV_GET_SESSION(priv), err,  
     2918                        TNY_FOLDER_STORE_ERROR, TNY_FOLDER_STORE_ERROR_REMOVE_FOLDER)) 
     2919                return; 
     2920 
     2921        recurse_remove (self, folder, &nerr); 
     2922 
     2923        if (nerr != NULL) 
     2924                g_propagate_error (err, nerr); 
     2925 
    28592926        _tny_session_stop_operation (TNY_FOLDER_PRIV_GET_SESSION (priv)); 
    28602927 
    28612928        return; 
    28622929} 
     2930 
    28632931 
    28642932void 
  • trunk/libtinymail-camel/tny-camel-store-account.c

    r1997 r2000  
    396396 
    397397static void  
    398 tny_camel_store_account_remove_folder_default (TnyFolderStore *self, TnyFolder *folder, GError **err) 
     398tny_camel_store_account_remove_folder_actual (TnyFolderStore *self, TnyFolder *folder, GError **err) 
    399399{ 
    400400        TnyCamelAccountPriv *apriv = TNY_CAMEL_ACCOUNT_GET_PRIVATE (self); 
     
    408408 
    409409        /* TNY TODO: Support non-TnyCamelFolder TnyFolder implementations too */ 
     410 
     411 
     412        store = CAMEL_STORE (apriv->service); 
     413 
     414        if (camel_exception_is_set (&ex))  
     415        { 
     416                g_set_error (err, TNY_FOLDER_STORE_ERROR,  
     417                                TNY_FOLDER_STORE_ERROR_REMOVE_FOLDER, 
     418                                camel_exception_get_description (&ex)); 
     419                camel_exception_clear (&ex); 
     420 
     421                if (store && CAMEL_IS_OBJECT (store)) 
     422                                camel_object_unref (CAMEL_OBJECT (store)); 
     423                _tny_session_stop_operation (apriv->session); 
     424 
     425                return; 
     426        } 
     427 
     428        g_assert (CAMEL_IS_STORE (store)); 
     429        g_assert (cpriv->folder_name != NULL); 
     430 
     431        g_static_rec_mutex_lock (cpriv->obs_lock); 
     432        if (cpriv->observers) { 
     433                g_object_unref (G_OBJECT (cpriv->observers)); 
     434                cpriv->observers = NULL; 
     435        } 
     436        if (cpriv->sobservers) { 
     437                g_object_unref (G_OBJECT (cpriv->sobservers)); 
     438                cpriv->sobservers = NULL; 
     439        } 
     440        g_static_rec_mutex_unlock (cpriv->obs_lock); 
     441 
     442        if (camel_store_supports_subscriptions (store)) 
     443                camel_store_subscribe_folder (store, cpriv->folder_name, &subex); 
     444 
     445        camel_store_delete_folder (store, cpriv->folder_name, &ex); 
     446 
     447        if (camel_exception_is_set (&ex))  
     448        { 
     449                g_set_error (err, TNY_FOLDER_STORE_ERROR,  
     450                                TNY_FOLDER_STORE_ERROR_REMOVE_FOLDER, 
     451                                camel_exception_get_description (&ex)); 
     452                camel_exception_clear (&ex); 
     453        } else  
     454        { 
     455                if (camel_store_supports_subscriptions (store)) 
     456                        camel_store_unsubscribe_folder (store, cpriv->folder_name, &subex); 
     457 
     458                TnyFolderStoreChange *change; 
     459                change = tny_folder_store_change_new (self); 
     460                tny_folder_store_change_add_removed_folder (change, folder); 
     461                notify_folder_store_observers_about (self, change); 
     462                g_object_unref (G_OBJECT (change)); 
     463        } 
     464 
     465        g_free (cpriv->folder_name);  
     466        cpriv->folder_name = NULL; 
     467 
     468        camel_object_unref (CAMEL_OBJECT (store)); 
     469 
     470        return; 
     471} 
     472 
     473 
     474static void 
     475recurse_remove (TnyFolderStore *from, TnyFolder *folder, GError **err) 
     476{ 
     477        TnyCamelFolderPriv *fpriv = TNY_CAMEL_FOLDER_GET_PRIVATE (from); 
     478        GError *nerr = NULL; 
     479 
     480        g_static_rec_mutex_lock (fpriv->folder_lock); 
     481 
     482        if (TNY_IS_FOLDER_STORE (folder)) 
     483        { 
     484                TnyList *folders = tny_simple_list_new (); 
     485                TnyIterator *iter; 
     486 
     487                tny_folder_store_get_folders (TNY_FOLDER_STORE (folder),  
     488                                folders, NULL, &nerr); 
     489 
     490                if (nerr != NULL) 
     491                { 
     492                        g_object_unref (folders); 
     493                        goto exception; 
     494                } 
     495 
     496                iter = tny_list_create_iterator (folders); 
     497                while (!tny_iterator_is_done (iter)) 
     498                { 
     499                        TnyFolder *cur = TNY_FOLDER (tny_iterator_get_current (iter)); 
     500 
     501                        recurse_remove (TNY_FOLDER_STORE (folder), cur, &nerr); 
     502 
     503                        if (nerr != NULL) 
     504                        { 
     505                                g_object_unref (cur); 
     506                                g_object_unref (iter); 
     507                                g_object_unref (folders); 
     508                                goto exception; 
     509                        } 
     510 
     511                        g_object_unref (cur); 
     512                        tny_iterator_next (iter); 
     513                } 
     514                g_object_unref (iter); 
     515                g_object_unref (folders); 
     516        } 
     517 
     518        tny_debug ("tny_folder_store_remove: actual removal of %s\n",  
     519                        tny_folder_get_name (folder)); 
     520 
     521        tny_camel_store_account_remove_folder_actual (from, folder, &nerr); 
     522 
     523 
     524exception: 
     525 
     526        if (nerr != NULL) 
     527                g_propagate_error (err, nerr); 
     528 
     529        g_static_rec_mutex_unlock (fpriv->folder_lock); 
     530 
     531        return; 
     532} 
     533 
     534static void  
     535tny_camel_store_account_remove_folder_default (TnyFolderStore *self, TnyFolder *folder, GError **err) 
     536{ 
     537        TnyCamelAccountPriv *apriv = TNY_CAMEL_ACCOUNT_GET_PRIVATE (self); 
     538        GError *nerr = NULL; 
    410539 
    411540        if (!_tny_session_check_operation (apriv->session, err,  
     
    424553        } 
    425554 
    426         store = CAMEL_STORE (apriv->service); 
    427  
    428         if (camel_exception_is_set (&ex))  
    429         { 
    430                 g_set_error (err, TNY_FOLDER_STORE_ERROR,  
    431                                 TNY_FOLDER_STORE_ERROR_REMOVE_FOLDER, 
    432                                 camel_exception_get_description (&ex)); 
    433                 camel_exception_clear (&ex); 
    434  
    435                 if (store && CAMEL_IS_OBJECT (store)) 
    436                                 camel_object_unref (CAMEL_OBJECT (store)); 
    437                 _tny_session_stop_operation (apriv->session); 
    438  
    439                 return; 
    440         } 
    441  
    442         g_assert (CAMEL_IS_STORE (store)); 
    443         g_assert (cpriv->folder_name != NULL); 
    444  
    445         g_static_rec_mutex_lock (cpriv->obs_lock); 
    446         if (cpriv->observers) { 
    447                 g_object_unref (G_OBJECT (cpriv->observers)); 
    448                 cpriv->observers = NULL; 
    449         } 
    450         if (cpriv->sobservers) { 
    451                 g_object_unref (G_OBJECT (cpriv->sobservers)); 
    452                 cpriv->sobservers = NULL; 
    453         } 
    454         g_static_rec_mutex_unlock (cpriv->obs_lock); 
    455  
    456         if (camel_store_supports_subscriptions (store)) 
    457                 camel_store_subscribe_folder (store, cpriv->folder_name, &subex); 
    458  
    459         camel_store_delete_folder (store, cpriv->folder_name, &ex); 
    460  
    461         if (camel_exception_is_set (&ex))  
    462         { 
    463                 g_set_error (err, TNY_FOLDER_STORE_ERROR,  
    464                                 TNY_FOLDER_STORE_ERROR_REMOVE_FOLDER, 
    465                                 camel_exception_get_description (&ex)); 
    466                 camel_exception_clear (&ex); 
    467         } else  
    468         { 
    469                 if (camel_store_supports_subscriptions (store)) 
    470                         camel_store_unsubscribe_folder (store, cpriv->folder_name, &subex); 
    471  
    472                 TnyFolderStoreChange *change; 
    473                 change = tny_folder_store_change_new (self); 
    474                 tny_folder_store_change_add_removed_folder (change, folder); 
    475                 notify_folder_store_observers_about (self, change); 
    476                 g_object_unref (G_OBJECT (change)); 
    477         } 
    478  
    479         g_free (cpriv->folder_name);  
    480         cpriv->folder_name = NULL; 
    481  
    482         camel_object_unref (CAMEL_OBJECT (store)); 
     555        recurse_remove (self, folder, &nerr); 
     556 
     557        if (nerr != NULL) 
     558                g_propagate_error (err, nerr); 
     559 
    483560 
    484561        _tny_session_stop_operation (apriv->session); 
     562 
    485563 
    486564        return;