Changeset 2576
- Timestamp:
- 08/07/07 13:00:37
- Files:
-
- trunk/ChangeLog (modified) (1 diff)
- trunk/libtinymail-camel/tny-camel-account.c (modified) (2 diffs)
- trunk/libtinymail-camel/tny-camel-folder.c (modified) (47 diffs)
- trunk/libtinymail-camel/tny-camel-store-account.c (modified) (1 diff)
- trunk/libtinymail/tny-merge-folder.c (modified) (2 diffs)
- trunk/tests/c-demo/tny-demoui-summary-view.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/ChangeLog
r2574 r2576 4 4 * Cleaning up in case of cancels 5 5 * Making sync_async cancellable 6 * Error reporting fixes 6 7 7 8 * This was a major API change trunk/libtinymail-camel/tny-camel-account.c
r2567 r2576 1754 1754 TnyCamelAccountPriv *priv = TNY_CAMEL_ACCOUNT_GET_PRIVATE (self); 1755 1755 CamelException ex = CAMEL_EXCEPTION_INITIALISER; 1756 GError *err = NULL;1757 1756 TnyStatus* status; 1758 1757 GList *authtypes = NULL; … … 1789 1788 if (camel_exception_is_set (&ex)) 1790 1789 { 1791 g_set_error (& err, TNY_FOLDER_ERROR,1790 g_set_error (&info->err, TNY_FOLDER_ERROR, 1792 1791 TNY_FOLDER_ERROR_REFRESH, 1793 1792 camel_exception_get_description (&ex)); 1794 if (err != NULL)1795 info->err = g_error_copy ((const GError *) err);1796 1793 } 1797 1794 trunk/libtinymail-camel/tny-camel-folder.c
r2575 r2576 22 22 #include <glib/gi18n-lib.h> 23 23 24 #ifndef _GNU_SOURCE 25 #define _GNU_SOURCE 26 #endif 27 24 28 #include <string.h> 29 30 char *strcasestr(const char *haystack, const char *needle); 31 25 32 26 33 #include <tny-status.h> … … 1080 1087 /* thread reference */ 1081 1088 _tny_camel_folder_unreason (priv); 1082 g_object_unref ( G_OBJECT (self));1089 g_object_unref (self); 1083 1090 1084 1091 if (info->err) … … 1151 1158 TnyCamelAccountPriv *apriv = TNY_CAMEL_ACCOUNT_GET_PRIVATE (priv->account); 1152 1159 CamelException ex = CAMEL_EXCEPTION_INITIALISER; 1153 GError *err = NULL;1154 1160 1155 1161 g_static_rec_mutex_lock (priv->folder_lock); 1156 1157 if (!load_folder_no_lock (priv))1158 {1159 tny_camel_folder_sync_async_destroyer (info);1160 g_slice_free (SyncFolderInfo, thr_user_data);1161 g_static_rec_mutex_unlock (priv->folder_lock);1162 return NULL;1163 }1164 1162 1165 1163 info->cancelled = FALSE; … … 1182 1180 1183 1181 info->err = NULL; 1184 1185 1182 if (camel_exception_is_set (&ex)) 1186 1183 { 1187 g_set_error (& err, TNY_FOLDER_ERROR,1184 g_set_error (&info->err, TNY_FOLDER_ERROR, 1188 1185 TNY_FOLDER_ERROR_REFRESH, 1189 1186 camel_exception_get_description (&ex)); 1190 if (err != NULL) 1191 info->err = g_error_copy ((const GError *) err); 1192 } 1193 1187 } 1194 1188 1195 1189 g_static_rec_mutex_unlock (priv->folder_lock); … … 1200 1194 1201 1195 execute_callback (info->depth, G_PRIORITY_DEFAULT, 1202 tny_camel_folder_sync_async_callback, info,1203 tny_camel_folder_sync_async_destroyer);1196 tny_camel_folder_sync_async_callback, info, 1197 tny_camel_folder_sync_async_destroyer); 1204 1198 1205 1199 … … 1222 1216 { 1223 1217 SyncFolderInfo *info = thr_user_data; 1218 TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (info->self); 1219 1220 /* thread reference */ 1221 _tny_camel_folder_unreason (priv); 1222 g_object_unref (info->self); 1223 1224 1224 if (info->err) 1225 1225 g_error_free (info->err); 1226 g_object_unref (info->self);1227 1226 g_slice_free (SyncFolderInfo, thr_user_data); 1228 1227 return; … … 1251 1250 info = g_slice_new (SyncFolderInfo); 1252 1251 info->session = TNY_FOLDER_PRIV_GET_SESSION (priv); 1253 info->err = NULL;1254 1252 info->self = self; 1255 1253 info->callback = callback; … … 1259 1257 info->expunge = expunge; 1260 1258 info->condition = NULL; 1259 info->err = NULL; 1261 1260 1262 1261 if (!_tny_session_check_operation (TNY_FOLDER_PRIV_GET_SESSION(priv), priv->account, &err, 1263 TNY_FOLDER_ERROR, TNY_FOLDER_ERROR_SYNC))1262 TNY_FOLDER_ERROR, TNY_FOLDER_ERROR_SYNC)) 1264 1263 { 1265 1264 if (callback) { 1266 1265 info->err = g_error_copy (err); 1267 1266 g_object_ref (info->self); 1267 _tny_camel_folder_reason (priv); 1268 1268 execute_callback (info->depth, G_PRIORITY_DEFAULT, 1269 tny_camel_folder_sync_async_cancelled_callback, info,1270 tny_camel_folder_sync_async_cancelled_destroyer);1269 tny_camel_folder_sync_async_cancelled_callback, info, 1270 tny_camel_folder_sync_async_cancelled_destroyer); 1271 1271 } 1272 1272 g_error_free (err); … … 1326 1326 /* thread reference */ 1327 1327 _tny_camel_folder_unreason (priv); 1328 g_object_unref ( G_OBJECT (self));1328 g_object_unref (self); 1329 1329 1330 1330 if (info->err) … … 1365 1365 } 1366 1366 1367 /* Prevent status callbacks from being called after this1368 * (can happen because the 2 idle callbacks have different priorities)1369 * by causing tny_idle_stopper_is_stopped() to return TRUE. */1370 1371 1367 tny_idle_stopper_stop (info->stopper); 1372 1368 … … 1402 1398 TnyCamelAccountPriv *apriv = TNY_CAMEL_ACCOUNT_GET_PRIVATE (priv->account); 1403 1399 CamelException ex = CAMEL_EXCEPTION_INITIALISER; 1404 GError *err = NULL;1405 1400 1406 1401 g_static_rec_mutex_lock (priv->folder_lock); 1407 1408 if (!load_folder_no_lock (priv))1409 {1410 tny_camel_folder_refresh_async_destroyer (info);1411 g_slice_free (RefreshFolderInfo, info);1412 g_static_rec_mutex_unlock (priv->folder_lock);1413 return NULL;1414 }1415 1402 1416 1403 info->cancelled = FALSE; … … 1433 1420 1434 1421 info->err = NULL; 1435 1436 1422 if (camel_exception_is_set (&ex)) 1437 1423 { 1438 g_set_error (& err, TNY_FOLDER_ERROR,1424 g_set_error (&info->err, TNY_FOLDER_ERROR, 1439 1425 TNY_FOLDER_ERROR_REFRESH, 1440 1426 camel_exception_get_description (&ex)); 1441 if (err != NULL)1442 info->err = g_error_copy ((const GError *) err);1443 1427 } 1444 1428 … … 1477 1461 { 1478 1462 RefreshFolderInfo *info = thr_user_data; 1463 TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (info->self); 1464 1465 /* thread reference */ 1466 _tny_camel_folder_unreason (priv); 1467 g_object_unref (info->self); 1479 1468 if (info->err) 1480 1469 g_error_free (info->err); 1481 g_object_unref (info->self);1482 1470 g_slice_free (RefreshFolderInfo, thr_user_data); 1483 1471 return; … … 1488 1476 { 1489 1477 RefreshFolderInfo *info = thr_user_data; 1490 1491 1478 if (info->callback) { 1492 1479 tny_lockable_lock (info->session->priv->ui_lock); … … 1522 1509 info = g_slice_new (RefreshFolderInfo); 1523 1510 info->session = TNY_FOLDER_PRIV_GET_SESSION (priv); 1524 info->err = NULL;1525 1511 info->self = self; 1526 1512 info->callback = callback; … … 1529 1515 info->depth = g_main_depth (); 1530 1516 info->condition = NULL; 1517 info->err = NULL; 1531 1518 1532 1519 if (!_tny_session_check_operation (TNY_FOLDER_PRIV_GET_SESSION(priv), priv->account, &err, … … 1536 1523 info->err = g_error_copy (err); 1537 1524 g_object_ref (info->self); 1525 _tny_camel_folder_reason (priv); 1538 1526 execute_callback (info->depth, G_PRIORITY_DEFAULT, 1539 1527 tny_camel_folder_refresh_async_cancelled_callback, info, … … 1544 1532 } 1545 1533 1546 1547 /* Use a ref count because we do not know which of the 2 idle callbacks1548 * will be the last, and we can only unref self in the last callback:1549 * This is destroyed in the idle GDestroyNotify callback.*/1550 1534 info->stopper = tny_idle_stopper_new(); 1551 1535 … … 1553 1537 g_object_ref (G_OBJECT (self)); 1554 1538 _tny_camel_folder_reason (priv); 1555 1556 /* This will cause the idle status callback to be called,1557 * via _tny_camel_account_start_camel_operation,1558 * and also calls the idle main callback: */1559 1539 1560 1540 _tny_camel_queue_launch_wflags (TNY_FOLDER_PRIV_GET_QUEUE (priv), … … 1724 1704 TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (info->self); 1725 1705 1726 GError *err = NULL; 1727 1728 tny_folder_get_headers (info->self, info->headers, info->refresh, &err); 1729 1706 tny_folder_get_headers (info->self, info->headers, info->refresh, &info->err); 1730 1707 info->cancelled = FALSE; 1731 1708 1732 if ( err != NULL)1733 i nfo->err = g_error_copy ((const GError *) err);1734 else1735 info->err = NULL;1709 if (info->err != NULL) { 1710 if (strcasestr (info->err->message, "cancel") != NULL) 1711 info->cancelled = TRUE; 1712 } 1736 1713 1737 1714 info->mutex = g_mutex_new (); … … 1829 1806 1830 1807 _tny_camel_queue_cancel_remove_items (TNY_FOLDER_PRIV_GET_QUEUE (priv), 1831 TNY_CAMEL_QUEUE_GET_HEADERS_ITEM );1808 TNY_CAMEL_QUEUE_GET_HEADERS_ITEM|TNY_CAMEL_QUEUE_SYNC_ITEM); 1832 1809 1833 1810 _tny_camel_queue_launch_wflags (TNY_FOLDER_PRIV_GET_QUEUE (priv), … … 1943 1920 g_object_unref (info->self); 1944 1921 1945 if (info->err)1922 if (info->err) 1946 1923 g_error_free (info->err); 1947 1924 … … 1986 1963 g_object_unref (info->msg); 1987 1964 1988 /* Prevent status callbacks from being called after this1989 * (can happen because the 2 idle callbacks have different priorities)1990 * by causing tny_idle_stopper_is_stopped() to return TRUE. */1991 1992 1965 tny_idle_stopper_stop (info->stopper); 1993 1966 … … 2018 1991 GetMsgInfo *info = (GetMsgInfo *) thr_user_data; 2019 1992 TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (info->self); 2020 GError *err = NULL;2021 1993 CamelOperation *cancel; 2022 1994 … … 2039 2011 2040 2012 info->msg = tny_msg_receive_strategy_perform_get_msg (priv->receive_strat, 2041 info->self, info->header, & err);2013 info->self, info->header, &info->err); 2042 2014 2043 2015 info->cancelled = camel_operation_cancel_check (cancel); … … 2052 2024 /* g_static_rec_mutex_unlock (priv->folder_lock); */ 2053 2025 2054 info->err = NULL; 2055 if (err != NULL) 2056 { 2057 info->err = g_error_copy ((const GError *) err); 2026 info->cancelled = FALSE; 2027 if (info->err != NULL) 2028 { 2029 if (strcasestr (info->err->message, "cancel") != NULL) 2030 info->cancelled = TRUE; 2058 2031 if (info->msg && G_IS_OBJECT (info->msg)) 2059 2032 g_object_unref (info->msg); 2060 2033 info->msg = NULL; 2061 } else 2062 info->err = NULL; 2034 } 2063 2035 2064 2036 /* thread reference header */ … … 2070 2042 2071 2043 execute_callback (info->depth, G_PRIORITY_DEFAULT, 2072 tny_camel_folder_get_msg_async_callback, info,2073 tny_camel_folder_get_msg_async_destroyer);2044 tny_camel_folder_get_msg_async_callback, info, 2045 tny_camel_folder_get_msg_async_destroyer); 2074 2046 2075 2047 /* Wait on the queue for the mainloop callback to be finished */ … … 2092 2064 { 2093 2065 GetMsgInfo *info = (GetMsgInfo *) thr_user_data; 2066 TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (info->self); 2067 2068 /* thread reference */ 2069 _tny_camel_folder_unreason (priv); 2070 g_object_unref (info->self); 2071 2094 2072 if (info->err) 2095 2073 g_error_free (info->err); 2096 g_object_unref (info->self); 2074 2097 2075 g_slice_free (GetMsgInfo, info); 2098 2076 return; … … 2102 2080 tny_camel_folder_get_msg_async_cancelled_callback (gpointer thr_user_data) 2103 2081 { 2104 2105 2082 GetMsgInfo *info = (GetMsgInfo *) thr_user_data; 2106 2083 if (info->callback) { … … 2145 2122 info->err = g_error_copy (err); 2146 2123 g_object_ref (info->self); 2147 2124 _tny_camel_folder_reason (priv); 2148 2125 execute_callback (info->depth, G_PRIORITY_DEFAULT, 2149 2126 tny_camel_folder_get_msg_async_cancelled_callback, info, … … 2960 2937 CopyFolderInfo *info = (CopyFolderInfo *) thr_user_data; 2961 2938 2962 if (info->err == NULL)2963 notify_folder_observers_about_copy (info->adds, info->rems,2964 info->delete_originals, FALSE);2965 2966 2939 if (info->new_folder) 2967 2940 g_object_unref (info->new_folder); … … 2978 2951 tny_idle_stopper_destroy (info->stopper); 2979 2952 info->stopper = NULL; 2980 g_free (info->new_name); 2981 2953 2954 if (info->new_name) 2955 g_free (info->new_name); 2982 2956 2983 2957 if (info->condition) { … … 2988 2962 } 2989 2963 2990 2991 2964 return; 2992 2965 } … … 2996 2969 { 2997 2970 CopyFolderInfo *info = (CopyFolderInfo *) thr_user_data; 2971 2972 if (info->err == NULL) 2973 notify_folder_observers_about_copy (info->adds, info->rems, 2974 info->delete_originals, FALSE); 2998 2975 2999 2976 if (info->callback) { … … 3083 3060 3084 3061 execute_callback (info->depth, G_PRIORITY_DEFAULT, 3085 tny_camel_folder_copy_async_callback, info,3086 tny_camel_folder_copy_async_destroyer);3062 tny_camel_folder_copy_async_callback, info, 3063 tny_camel_folder_copy_async_destroyer); 3087 3064 3088 3065 /* Wait on the queue for the mainloop callback to be finished */ … … 3273 3250 g_object_unref (info->self); 3274 3251 g_object_unref (info->header_list); 3275 g_object_unref (info->new_header_list); 3252 if (info->new_header_list) 3253 g_object_unref (info->new_header_list); 3276 3254 _tny_camel_folder_unreason (priv_dst); 3277 3255 g_object_unref (info->folder_dst); … … 3284 3262 tny_idle_stopper_destroy (info->stopper); 3285 3263 info->stopper = NULL; 3286 3287 3264 3288 3265 if (info->condition) { … … 3648 3625 TnyCamelFolderPriv *priv_src = NULL, *priv_dst = NULL; 3649 3626 TnyCamelAccountPriv *apriv = NULL; 3650 GError *err = NULL;3651 3627 3652 3628 priv_src = TNY_CAMEL_FOLDER_GET_PRIVATE (info->self); … … 3671 3647 3672 3648 transfer_msgs_thread_clean (info->self, info->header_list, info->new_header_list, info->folder_dst, 3673 info->delete_originals, & err);3649 info->delete_originals, &info->err); 3674 3650 3675 3651 /* Check cancelation and stop operation */ … … 3683 3659 info->to_unread = camel_folder_get_unread_message_count (priv_dst->folder); 3684 3660 3685 /* Check errors */3686 if (err != NULL)3687 info->err = g_error_copy ((const GError *) err);3688 else3689 info->err = NULL;3690 3691 3692 3661 info->mutex = g_mutex_new (); 3693 3662 info->condition = g_cond_new (); … … 3716 3685 { 3717 3686 TransferMsgsInfo *info = thr_user_data; 3687 TnyCamelFolderPriv *priv_src = TNY_CAMEL_FOLDER_GET_PRIVATE (info->self); 3688 TnyCamelFolderPriv *priv_dst = TNY_CAMEL_FOLDER_GET_PRIVATE (info->folder_dst); 3689 3690 /* thread reference */ 3691 _tny_camel_folder_unreason (priv_src); 3692 g_object_unref (info->self); 3693 g_object_unref (info->header_list); 3694 if (info->new_header_list) 3695 g_object_unref (info->new_header_list); 3696 _tny_camel_folder_unreason (priv_dst); 3697 g_object_unref (info->folder_dst); 3698 3718 3699 if (info->err) 3719 3700 g_error_free (info->err); 3720 if (info->new_header_list)3721 g_object_unref (info->new_header_list);3722 g_object_unref (info->self);3723 3701 g_slice_free (TransferMsgsInfo, info); 3724 3702 return; … … 3775 3753 if (callback) { 3776 3754 info->err = g_error_copy (err); 3755 3756 g_object_ref (info->header_list); 3757 _tny_camel_folder_reason (priv_src); 3777 3758 g_object_ref (info->self); 3759 _tny_camel_folder_reason (priv_dst); 3760 g_object_ref (info->folder_dst); 3778 3761 3779 3762 execute_callback (info->depth, G_PRIORITY_DEFAULT, … … 3791 3774 3792 3775 /* thread reference */ 3793 g_object_ref ( G_OBJECT (info->header_list));3776 g_object_ref (info->header_list); 3794 3777 _tny_camel_folder_reason (priv_src); 3795 g_object_ref ( G_OBJECT (info->self));3778 g_object_ref (info->self); 3796 3779 _tny_camel_folder_reason (priv_dst); 3797 g_object_ref ( G_OBJECT (info->folder_dst));3780 g_object_ref (info->folder_dst); 3798 3781 3799 3782 _tny_camel_queue_launch (TNY_FOLDER_PRIV_GET_QUEUE (priv), … … 4465 4448 } 4466 4449 4467 char *strcasestr(const char *haystack, const char *needle);4468 4450 4469 4451 static gpointer … … 4473 4455 TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (info->self); 4474 4456 4475 GError *err = NULL;4476 4477 4457 tny_folder_store_get_folders (TNY_FOLDER_STORE (info->self), 4478 info->list, info->query, & err);4479 4480 i f (err != NULL) {4481 info->err = g_error_copy ((const GError *) err);4482 if (strcasestr ( err->message, "cancel") != NULL)4458 info->list, info->query, &info->err); 4459 4460 info->cancelled = FALSE; 4461 if (info->err != NULL) { 4462 if (strcasestr (info->err->message, "cancel") != NULL) 4483 4463 info->cancelled = TRUE; 4484 } else {4485 info->err = NULL;4486 info->cancelled = FALSE;4487 4464 } 4488 4465 … … 4516 4493 { 4517 4494 GetFoldersInfo *info = thr_user_data; 4495 TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (info->self); 4496 4497 /* thread reference */ 4498 _tny_camel_folder_unreason (priv); 4499 g_object_unref (info->self); 4500 g_object_unref (info->list); 4501 4518 4502 if (info->err) 4519 4503 g_error_free (info->err); 4520 4521 4504 if (info->query) 4522 4505 g_object_unref (info->query); 4523 g_object_unref (info->self);4524 g_object_unref (info->list);4525 4506 g_slice_free (GetFoldersInfo, info); 4526 4507 return; … … 4569 4550 if (callback) { 4570 4551 info->err = g_error_copy (err); 4552 _tny_camel_folder_reason (priv); 4571 4553 g_object_ref (info->self); 4572 4554 g_object_ref (info->list); trunk/libtinymail-camel/tny-camel-store-account.c
r2574 r2576 1249 1249 1250 1250 tny_folder_store_get_folders (TNY_FOLDER_STORE (info->self), 1251 info->list, info->query, & err);1252 1253 i f (err != NULL) {1254 info->err = g_error_copy ((const GError *) err);1251 info->list, info->query, &info->err); 1252 1253 info->cancelled = FALSE; 1254 if (info->err != NULL) { 1255 1255 if (strcasestr (err->message, "cancel") != NULL) 1256 1256 info->cancelled = TRUE; 1257 } else { 1258 info->err = NULL; 1259 info->cancelled = FALSE; 1260 } 1261 1257 } 1262 1258 1263 1259 if (info->query) trunk/libtinymail/tny-merge-folder.c
r2574 r2576 391 391 GError *err = NULL; 392 392 393 info->msg = tny_folder_get_msg (info->self, info->header, &err); 394 395 if (err != NULL) 396 { 397 info->err = g_error_copy ((const GError *) err); 393 info->msg = tny_folder_get_msg (info->self, info->header, &info->err); 394 395 if (info->err != NULL) 396 { 398 397 if (info->msg && G_IS_OBJECT (info->msg)) 399 398 g_object_unref (G_OBJECT (info->msg)); 400 399 info->msg = NULL; 401 } else 402 info->err = NULL; 400 } 403 401 404 402 g_object_unref (G_OBJECT (info->header)); … … 437 435 info->user_data = user_data; 438 436 info->depth = g_main_depth (); 437 info->err = NULL; 439 438 440 439 /* thread reference */ trunk/tests/c-demo/tny-demoui-summary-view.c
r2556 r2576 695 695 696 696 static void 697 on_get_msg (TnyFolder *folder, gboolean cancelled, TnyMsg *msg, GError * *err, gpointer user_data)697 on_get_msg (TnyFolder *folder, gboolean cancelled, TnyMsg *msg, GError *merr, gpointer user_data) 698 698 { 699 699 OnGetMsgInfo *info = user_data; … … 701 701 TnyHeader *header = info->header; 702 702 TnyDemouiSummaryViewPriv *priv = TNY_DEMOUI_SUMMARY_VIEW_GET_PRIVATE (self); 703 GError *merr = *err;704 703 705 704 g_idle_add (cleanup_statusbar, priv); … … 788 787 789 788 static void 790 refresh_current_folder (TnyFolder *folder, gboolean cancelled, GError * *err, gpointer user_data)789 refresh_current_folder (TnyFolder *folder, gboolean cancelled, GError *err, gpointer user_data) 791 790 { 792 791 TnySummaryView *self = user_data; 793 792 TnyDemouiSummaryViewPriv *priv = TNY_DEMOUI_SUMMARY_VIEW_GET_PRIVATE (self); 794 795 793 GtkTreeModel *select_model; 796 794
