Changeset 1262

Show
Ignore:
Timestamp:
11/27/06 23:15:12
Author:
pvanhoof
Message:

Added error reporting support

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r1261 r1262  
     12006-11-27  Philip Van Hoof <pvanhoof@gnome.org> 
     2 
     3        * Added the first pieces for error reporting and support 
     4        * Added error reporting and checking in a lot methods and types 
     5        * Adapted the Python bindings to support error checking 
     6 
     7        * This was a major API change in all libraries 
     8 
    192006-11-27  Øystein Gisnås <oystein@gisnas.net> 
    210 
  • trunk/bindings/python/Makefile.am

    r1238 r1262  
    8686 
    8787tinymail_h_files = \ 
     88        $(top_srcdir)/libtinymail/tny-error.h \ 
    8889        $(top_srcdir)/libtinymail/tny-account.h \ 
    8990        $(top_srcdir)/libtinymail/tny-account-store.h \ 
  • trunk/bindings/python/tinymail.override

    r1111 r1262  
    4040 
    4141static void 
    42 tny_get_folders_cb (TnyFolderStore *self, TnyList *list, gpointer user_data) 
     42tny_get_folders_cb (TnyFolderStore *self, TnyList *list, GError **err, gpointer user_data) 
    4343{ 
    4444    PyObject *callback, *args, *ret; 
     
    5454    if (!ret) 
    5555        PyErr_Print(); 
     56 
     57    pyg_error_check(err); 
     58 
    5659    Py_XDECREF(ret); 
    5760    Py_DECREF(args); 
     
    9295 
    9396static void 
    94 tny_refresh_folder_cb (TnyFolder *self, gboolean cancelled, gpointer user_data) 
     97tny_refresh_folder_cb (TnyFolder *self, gboolean cancelled, GError **err, gpointer user_data) 
    9598{ 
    9699    PyObject *callback, *args, *ret; 
     
    106109    if (!ret) 
    107110        PyErr_Print(); 
     111 
     112    pyg_error_check(err); 
     113         
    108114    Py_XDECREF(ret); 
    109115    Py_DECREF(args); 
     
    138144    static char *kwlist[] = { "refresh_func", "status_func", "user_data", NULL }; 
    139145    PyObject *refresh_func, *status_func = Py_None, *user_data = Py_None; 
    140  
    141146    PyObject *data; 
    142147 
  • trunk/libtinymail-camel/tny-camel-folder.c

    r1240 r1262  
    3434#include <tny-camel-store-account.h> 
    3535#include <tny-list.h> 
     36#include <tny-error.h> 
    3637 
    3738#include <camel/camel-folder.h> 
     
    231232 
    232233static void  
    233 tny_camel_folder_add_msg (TnyFolder *self, TnyMsg *msg
    234 { 
    235         TNY_CAMEL_FOLDER_GET_CLASS (self)->add_msg_func (self, msg); 
     234tny_camel_folder_add_msg (TnyFolder *self, TnyMsg *msg, GError **err
     235{ 
     236        TNY_CAMEL_FOLDER_GET_CLASS (self)->add_msg_func (self, msg, err); 
    236237        return; 
    237238} 
    238239 
    239240static void  
    240 tny_camel_folder_add_msg_default (TnyFolder *self, TnyMsg *msg
     241tny_camel_folder_add_msg_default (TnyFolder *self, TnyMsg *msg, GError **err
    241242{ 
    242243        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     
    261262        camel_folder_append_message (priv->folder, message, NULL, NULL, ex); 
    262263 
    263         /* TODO: improve handling of ex */ 
    264264        if (camel_exception_is_set (ex)) 
    265                 g_warning ("Adding message failed: %s\n",  
     265        { 
     266                g_set_error (err, TNY_CAMEL_LITE_ERROR,  
     267                        TNY_FOLDER_ADD_MSG_ERROR, 
    266268                        camel_exception_get_description (ex)); 
    267  
    268         /* TODO: emit a folder-msg-inserted signal */ 
     269        } else { 
     270 
     271                /* TODO: emit a folder-msg-inserted signal */ 
     272         
     273        } 
    269274 
    270275        camel_exception_free (ex); 
     
    277282 
    278283static void  
    279 tny_camel_folder_remove_msg (TnyFolder *self, TnyHeader *header
    280 { 
    281         TNY_CAMEL_FOLDER_GET_CLASS (self)->remove_msg_func (self, header); 
     284tny_camel_folder_remove_msg (TnyFolder *self, TnyHeader *header, GError **err
     285{ 
     286        TNY_CAMEL_FOLDER_GET_CLASS (self)->remove_msg_func (self, header, err); 
    282287        return; 
    283288} 
    284289 
    285290static void  
    286 tny_camel_folder_remove_msg_default (TnyFolder *self, TnyHeader *header
     291tny_camel_folder_remove_msg_default (TnyFolder *self, TnyHeader *header, GError **err
    287292{ 
    288293        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     
    302307                } 
    303308 
    304         tny_msg_remove_strategy_perform_remove (priv->remove_strat, self, header); 
     309        tny_msg_remove_strategy_perform_remove (priv->remove_strat, self, header, err); 
    305310 
    306311        g_mutex_unlock (priv->folder_lock); 
     
    310315 
    311316static void  
    312 tny_camel_folder_expunge (TnyFolder *self
    313 { 
    314         TNY_CAMEL_FOLDER_GET_CLASS (self)->expunge_func (self); 
     317tny_camel_folder_expunge (TnyFolder *self, GError **err
     318{ 
     319        TNY_CAMEL_FOLDER_GET_CLASS (self)->expunge_func (self, err); 
    315320        return; 
    316321} 
    317322 
    318323static void  
    319 tny_camel_folder_expunge_default (TnyFolder *self
     324tny_camel_folder_expunge_default (TnyFolder *self, GError **err
    320325{ 
    321326        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
    322327        CamelException ex = CAMEL_EXCEPTION_INITIALISER; 
    323  
    324         /* This is only really needed in case message_info_load in  
    325         camel-folder-summary.c doesn't try to recover the original message 
    326         info instance  
    327  
    328         if (priv->headers_managed > 0) 
    329         { 
    330                 g_critical ("Request to expunge a folder denied: there are still " 
    331                         "header instances of this folder active. Destroy them " 
    332                         "first."); 
    333                 return; 
    334         } 
    335         */ 
    336328 
    337329        g_mutex_lock (priv->folder_lock); 
     
    346338        camel_folder_sync (priv->folder, TRUE, &ex); 
    347339 
    348         /* TODO: handle ex */ 
     340        if (camel_exception_is_set (&ex)) 
     341        { 
     342                g_set_error (err, TNY_CAMEL_LITE_ERROR,  
     343                        TNY_FOLDER_EXPUNGE_ERROR, 
     344                        camel_exception_get_description (&ex)); 
     345        } 
    349346 
    350347        g_mutex_unlock (priv->folder_lock); 
     
    556553        gboolean cancelled; 
    557554        guint depth; 
     555        GError *err; 
    558556} RefreshFolderInfo; 
    559557 
     
    563561tny_camel_folder_refresh_async_destroyer (gpointer thr_user_data) 
    564562{ 
    565  
    566         TnyFolder *self = ((RefreshFolderInfo*)thr_user_data)->self; 
     563        RefreshFolderInfo *info = thr_user_data; 
     564        TnyFolder *self = info->self; 
    567565 
    568566        /* gidle reference */ 
    569567        g_object_unref (G_OBJECT (self)); 
     568        if (info->err) 
     569                g_error_free (info->err); 
    570570 
    571571        g_slice_free (RefreshFolderInfo, thr_user_data); 
     
    580580 
    581581        if (info->callback) 
    582                 info->callback (info->self, info->cancelled, info->user_data); 
     582                info->callback (info->self, info->cancelled, &info->err, info->user_data); 
    583583 
    584584        return FALSE; 
     
    600600        /* gidle reference */ 
    601601        g_object_unref (G_OBJECT (info->minfo->self)); 
    602  
    603602        g_free (info->what); 
     603 
    604604        g_slice_free (RefreshFolderInfo, info->minfo); 
    605605        g_slice_free (ProgressInfo, data); 
     
    681681        gchar *str; 
    682682        CamelException *ex = camel_exception_new (); 
     683        GError *err = NULL; 
    683684 
    684685        camel_exception_init (ex); 
     
    701702        g_free (str); 
    702703        camel_folder_refresh_info (priv->folder, ex); 
     704 
     705        info->err = NULL; 
     706 
     707        if (camel_exception_is_set (ex)) 
     708        { 
     709                g_set_error (&err, TNY_CAMEL_LITE_ERROR,  
     710                        TNY_FOLDER_REFRESH_ERROR, 
     711                        camel_exception_get_description (ex)); 
     712                if (err != NULL) 
     713                        info->err = g_error_copy ((const GError *) &err);                
     714        } 
     715 
    703716        priv->cached_length = camel_folder_get_message_count (priv->folder); 
    704717 
     
    706719                priv->unread_length = (guint)camel_folder_get_unread_message_count (priv->folder); 
    707720 
    708         /* TODO: handle ex */ 
    709721        camel_exception_free (ex); 
    710722        info->cancelled = camel_operation_cancel_check (apriv->cancel); 
     
    763775        GThread *thread; 
    764776 
     777        info->err = NULL; 
    765778        info->self = self; 
    766779        info->callback = callback; 
     
    779792 
    780793static void  
    781 tny_camel_folder_refresh (TnyFolder *self
    782 { 
    783         TNY_CAMEL_FOLDER_GET_CLASS (self)->refresh_func (self); 
     794tny_camel_folder_refresh (TnyFolder *self, GError **err
     795{ 
     796        TNY_CAMEL_FOLDER_GET_CLASS (self)->refresh_func (self, err); 
    784797        return; 
    785798} 
    786799 
    787800static void  
    788 tny_camel_folder_refresh_default (TnyFolder *self
     801tny_camel_folder_refresh_default (TnyFolder *self, GError **err
    789802{ 
    790803        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     
    811824                priv->unread_length = (guint)camel_folder_get_unread_message_count (priv->folder); 
    812825 
    813         /* TODO: handle ex */ 
     826        if (camel_exception_is_set (ex)) 
     827        { 
     828                g_set_error (err, TNY_CAMEL_LITE_ERROR,  
     829                        TNY_FOLDER_REFRESH_ERROR, 
     830                        camel_exception_get_description (ex)); 
     831        } 
     832 
    814833        camel_exception_free (ex); 
    815834 
     
    820839 
    821840static void 
    822 tny_camel_folder_get_headers (TnyFolder *self, TnyList *headers, gboolean refresh
    823 { 
    824         TNY_CAMEL_FOLDER_GET_CLASS (self)->get_headers_func (self, headers, refresh); 
    825         return; 
    826 } 
    827  
    828 static void 
    829 tny_camel_folder_get_headers_default (TnyFolder *self, TnyList *headers, gboolean refresh
     841tny_camel_folder_get_headers (TnyFolder *self, TnyList *headers, gboolean refresh, GError **err
     842{ 
     843        TNY_CAMEL_FOLDER_GET_CLASS (self)->get_headers_func (self, headers, refresh, err); 
     844        return; 
     845} 
     846 
     847static void 
     848tny_camel_folder_get_headers_default (TnyFolder *self, TnyList *headers, gboolean refresh, GError **err
    830849{ 
    831850        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     
    854873        { 
    855874                camel_folder_refresh_info (priv->folder, &ex); 
     875 
     876                if (camel_exception_is_set (&ex)) 
     877                { 
     878                        g_set_error (err, TNY_CAMEL_LITE_ERROR,  
     879                                TNY_FOLDER_REFRESH_ERROR, 
     880                                camel_exception_get_description (&ex)); 
     881                } 
     882 
    856883                priv->cached_length = camel_folder_get_message_count (priv->folder); 
    857884                if (G_LIKELY (priv->folder) && CAMEL_IS_FOLDER (priv->folder) && G_LIKELY (priv->has_summary_cap)) 
     
    878905 
    879906static TnyMsg* 
    880 tny_camel_folder_get_msg (TnyFolder *self, TnyHeader *header
    881 { 
    882         return TNY_CAMEL_FOLDER_GET_CLASS (self)->get_msg_func (self, header); 
     907tny_camel_folder_get_msg (TnyFolder *self, TnyHeader *header, GError **err
     908{ 
     909        return TNY_CAMEL_FOLDER_GET_CLASS (self)->get_msg_func (self, header, err); 
    883910} 
    884911 
    885912static TnyMsg* 
    886 tny_camel_folder_get_msg_default (TnyFolder *self, TnyHeader *header
     913tny_camel_folder_get_msg_default (TnyFolder *self, TnyHeader *header, GError **err
    887914{ 
    888915        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     
    907934        camel_exception_init (ex); 
    908935        camel_message = camel_folder_get_message (priv->folder, (const char *) id, ex);     
     936 
     937        if (camel_exception_is_set (ex)) 
     938        { 
     939                g_set_error (err, TNY_CAMEL_LITE_ERROR,  
     940                        TNY_FOLDER_GET_MSG_ERROR, 
     941                        camel_exception_get_description (ex)); 
     942        } 
    909943 
    910944        if (camel_message && camel_exception_get_id (ex) == CAMEL_EXCEPTION_NONE && CAMEL_IS_OBJECT (camel_message)) 
     
    9871021 
    9881022static void 
    989 tny_camel_folder_transfer_msgs (TnyFolder *self, TnyList *headers, TnyFolder *folder_dst, gboolean delete_originals
    990 { 
    991         TNY_CAMEL_FOLDER_GET_CLASS (self)->transfer_msgs_func (self, headers, folder_dst, delete_originals); 
     1023tny_camel_folder_transfer_msgs (TnyFolder *self, TnyList *headers, TnyFolder *folder_dst, gboolean delete_originals, GError **err
     1024{ 
     1025        TNY_CAMEL_FOLDER_GET_CLASS (self)->transfer_msgs_func (self, headers, folder_dst, delete_originals, err); 
    9921026} 
    9931027 
    9941028/* TODO: provide an _async version of this. Requested by djcb. */ 
    9951029static void 
    996 tny_camel_folder_transfer_msgs_default (TnyFolder *self, TnyList *headers, TnyFolder *folder_dst, gboolean delete_originals
     1030tny_camel_folder_transfer_msgs_default (TnyFolder *self, TnyList *headers, TnyFolder *folder_dst, gboolean delete_originals, GError **err
    9971031{ 
    9981032        TnyFolder *folder_src = self; 
     
    10441078        if (camel_exception_is_set (ex))  
    10451079        { 
    1046                 g_warning ("Transfering messages failed: %s\n", 
    1047                            camel_exception_get_description (ex)); 
     1080                g_set_error (err, TNY_CAMEL_LITE_ERROR,  
     1081                        TNY_FOLDER_TRANSFER_MSGS_ERROR, 
     1082                        camel_exception_get_description (ex)); 
    10481083        } else  
    10491084        { 
     
    11051140 
    11061141static void 
    1107 tny_camel_folder_set_name (TnyFolder *self, const gchar *name
    1108 { 
    1109         TNY_CAMEL_FOLDER_GET_CLASS (self)->set_name_func (self, name); 
    1110         return; 
    1111 } 
    1112  
    1113 static void 
    1114 tny_camel_folder_set_name_default (TnyFolder *self, const gchar *name
     1142tny_camel_folder_set_name (TnyFolder *self, const gchar *name, GError **err
     1143{ 
     1144        TNY_CAMEL_FOLDER_GET_CLASS (self)->set_name_func (self, name, err); 
     1145        return; 
     1146} 
     1147 
     1148static void 
     1149tny_camel_folder_set_name_default (TnyFolder *self, const gchar *name, GError **err
    11151150{ 
    11161151        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     
    11541189        if (camel_exception_is_set (&ex)) 
    11551190        { 
    1156                 g_warning (N_("Renaming folder %s to %s failed: %s\n"), 
    1157                                camel_folder_get_name (cfolder), name
    1158                                camel_exception_get_description (&ex)); 
     1191                g_set_error (err, TNY_CAMEL_LITE_ERROR,  
     1192                        TNY_FOLDER_SET_NAME_ERROR
     1193                        camel_exception_get_description (&ex)); 
    11591194 
    11601195                camel_exception_clear (&ex); 
     
    13551390 
    13561391static void  
    1357 tny_camel_folder_remove_folder (TnyFolderStore *self, TnyFolder *folder
    1358 { 
    1359         TNY_CAMEL_FOLDER_GET_CLASS (self)->remove_folder_func (self, folder); 
     1392tny_camel_folder_remove_folder (TnyFolderStore *self, TnyFolder *folder, GError **err
     1393{ 
     1394        TNY_CAMEL_FOLDER_GET_CLASS (self)->remove_folder_func (self, folder, err); 
    13601395} 
    13611396 
    13621397static void  
    1363 tny_camel_folder_remove_folder_default (TnyFolderStore *self, TnyFolder *folder
     1398tny_camel_folder_remove_folder_default (TnyFolderStore *self, TnyFolder *folder, GError **err
    13641399{ 
    13651400        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     
    13781413        parlen = strlen (folname); 
    13791414 
    1380         /* /INBOX/test 
    1381           /INBOX/test/test */ 
     1415        /* /INBOX/test      * 
     1416         * /INBOX/test/test */ 
    13821417 
    13831418        if (!strncmp (folname, cfolname, parlen)) 
     
    13871422                { 
    13881423                        camel_store_delete_folder (store, cfolname, &ex); 
     1424 
     1425                        if (camel_exception_is_set (&ex)) 
     1426                        { 
     1427                                g_set_error (err, TNY_CAMEL_LITE_ERROR,  
     1428                                        TNY_FOLDER_STORE_REMOVE_FOLDER_ERROR, 
     1429                                        camel_exception_get_description (&ex)); 
     1430                                camel_exception_clear (&ex); 
     1431                        } 
     1432 
    13891433                        g_free (cpriv->folder_name); cpriv->folder_name = NULL; 
    13901434                } 
    13911435        } 
    13921436         
    1393         /* TODO: error handling using 'ex' */ 
    13941437 
    13951438        return; 
     
    14161459 
    14171460static TnyFolder* 
    1418 tny_camel_folder_create_folder (TnyFolderStore *self, const gchar *name
    1419 { 
    1420         return TNY_CAMEL_FOLDER_GET_CLASS (self)->create_folder_func (self, name); 
     1461tny_camel_folder_create_folder (TnyFolderStore *self, const gchar *name, GError **err
     1462{ 
     1463        return TNY_CAMEL_FOLDER_GET_CLASS (self)->create_folder_func (self, name, err); 
    14211464} 
    14221465 
    14231466 
    14241467static TnyFolder* 
    1425 tny_camel_folder_create_folder_default (TnyFolderStore *self, const gchar *name) 
    1426 
    1427         TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
    1428         CamelStore *store = (CamelStore*) _tny_camel_account_get_service  
    1429                 (TNY_CAMEL_ACCOUNT (priv->account)); 
    1430         gchar *folname; 
    1431         TnyFolder *folder; 
    1432         CamelFolderInfo *info; 
     1468tny_camel_folder_create_folder_default (TnyFolderStore *self, const gchar *name, GError **err) 
     1469
     1470        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
    14331471        CamelException ex = CAMEL_EXCEPTION_INITIALISER; 
     1472        CamelStore *store; gchar *folname; 
     1473        TnyFolder *folder; CamelFolderInfo *info; 
    14341474 
    14351475        if (!priv->folder_name) 
     1476        { 
     1477                g_set_error (err, TNY_TINYMAIL_ERROR,  
     1478                                TNY_FOLDER_STORE_CREATE_FOLDER_ERROR, 
     1479                                _("Failed to create folder %s"), name); 
     1480 
    14361481                return NULL; 
     1482        } 
     1483 
     1484        store = (CamelStore*) _tny_camel_account_get_service (TNY_CAMEL_ACCOUNT (priv->account)); 
    14371485 
    14381486        folname = priv->folder_name; 
     1487        info = camel_store_create_folder (store, priv->folder_name, name, &ex); 
     1488 
     1489        if (camel_exception_is_set (&ex))  
     1490        { 
     1491                g_set_error (err, TNY_CAMEL_LITE_ERROR,  
     1492                                TNY_FOLDER_STORE_CREATE_FOLDER_ERROR, 
     1493                                camel_exception_get_description (&ex)); 
     1494                camel_exception_clear (&ex); 
     1495 
     1496                if (store && CAMEL_IS_OBJECT (store)) 
     1497                { 
     1498                        if (info && CAMEL_IS_STORE (store)) 
     1499                                camel_store_free_folder_info (store, info); 
     1500                        camel_object_unref (CAMEL_OBJECT (store)); 
     1501                } 
     1502 
     1503                return NULL; 
     1504        } 
     1505 
    14391506        folder = tny_camel_folder_new (); 
    1440         info = camel_store_create_folder (store, priv->folder_name, name, &ex); 
    1441  
    1442         if (camel_exception_is_set (&ex))  
    1443         { 
    1444                 g_warning (N_("Creating folder failed: %s\n"),  
    1445                         camel_exception_get_description (&ex)); 
    1446                 g_object_unref (G_OBJECT (folder)); 
    1447                 return NULL; 
    1448         } 
    14491507 
    14501508        tny_camel_folder_set_folder_info (self, TNY_CAMEL_FOLDER (folder), info); 
     
    14991557 
    15001558static void 
    1501 tny_camel_folder_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query
    1502 { 
    1503         TNY_CAMEL_FOLDER_GET_CLASS (self)->get_folders_func (self, list, query); 
     1559tny_camel_folder_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err
     1560{ 
     1561        TNY_CAMEL_FOLDER_GET_CLASS (self)->get_folders_func (self, list, query, err); 
    15041562} 
    15051563 
    15061564static void  
    1507 tny_camel_folder_get_folders_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query
     1565tny_camel_folder_get_folders_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err
    15081566{ 
    15091567        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     
    15191577                CamelException ex = CAMEL_EXCEPTION_INITIALISER;     
    15201578                priv->iter = camel_store_get_folder_info (store, priv->folder_name, 0, &ex); 
     1579 
     1580                if (camel_exception_is_set (&ex)) 
     1581                { 
     1582                        g_set_error (err, TNY_CAMEL_LITE_ERROR,  
     1583                                TNY_FOLDER_STORE_GET_FOLDERS_ERROR, 
     1584                                camel_exception_get_description (&ex)); 
     1585                        camel_exception_clear (&ex); 
     1586                        return; 
     1587                } 
     1588 
    15211589                priv->iter_parented = FALSE; 
    15221590        }  
     
    15471615typedef struct  
    15481616{ 
     1617        GError *err; 
    15491618        TnyFolderStore *self; 
    15501619        TnyList *list; 
     
    15651634        g_object_unref (G_OBJECT (info->list)); 
    15661635 
    1567         g_free (info); 
     1636        if (info->err) 
     1637                g_error_free (info->err); 
     1638 
     1639        g_slice_free (GetFoldersInfo, info); 
    15681640 
    15691641        return; 
     
    15761648 
    15771649        if (info->callback) 
    1578                 info->callback (info->self, info->list, info->user_data); 
     1650                info->callback (info->self, info->list, &info->err, info->user_data); 
    15791651 
    15801652        return FALSE; 
     
    15851657{ 
    15861658        GetFoldersInfo *info = (GetFoldersInfo*) thr_user_data; 
     1659        GError *err; 
    15871660 
    15881661        tny_folder_store_get_folders (TNY_FOLDER_STORE (info->self), 
    1589                 info->list, info->query); 
     1662                info->list, info->query, &err); 
     1663 
     1664        if (err != NULL) 
     1665                info->err = g_error_copy ((const GError *) &err); 
     1666        else 
     1667                info->err = NULL; 
    15901668 
    15911669        if (info->query) 
     
    16271705tny_camel_folder_get_folders_async_default (TnyFolderStore *self, TnyList *list, TnyGetFoldersCallback callback, TnyFolderStoreQuery *query, gpointer user_data) 
    16281706{ 
    1629         GetFoldersInfo *info = g_new0 (GetFoldersInfo, 1); 
     1707        GetFoldersInfo *info = g_slice_new (GetFoldersInfo); 
    16301708        GThread *thread; 
    16311709 
  • trunk/libtinymail-camel/tny-camel-folder.h

    r1240 r1262  
    5151 
    5252        /* virtual methods */ 
    53         void (*add_msg_func) (TnyFolder *self, TnyMsg *msg); 
    54         void (*remove_msg_func) (TnyFolder *self, TnyHeader *header); 
    55         void (*expunge_func) (TnyFolder *self); 
     53        void (*add_msg_func) (TnyFolder *self, TnyMsg *msg, GError **err); 
     54        void (*remove_msg_func) (TnyFolder *self, TnyHeader *header, GError **err); 
     55        void (*expunge_func) (TnyFolder *self, GError **err); 
    5656        TnyMsgRemoveStrategy* (*get_msg_remove_strategy_func) (TnyFolder *self); 
    5757        void (*set_msg_remove_strategy_func) (TnyFolder *self, TnyMsgRemoveStrategy *st); 
    58         TnyMsg* (*get_msg_func) (TnyFolder *self, TnyHeader *header); 
    59         void (*get_headers_func) (TnyFolder *self, TnyList *headers, gboolean refresh); 
     58        TnyMsg* (*get_msg_func) (TnyFolder *self, TnyHeader *header, GError **err); 
     59        void (*get_headers_func) (TnyFolder *self, TnyList *headers, gboolean refresh, GError **err); 
    6060        const gchar* (*get_name_func) (TnyFolder *self); 
    6161        const gchar* (*get_id_func) (TnyFolder *self); 
    6262        TnyStoreAccount* (*get_account_func) (TnyFolder *self); 
    63         void (*set_name_func) (TnyFolder *self, const gchar *name); 
     63        void (*set_name_func) (TnyFolder *self, const gchar *name, GError **err); 
    6464        TnyFolderType (*get_folder_type_func) (TnyFolder *self); 
    6565        guint (*get_all_count_func) (TnyFolder *self); 
     
    6767        gboolean (*is_subscribed_func) (TnyFolder *self); 
    6868        void (*refresh_async_func) (TnyFolder *self, TnyRefreshFolderCallback callback, TnyRefreshFolderStatusCallback status_callback, gpointer user_data); 
    69         void (*refresh_func) (TnyFolder *self); 
    70         void (*transfer_msgs_func) (TnyFolder *self, TnyList *headers, TnyFolder *folder_dst, gboolean delete_originals); 
     69        void (*refresh_func) (TnyFolder *self, GError **err); 
     70        void (*transfer_msgs_func) (TnyFolder *self, TnyList *headers, TnyFolder *folder_dst, gboolean delete_originals, GError **err); 
    7171 
    7272        void (*get_folders_async_func) (TnyFolderStore *self, TnyList *list, TnyGetFoldersCallback callback, TnyFolderStoreQuery *query, gpointer user_data); 
    73         void (*get_folders_func) (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query); 
    74         void (*remove_folder_func) (TnyFolderStore *self, TnyFolder *folder); 
    75         TnyFolder* (*create_folder_func) (TnyFolderStore *self, const gchar *name); 
     73        void (*get_folders_func) (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err); 
     74        void (*remove_folder_func) (TnyFolderStore *self, TnyFolder *folder, GError **err); 
     75        TnyFolder* (*create_folder_func) (TnyFolderStore *self, const gchar *name, GError **err); 
    7676}; 
    7777 
  • trunk/libtinymail-camel/tny-camel-msg-remove-strategy.c

    r1198 r1262  
    3838 
    3939static void 
    40 tny_camel_msg_remove_strategy_perform_remove (TnyMsgRemoveStrategy *self, TnyFolder *folder, TnyHeader *header) 
     40tny_camel_msg_remove_strategy_perform_remove (TnyMsgRemoveStrategy *self, TnyFolder *folder, TnyHeader *header, GError **err) 
     41
     42        TNY_CAMEL_MSG_REMOVE_STRATEGY_GET_CLASS (self)->perform_remove_func (self, folder, header, err); 
     43        return; 
     44
     45 
     46static void 
     47tny_camel_msg_remove_strategy_perform_remove_default (TnyMsgRemoveStrategy *self, TnyFolder *folder, TnyHeader *header, GError **err) 
    4148{ 
    4249        const gchar *id; 
     
    5057        camel_folder_delete_message (cfolder, id); 
    5158        camel_object_unref (CAMEL_OBJECT (cfolder)); 
     59 
     60        /* Nothing can go wrong in this implementation, but others might go wrong. 
     61           We just leave err untouched. */ 
    5262 
    5363        return; 
     
    101111        object_class = (GObjectClass*) class; 
    102112 
     113        class->perform_remove_func = tny_camel_msg_remove_strategy_perform_remove_default; 
     114 
    103115        object_class->finalize = tny_camel_msg_remove_strategy_finalize; 
    104116 
  • trunk/libtinymail-camel/tny-camel-msg-remove-strategy.h

    r1092 r1262  
    4545{ 
    4646        GObjectClass parent_class; 
     47 
     48        /* virtual methods */ 
     49        void (*perform_remove_func) (TnyMsgRemoveStrategy *self, TnyFolder *folder, TnyHeader *header, GError **err); 
    4750}; 
    4851 
  • trunk/libtinymail-camel/tny-camel-send-queue.c

    r1233 r1262  
    5151                sentbox = tny_send_queue_get_sentbox (self); 
    5252                outbox = tny_send_queue_get_outbox (self); 
    53                 tny_folder_get_headers (outbox, list, TRUE); 
     53                /* TODO handle and report errors here */ 
     54                tny_folder_get_headers (outbox, list, TRUE, NULL); 
    5455                length = tny_list_get_length (list); 
    5556                priv->total = length; 
     
    6869                        TnyIterator *hdriter; 
    6970                        TnyList *headers = tny_simple_list_new (); 
    70                         tny_folder_get_headers (outbox, headers, TRUE); 
     71                        /* TODO handle and report errors here */ 
     72                        tny_folder_get_headers (outbox, headers, TRUE, NULL); 
    7173                        length = tny_list_get_length (headers); 
    7274                        priv->total = length; 
     
    8991 
    9092                        tny_list_prepend (hassent, G_OBJECT (header)); 
    91                         msg = tny_folder_get_msg (sentbox, header); 
     93                        /* TODO handle and report errors here */ 
     94                        msg = tny_folder_get_msg (sentbox, header, NULL); 
    9295                        g_object_unref (G_OBJECT (header));      
    9396 
     
    9699                        g_mutex_lock (priv->todo_lock); 
    97100                        { 
    98                                 tny_folder_transfer_msgs (outbox, hassent, sentbox, TRUE); 
     101                                /* TODO handle and report errors here */ 
     102                                tny_folder_transfer_msgs (outbox, hassent, sentbox, TRUE, NULL); 
    99103                                priv->total--; 
    100104                        } 
     
    144148 
    145149                outbox = tny_send_queue_get_outbox (self); 
    146                 tny_folder_get_headers (outbox, headers, TRUE); 
     150 
     151                /* TODO handle and report errors here */ 
     152                tny_folder_get_headers (outbox, headers, TRUE, NULL); 
    147153                priv->total = tny_list_get_length (headers); 
    148154                g_object_unref (G_OBJECT (headers)); 
    149155 
    150                 tny_folder_add_msg (outbox, msg); 
     156                /* TODO error checking and reporting here */ 
     157                tny_folder_add_msg (outbox, msg, NULL); 
    151158                priv->total++; 
    152159 
  • trunk/libtinymail-camel/tny-camel-store-account.c

    <
    r1241 r1262  
    3535#include <tny-folder-store.h> 
    3636#include <tny-camel-folder.h> 
     37#include <tny-error.h> 
    3738 
    3839#include <camel/camel.h> 
     
    304305 
    305306static void  
    306 tny_camel_store_account_remove_folder (TnyFolderStore *self, TnyFolder *folder
    307 { 
    308         TNY_CAMEL_STORE_ACCOUNT_GET_CLASS (self)->remove_folder_func (self, folder); 
     307tny_camel_store_account_remove_folder (TnyFolderStore *self, TnyFolder *folder, GError **err
     308{ 
     309        TNY_CAMEL_STORE_ACCOUNT_GET_CLASS (self)->remove_folder_func (self, folder, err); 
    309310} 
    310311 
    311312static void  
    312 tny_camel_store_account_remove_folder_default (TnyFolderStore *self, TnyFolder *folder
     313tny_camel_store_account_remove_folder_default (TnyFolderStore *self, TnyFolder *folder, GError **err
    313314{ 
    314315        TnyCamelAccountPriv *apriv = TNY_CAMEL_ACCOUNT_GET_PRIVATE (self); 
     
    323324                        apriv->url_string, &ex); 
    324325 
    325         if (store) 
    326         { 
    327                 if (cpriv->folder_name) 
    328                 { 
    329                         /* Unsubscribe : camel should do it by itself 
    330                            but it does not do it */ 
    331                         if (camel_store_supports_subscriptions (store) && 
    332                             camel_store_folder_subscribed (store, cpriv->folder_name)) 
    333                                 camel_store_unsubscribe_folder (store, cpriv->folder_name, NULL); 
    334  
    335                         camel_store_delete_folder (store, cpriv->folder_name, &ex); 
    336                         if (camel_exception_is_set (&ex)) 
    337                                 g_critical ("Could not delete folder %s (%s)\n", 
    338                                 cpriv->folder_name, camel_exception_get_description (&ex)); 
    339                         g_free (cpriv->folder_name); cpriv->folder_name = NULL; 
    340                 } 
    341  
    342                 camel_object_unref (CAMEL_OBJECT (store)); 
    343         } else  
    344                 g_critical ("Store not available for %s (%s)\n",  
    345                         apriv->url_string, camel_exception_get_description (&ex)); 
    346  
    347         /* TODO: error handling using 'ex' */ 
     326        if (camel_exception_is_set (&ex))  
     327        { 
     328                g_set_error (err, TNY_CAMEL_LITE_ERROR,  
     329                                TNY_FOLDER_STORE_REMOVE_FOLDER_ERROR, 
     330                                camel_exception_get_description (&ex)); 
     331                camel_exception_clear (&ex); 
     332 
     333                if (store && CAMEL_IS_OBJECT (store)) 
     334                                camel_object_unref (CAMEL_OBJECT (store)); 
     335 
     336                return; 
     337        } 
     338 
     339        g_assert (CAMEL_IS_STORE (store)); 
     340        g_assert (cpriv->folder_name != NULL); 
     341 
     342        /* Unsubscribe : camel should do it by itself but it does not do it */ 
     343        if (camel_store_supports_subscriptions (store) &&  
     344            camel_store_folder_subscribed (store, cpriv->folder_name)) 
     345                camel_store_unsubscribe_folder (store, cpriv->folder_name, NULL); 
     346 
     347        camel_store_delete_folder (store, cpriv->folder_name, &ex); 
     348 
     349        if (camel_exception_is_set (&ex))  
     350        { 
     351                g_set_error (err, TNY_CAMEL_LITE_ERROR,  
     352                                TNY_FOLDER_STORE_REMOVE_FOLDER_ERROR, 
     353                                camel_exception_get_description (&ex)); 
     354                camel_exception_clear (&ex); 
     355        } 
     356 
     357        g_free (cpriv->folder_name); cpriv->folder_name = NULL; 
     358 
     359        camel_object_unref (CAMEL_OBJECT (store)); 
     360 
    348361 
    349362        return; 
     
    351364 
    352365static TnyFolder* 
    353 tny_camel_store_account_create_folder (TnyFolderStore *self, const gchar *name
    354 { 
    355         return TNY_CAMEL_STORE_ACCOUNT_GET_CLASS (self)->create_folder_func (self, name); 
     366tny_camel_store_account_create_folder (TnyFolderStore *self, const gchar *name, GError **err
     367{ 
     368        return TNY_CAMEL_STORE_ACCOUNT_GET_CLASS (self)->create_folder_func (self, name, err); 
    356369} 
    357370 
    358371 
    359372static TnyFolder* 
    360 tny_camel_store_account_create_folder_default (TnyFolderStore *self, const gchar *name
     373tny_camel_store_account_create_folder_default (TnyFolderStore *self, const gchar *name, GError **err
    361374{ 
    362375        TnyCamelAccountPriv *apriv = TNY_CAMEL_ACCOUNT_GET_PRIVATE (self); 
    363376        CamelException ex = CAMEL_EXCEPTION_INITIALISER;     
    364         TnyFolder *folder = tny_camel_folder_new (); 
    365         CamelFolderInfo *info; 
    366         CamelStore *store; 
     377        TnyFolder *folder; CamelFolderInfo *info; CamelStore *store; 
    367378 
    368379        store = camel_session_get_store ((CamelSession*) apriv->session,  
    369380                        apriv->url_string, &ex); 
    370381 
    371         if (store) 
    372         { 
    373                 info = camel_store_create_folder (store, "/", name, &ex); 
    374                 if (info) 
    375                 { 
    376                         _tny_camel_folder_set_id (TNY_CAMEL_FOLDER (folder), info->full_name); 
    377                         camel_store_free_folder_info (store, info); 
    378                 } else 
    379                         g_critical ("Failed to create folder %s (%s)\n", name, 
     382        if (camel_exception_is_set (&ex))  
     383        { 
     384                g_set_error (err, TNY_CAMEL_LITE_ERROR,  
     385                                TNY_FOLDER_STORE_CREATE_FOLDER_ERROR, 
    380386                                camel_exception_get_description (&ex)); 
    381  
    382                 camel_object_unref (CAMEL_OBJECT (store)); 
    383         } else  
    384                 g_critical ("Store not available for %s (%s)\n",  
    385