Changeset 3787
- Timestamp:
- 10/26/08 11:44:59
- Files:
-
- trunk/ChangeLog (modified) (1 diff)
- trunk/libtinymail-camel/tny-camel-folder.c (modified) (12 diffs)
- trunk/libtinymail-camel/tny-camel-folder.h (modified) (1 diff)
- trunk/libtinymail-camel/tny-camel-store-account.c (modified) (10 diffs)
- trunk/libtinymail-camel/tny-camel-store-account.h (modified) (1 diff)
- trunk/libtinymail/tny-combined-account.c (modified) (2 diffs)
- trunk/libtinymail/tny-folder-store.c (modified) (9 diffs)
- trunk/libtinymail/tny-folder-store.h (modified) (2 diffs)
- trunk/libtinymail/tny-shared.h (modified) (1 diff)
- trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.c (modified) (3 diffs)
- trunk/tests/c-demo/tny-demoui-summary-view.c (modified) (2 diffs)
- trunk/tests/functional/account-refresh.c (modified) (2 diffs)
- trunk/tests/functional/folder-lister-async.c (modified) (2 diffs)
- trunk/tests/functional/folder-lister.c (modified) (1 diff)
- trunk/tests/functional/folder-remove.c (modified) (1 diff)
- trunk/tests/functional/folder-transfer.c (modified) (1 diff)
- trunk/tests/functional/msg-transfer.c (modified) (1 diff)
- trunk/tests/memory/memory-test.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/ChangeLog
r3779 r3787 1 2008-10-24 Rob Taylor <rob.taylor@codethink.co.uk> 2 & Martin Bonnin <martinbonnin@gmail.com> 3 4 * Re-submission for the add-a-refresh-parameter-to-tny_folder_store_get_folder(): 5 makes the patch atomic by adapting to the new api where needed 6 also honour the camel folders flags (caused some critical camel warnings else) 7 1 8 2008-10-16 Philip Van Hoof <philip@codeminded.be> 2 9 trunk/libtinymail-camel/tny-camel-folder.c
r3779 r3787 3177 3177 TnyIterator *iter; 3178 3178 3179 tny_folder_store_get_folders (TNY_FOLDER_STORE (folder), folders, NULL, &nerr);3179 tny_folder_store_get_folders (TNY_FOLDER_STORE (folder), folders, NULL, TRUE, &nerr); 3180 3180 3181 3181 if (nerr != NULL) … … 3349 3349 3350 3350 list = func (list, cpy_event_new (TNY_FOLDER_STORE (into), folder)); 3351 tny_folder_store_get_folders (TNY_FOLDER_STORE (folder), folders, NULL, NULL);3351 tny_folder_store_get_folders (TNY_FOLDER_STORE (folder), folders, NULL, TRUE, NULL); 3352 3352 iter = tny_list_create_iterator (folders); 3353 3353 while (!tny_iterator_is_done (iter)) … … 4885 4885 TnyIterator *iter; 4886 4886 4887 tny_folder_store_get_folders (TNY_FOLDER_STORE (folder), 4888 folders, NULL, &nerr);4887 tny_folder_store_get_folders (TNY_FOLDER_STORE (folder), 4888 folders, NULL, TRUE, &nerr); 4889 4889 4890 4890 if (nerr != NULL) … … 5329 5329 5330 5330 static void 5331 tny_camel_folder_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err)5332 { 5333 TNY_CAMEL_FOLDER_GET_CLASS (self)->get_folders(self, list, query, err);5331 tny_camel_folder_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, GError **err) 5332 { 5333 TNY_CAMEL_FOLDER_GET_CLASS (self)->get_folders(self, list, query, refresh, err); 5334 5334 } 5335 5335 5336 5336 static void 5337 tny_camel_folder_get_folders_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err)5337 tny_camel_folder_get_folders_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, GError **err) 5338 5338 { 5339 5339 gboolean cant_reuse_iter = TRUE; … … 5366 5366 g_return_if_fail (priv->folder_name != NULL); 5367 5367 5368 priv->iter = camel_store_get_folder_info (store, priv->folder_name, 0, &ex); 5368 if (!refresh && CAMEL_IS_DISCO_STORE(store)) { 5369 priv->iter = CAMEL_DISCO_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(store))->get_folder_info_offline(store, priv->folder_name, 0, &ex); 5370 } else { 5371 priv->iter = camel_store_get_folder_info (store, priv->folder_name, 0, &ex); 5372 } 5369 5373 5370 5374 priv->cant_reuse_iter = FALSE; … … 5430 5434 } 5431 5435 5432 5433 5436 typedef struct 5434 5437 { … … 5440 5443 TnyGetFoldersCallback callback; 5441 5444 TnyFolderStoreQuery *query; 5445 gboolean refresh; 5442 5446 gpointer user_data; 5443 5447 TnySessionCamel *session; … … 5490 5494 5491 5495 tny_folder_store_get_folders (TNY_FOLDER_STORE (info->self), 5492 info->list, info->query, &info->err);5496 info->list, info->query, info->refresh, &info->err); 5493 5497 5494 5498 info->cancelled = FALSE; … … 5537 5541 5538 5542 static void 5539 tny_camel_folder_get_folders_async (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data)5540 { 5541 TNY_CAMEL_FOLDER_GET_CLASS (self)->get_folders_async(self, list, query, callback, status_callback, user_data);5543 tny_camel_folder_get_folders_async (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data) 5544 { 5545 TNY_CAMEL_FOLDER_GET_CLASS (self)->get_folders_async(self, list, query, refresh, callback, status_callback, user_data); 5542 5546 } 5543 5547 5544 5548 5545 5549 static void 5546 tny_camel_folder_get_folders_async_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data)5550 tny_camel_folder_get_folders_async_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data) 5547 5551 { 5548 5552 GetFoldersInfo *info; … … 5558 5562 info->user_data = user_data; 5559 5563 info->query = query; 5564 info->refresh = refresh; 5560 5565 info->err = NULL; 5561 5566 … … 5580 5585 } 5581 5586 5587 static void 5588 tny_camel_folder_store_refresh (TnyFolderStore *self, GError **err) 5589 { 5590 TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 5591 CamelFolderInfo *iter; 5592 TnyAccount *account = NULL; 5593 CamelStore *store = priv->store; 5594 CamelException ex = CAMEL_EXCEPTION_INITIALISER; 5595 5596 if (!_tny_session_check_operation (TNY_FOLDER_PRIV_GET_SESSION(priv), 5597 priv->account, err, TNY_ERROR_DOMAIN, 5598 TNY_SERVICE_ERROR_GET_FOLDERS)) 5599 return; 5600 5601 account = tny_folder_get_account (TNY_FOLDER (self)); 5602 5603 g_return_if_fail (priv->folder_name != NULL); 5604 5605 priv->iter = camel_store_get_folder_info (store, priv->folder_name, 0, &ex); 5606 priv->cant_reuse_iter = FALSE; 5607 5608 if (camel_exception_is_set (&ex)) 5609 { 5610 _tny_camel_exception_to_tny_error (&ex, err); 5611 camel_exception_clear (&ex); 5612 _tny_session_stop_operation (TNY_FOLDER_PRIV_GET_SESSION (priv)); 5613 5614 if (priv->iter == NULL) 5615 return; 5616 } 5617 5618 priv->iter_parented = FALSE; 5619 5620 iter = priv->iter; 5621 5622 if (iter) 5623 { 5624 iter = iter->child; 5625 while (iter) 5626 { 5627 /* Also take a look at camel-maildir-store.c:525 */ 5628 if (!(iter->flags & CAMEL_FOLDER_VIRTUAL) && priv->account) 5629 { 5630 gboolean was_new = FALSE; 5631 TnyCamelFolder *folder = (TnyCamelFolder *) tny_camel_store_account_factor_folder ( 5632 TNY_CAMEL_STORE_ACCOUNT (priv->account), 5633 iter->full_name, &was_new); 5634 if (was_new) { 5635 TnyFolderStoreChange *change; 5636 _tny_camel_folder_set_folder_info (self, folder, iter); 5637 change = tny_folder_store_change_new (TNY_FOLDER_STORE(self)); 5638 tny_folder_store_change_add_created_folder (change, TNY_FOLDER(folder)); 5639 notify_folder_store_observers_about_in_idle (self, 5640 change, 5641 TNY_FOLDER_PRIV_GET_SESSION (priv)); 5642 g_object_unref(change); 5643 } 5644 g_object_unref (folder); 5645 } 5646 iter = iter->next; 5647 } 5648 } 5649 5650 5651 _tny_session_stop_operation (TNY_FOLDER_PRIV_GET_SESSION (priv)); 5652 5653 return; 5654 } 5655 5656 typedef struct 5657 { 5658 TnyCamelQueueable parent; 5659 5660 GError *err; 5661 TnyFolderStore *self; 5662 TnyFolderStoreCallback callback; 5663 gpointer user_data; 5664 TnySessionCamel *session; 5665 gboolean cancelled; 5666 } StoreRefreshInfo; 5667 5668 5669 static void 5670 tny_camel_folder_store_refresh_async_destroyer (gpointer thr_user_data) 5671 { 5672 StoreRefreshInfo *info = thr_user_data; 5673 TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (info->self); 5674 5675 /* thread reference */ 5676 _tny_camel_folder_unreason (priv); 5677 g_object_unref (info->self); 5678 5679 if (info->err) 5680 g_error_free (info->err); 5681 5682 _tny_session_stop_operation (info->session); 5683 5684 camel_object_unref (info->session); 5685 5686 return; 5687 } 5688 5689 static gboolean 5690 tny_camel_folder_store_refresh_async_callback (gpointer thr_user_data) 5691 { 5692 StoreRefreshInfo *info = thr_user_data; 5693 if (info->callback) { 5694 tny_lockable_lock (info->session->priv->ui_lock); 5695 info->callback (info->self, info->cancelled, info->err, info->user_data); 5696 tny_lockable_unlock (info->session->priv->ui_lock); 5697 } 5698 return FALSE; 5699 } 5700 5701 5702 static gpointer 5703 tny_camel_folder_store_refresh_async_thread (gpointer thr_user_data) 5704 { 5705 StoreRefreshInfo *info = (StoreRefreshInfo*) thr_user_data; 5706 5707 tny_camel_folder_store_refresh (TNY_FOLDER_STORE (info->self), &info->err); 5708 5709 info->cancelled = FALSE; 5710 if (info->err != NULL) { 5711 if (camel_strstrcase (info->err->message, "cancel") != NULL) 5712 info->cancelled = TRUE; 5713 } 5714 5715 return NULL; 5716 } 5717 5718 static void 5719 tny_camel_folder_store_refresh_async_cancelled_destroyer (gpointer thr_user_data) 5720 { 5721 StoreRefreshInfo *info = thr_user_data; 5722 TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (info->self); 5723 5724 /* thread reference */ 5725 _tny_camel_folder_unreason (priv); 5726 g_object_unref (info->self); 5727 5728 if (info->err) 5729 g_error_free (info->err); 5730 5731 /**/ 5732 5733 camel_object_unref (info->session); 5734 5735 return; 5736 } 5737 5738 static gboolean 5739 tny_camel_folder_store_refresh_async_cancelled_callback (gpointer thr_user_data) 5740 { 5741 StoreRefreshInfo *info = thr_user_data; 5742 if (info->callback) { 5743 tny_lockable_lock (info->session->priv->ui_lock); 5744 info->callback (info->self, TRUE, info->err, info->user_data); 5745 tny_lockable_unlock (info->session->priv->ui_lock); 5746 } 5747 return FALSE; 5748 } 5749 5750 static void 5751 tny_camel_folder_store_refresh_async (TnyFolderStore *self, TnyFolderStoreCallback callback, TnyStatusCallback status_callback, gpointer user_data) 5752 { 5753 StoreRefreshInfo *info; 5754 TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 5755 5756 /* Idle info for the callbacks */ 5757 info = g_slice_new (StoreRefreshInfo); 5758 info->session = TNY_FOLDER_PRIV_GET_SESSION (priv); 5759 camel_object_ref (info->session); 5760 info->self = self; 5761 info->callback = callback; 5762 info->user_data = user_data; 5763 info->err = NULL; 5764 5765 /* thread reference */ 5766 _tny_camel_folder_reason (priv); 5767 g_object_ref (info->self); 5768 5769 _tny_camel_queue_launch (TNY_FOLDER_PRIV_GET_QUEUE (priv), 5770 tny_camel_folder_store_refresh_async_thread, 5771 tny_camel_folder_store_refresh_async_callback, 5772 tny_camel_folder_store_refresh_async_destroyer, 5773 tny_camel_folder_store_refresh_async_cancelled_callback, 5774 tny_camel_folder_store_refresh_async_cancelled_destroyer, 5775 &info->cancelled, 5776 info, sizeof (StoreRefreshInfo), 5777 __FUNCTION__); 5778 5779 return; 5780 } 5582 5781 5583 5782 void … … 6231 6430 klass->add_observer= tny_camel_folder_store_add_observer; 6232 6431 klass->remove_observer= tny_camel_folder_store_remove_observer; 6432 klass->refresh_async = tny_camel_folder_store_refresh_async; 6233 6433 6234 6434 return; trunk/libtinymail-camel/tny-camel-folder.h
r3779 r3787 93 93 void (*remove_msgs_async) (TnyFolder *self, TnyList *headers, TnyFolderCallback callback, TnyStatusCallback status_callback, gpointer user_data); 94 94 95 void (*get_folders_async) (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data);96 void (*get_folders) (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err);95 void (*get_folders_async) (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data); 96 void (*get_folders) (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, GError **err); 97 97 void (*remove_folder) (TnyFolderStore *self, TnyFolder *folder, GError **err); 98 98 TnyFolder* (*create_folder) (TnyFolderStore *self, const gchar *name, GError **err); trunk/libtinymail-camel/tny-camel-store-account.c
r3779 r3787 953 953 954 954 tny_folder_store_get_folders (TNY_FOLDER_STORE (folder), 955 folders, NULL, &nerr);955 folders, NULL, TRUE, &nerr); 956 956 957 957 if (nerr != NULL) … … 1277 1277 1278 1278 static void 1279 tny_camel_store_account_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err)1280 { 1281 TNY_CAMEL_STORE_ACCOUNT_GET_CLASS (self)->get_folders(self, list, query, err);1279 tny_camel_store_account_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, GError **err) 1280 { 1281 TNY_CAMEL_STORE_ACCOUNT_GET_CLASS (self)->get_folders(self, list, query, refresh, err); 1282 1282 } 1283 1283 … … 1352 1352 1353 1353 static void 1354 tny_camel_store_account_get_folders_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err)1354 tny_camel_store_account_get_folders_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, GError **err) 1355 1355 { 1356 1356 TnyCamelAccountPriv *apriv = TNY_CAMEL_ACCOUNT_GET_PRIVATE (self); … … 1402 1402 iter = priv->iter; 1403 1403 1404 if (!iter || priv->cant_reuse_iter) 1405 iter = camel_store_get_folder_info (store, "", flags, &ex); 1404 if (!iter || priv->cant_reuse_iter) { 1405 if (!refresh && CAMEL_IS_DISCO_STORE(store)) { 1406 iter = CAMEL_DISCO_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(store))->get_folder_info_offline(store, "", flags, &ex); 1407 } else { 1408 iter = camel_store_get_folder_info (store, "", flags, &ex); 1409 } 1410 1411 } 1406 1412 1407 1413 /*else … … 1473 1479 TnyGetFoldersCallback callback; 1474 1480 TnyFolderStoreQuery *query; 1481 gboolean refresh; 1475 1482 gpointer user_data; 1476 1483 TnySessionCamel *session; … … 1519 1526 1520 1527 tny_folder_store_get_folders (TNY_FOLDER_STORE (info->self), 1521 info->list, info->query, &info->err);1528 info->list, info->query, info->refresh, &info->err); 1522 1529 1523 1530 info->cancelled = FALSE; … … 1560 1567 1561 1568 static void 1562 tny_camel_store_account_get_folders_async (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data)1563 { 1564 TNY_CAMEL_STORE_ACCOUNT_GET_CLASS (self)->get_folders_async(self, list, query, callback, status_callback, user_data);1569 tny_camel_store_account_get_folders_async (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data) 1570 { 1571 TNY_CAMEL_STORE_ACCOUNT_GET_CLASS (self)->get_folders_async(self, list, query, refresh, callback, status_callback, user_data); 1565 1572 } 1566 1573 1567 1574 static void 1568 tny_camel_store_account_get_folders_async_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data)1575 tny_camel_store_account_get_folders_async_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data) 1569 1576 { 1570 1577 GetFoldersInfo *info; … … 1585 1592 info->user_data = user_data; 1586 1593 info->query = query; 1594 info->refresh = refresh; 1587 1595 1588 1596 /* thread reference */ … … 1600 1608 &info->cancelled, info, sizeof (GetFoldersInfo), 1601 1609 TNY_CAMEL_QUEUE_NORMAL_ITEM|TNY_CAMEL_QUEUE_PRIORITY_ITEM, 1610 __FUNCTION__); 1611 1612 return; 1613 } 1614 1615 static void 1616 tny_camel_store_account_store_refresh (TnyFolderStore *self, GError **err) 1617 { 1618 TnyCamelAccountPriv *apriv = TNY_CAMEL_ACCOUNT_GET_PRIVATE (self); 1619 TnyCamelStoreAccountPriv *priv = TNY_CAMEL_STORE_ACCOUNT_GET_PRIVATE (self); 1620 CamelException ex = CAMEL_EXCEPTION_INITIALISER; 1621 CamelFolderInfo *iter=NULL; guint32 flags; CamelStore *store; 1622 1623 g_assert (CAMEL_IS_SESSION (apriv->session)); 1624 1625 if (!_tny_session_check_operation (apriv->session, TNY_ACCOUNT (self), err, 1626 TNY_ERROR_DOMAIN, TNY_SERVICE_ERROR_GET_FOLDERS)) 1627 return; 1628 1629 if (apriv->service == NULL || !CAMEL_IS_SERVICE (apriv->service)) 1630 { 1631 g_set_error (err, TNY_ERROR_DOMAIN, 1632 TNY_SERVICE_ERROR_GET_FOLDERS, 1633 _("Account not ready for this operation. " 1634 "This problem indicates a bug in the software.")); 1635 _tny_session_stop_operation (apriv->session); 1636 return; 1637 } 1638 1639 store = CAMEL_STORE (apriv->service); 1640 1641 if (camel_exception_is_set (&ex)) 1642 { 1643 _tny_camel_exception_to_tny_error (&ex, err); 1644 camel_exception_clear (&ex); 1645 _tny_session_stop_operation (apriv->session); 1646 return; 1647 } 1648 1649 g_assert (CAMEL_IS_STORE (store)); 1650 1651 flags = CAMEL_STORE_FOLDER_INFO_FAST | CAMEL_STORE_FOLDER_INFO_NO_VIRTUAL | 1652 CAMEL_STORE_FOLDER_INFO_RECURSIVE; 1653 1654 if (!camel_session_is_online ((CamelSession*) apriv->session)) 1655 flags |= CAMEL_STORE_FOLDER_INFO_SUBSCRIBED; 1656 1657 1658 priv->iter = camel_store_get_folder_info (store, "", flags, &ex); 1659 1660 if (camel_exception_is_set (&ex)) 1661 { 1662 _tny_camel_exception_to_tny_error (&ex, err); 1663 camel_exception_clear (&ex); 1664 1665 _tny_session_stop_operation (apriv->session); 1666 1667 return; 1668 } 1669 1670 priv->cant_reuse_iter = FALSE; 1671 1672 camel_object_ref (CAMEL_OBJECT (store)); 1673 priv->iter_store = store; 1674 1675 iter = priv->iter; 1676 1677 if (iter) 1678 { 1679 iter = iter->child; 1680 while (iter) 1681 { 1682 /* Also take a look at camel-maildir-store.c:525 */ 1683 if (!(iter->flags & CAMEL_FOLDER_VIRTUAL)) 1684 { 1685 gboolean was_new = FALSE; 1686 TnyCamelFolder *folder = (TnyCamelFolder *) tny_camel_store_account_factor_folder ( 1687 TNY_CAMEL_STORE_ACCOUNT (self), 1688 iter->full_name, &was_new); 1689 if (was_new) { 1690 TnyFolderStoreChange *change; 1691 _tny_camel_folder_set_folder_info (self, folder, iter); 1692 change = tny_folder_store_change_new (TNY_FOLDER_STORE(self)); 1693 tny_folder_store_change_add_created_folder (change, TNY_FOLDER(folder)); 1694 notify_folder_store_observers_about_in_idle (self, 1695 change); 1696 g_object_unref(change); 1697 } 1698 g_object_unref (folder); 1699 } 1700 iter = iter->next; 1701 } 1702 } 1703 1704 1705 _tny_session_stop_operation (apriv->session); 1706 1707 return; 1708 } 1709 1710 1711 typedef struct 1712 { 1713 TnyCamelQueueable parent; 1714 1715 GError *err; 1716 TnyFolderStore *self; 1717 TnyFolderStoreCallback callback; 1718 gpointer user_data; 1719 TnySessionCamel *session; 1720 gboolean cancelled; 1721 1722 } StoreRefreshInfo; 1723 1724 1725 static void 1726 tny_camel_store_account_store_refresh_async_destroyer (gpointer thr_user_data) 1727 { 1728 StoreRefreshInfo *info = thr_user_data; 1729 1730 /* gidle reference */ 1731 g_object_unref (info->self); 1732 1733 if (info->err) 1734 g_error_free (info->err); 1735 1736 camel_object_unref (info->session); 1737 1738 return; 1739 } 1740 1741 static gboolean 1742 tny_camel_store_account_store_refresh_async_callback (gpointer thr_user_data) 1743 { 1744 StoreRefreshInfo *info = thr_user_data; 1745 if (info->callback) { 1746 tny_lockable_lock (info->session->priv->ui_lock); 1747 info->callback (info->self, info->cancelled, info->err, info->user_data); 1748 tny_lockable_unlock (info->session->priv->ui_lock); 1749 } 1750 return FALSE; 1751 } 1752 1753 1754 static gpointer 1755 tny_camel_store_account_store_refresh_async_thread (gpointer thr_user_data) 1756 { 1757 StoreRefreshInfo *info = (StoreRefreshInfo*) thr_user_data; 1758 1759 tny_camel_store_account_store_refresh (TNY_FOLDER_STORE (info->self), &info->err); 1760 1761 info->cancelled = FALSE; 1762 if (info->err != NULL) { 1763 if (camel_strstrcase (info->err->message, "cancel") != NULL) 1764 info->cancelled = TRUE; 1765 } 1766 1767 return NULL; 1768 } 1769 1770 static void 1771 tny_camel_store_account_store_refresh_async_cancelled_destroyer (gpointer thr_user_data) 1772 { 1773 StoreRefreshInfo *info = thr_user_data; 1774 /* gidle references */ 1775 g_object_unref (info->self); 1776 if (info->err) 1777 g_error_free (info->err); 1778 1779 camel_object_unref (info->session); 1780 1781 return; 1782 } 1783 1784 static gboolean 1785 tny_camel_store_account_store_refresh_async_cancelled_callback (gpointer thr_user_data) 1786 { 1787 StoreRefreshInfo *info = thr_user_data; 1788 if (info->callback) { 1789 tny_lockable_lock (info->session->priv->ui_lock); 1790 info->callback (info->self, TRUE, info->err, info->user_data); 1791 tny_lockable_unlock (info->session->priv->ui_lock); 1792 } 1793 return FALSE; 1794 } 1795 1796 static void 1797 tny_camel_store_account_store_refresh_async (TnyFolderStore *self, TnyFolderStoreCallback callback, TnyStatusCallback status_callback, gpointer user_data) 1798 { 1799 StoreRefreshInfo *info; 1800 TnyCamelAccountPriv *apriv = TNY_CAMEL_ACCOUNT_GET_PRIVATE (self); 1801 TnyCamelStoreAccountPriv *priv = TNY_CAMEL_STORE_ACCOUNT_GET_PRIVATE (self); 1802 1803 /* Idle info for the callbacks */ 1804 info = g_slice_new0 (StoreRefreshInfo); 1805 info->session = apriv->session; 1806 camel_object_ref (info->session); 1807 1808 info->err = NULL; 1809 info->self = self; 1810 info->callback = callback; 1811 info->user_data = user_data; 1812 1813 /* thread reference */ 1814 g_object_ref (info->self); 1815 1816 _tny_camel_queue_launch_wflags (priv->queue, 1817 tny_camel_store_account_store_refresh_async_thread, 1818 tny_camel_store_account_store_refresh_async_callback, 1819 tny_camel_store_account_store_refresh_async_destroyer, 1820 tny_camel_store_account_store_refresh_async_cancelled_callback, 1821 tny_camel_store_account_store_refresh_async_cancelled_destroyer, 1822 &info->cancelled, info, sizeof (StoreRefreshInfo), 1823 TNY_CAMEL_QUEUE_NORMAL_ITEM|TNY_CAMEL_QUEUE_PRIORITY_ITEM, 1602 1824 __FUNCTION__); 1603 1825 … … 2073 2295 klass->add_observer= tny_camel_store_account_add_observer; 2074 2296 klass->remove_observer= tny_camel_store_account_remove_observer; 2297 klass->refresh_async = tny_camel_store_account_store_refresh_async; 2075 2298 2076 2299 return; trunk/libtinymail-camel/tny-camel-store-account.h
r3779 r3787 50 50 51 51 /* virtual methods */ 52 void (*get_folders_async) (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data);53 void (*get_folders) (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err);52 void (*get_folders_async) (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data); 53 void (*get_folders) (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, GError **err); 54 54 void (*remove_folder) (TnyFolderStore *self, TnyFolder *folder, GError **err); 55 55 TnyFolder* (*create_folder) (TnyFolderStore *self, const gchar *name, GError **err); trunk/libtinymail/tny-combined-account.c
r3779 r3787 300 300 301 301 static void 302 tny_combined_account_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err) 303 { 304 TnyCombinedAccountPriv *priv = TNY_COMBINED_ACCOUNT_GET_PRIVATE (self); 305 306 tny_folder_store_get_folders (TNY_FOLDER_STORE (priv->store_account), list, query, err); 307 } 308 309 static void 310 tny_combined_account_get_folders_async (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data) 311 { 312 TnyCombinedAccountPriv *priv = TNY_COMBINED_ACCOUNT_GET_PRIVATE (self); 313 314 tny_folder_store_get_folders_async (TNY_FOLDER_STORE (priv->store_account), list, query, callback, status_callback, user_data); 302 tny_combined_account_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, GError **err) 303 { 304 TnyCombinedAccountPriv *priv = TNY_COMBINED_ACCOUNT_GET_PRIVATE (self); 305 306 tny_folder_store_get_folders (TNY_FOLDER_STORE (priv->store_account), list, query, refresh, err); 307 } 308 309 static void 310 tny_combined_account_get_folders_async (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data) 311 { 312 TnyCombinedAccountPriv *priv = TNY_COMBINED_ACCOUNT_GET_PRIVATE (self); 313 314 tny_folder_store_get_folders_async (TNY_FOLDER_STORE (priv->store_account), list, query, refresh, callback, status_callback, user_data); 315 } 316 317 static void 318 tny_combined_account_refresh_async (TnyFolderStore *self, TnyFolderStoreCallback callback, TnyStatusCallback status_callback, gpointer user_data) 319 { 320 TnyCombinedAccountPriv *priv = TNY_COMBINED_ACCOUNT_GET_PRIVATE (self); 321 322 tny_folder_store_refresh_async (TNY_FOLDER_STORE (priv->store_account), callback, status_callback, user_data); 315 323 } 316 324 … … 541 549 klass->add_observer= tny_combined_account_add_observer; 542 550 klass->remove_observer= tny_combined_account_remove_observer; 551 klass->refresh_async = tny_combined_account_refresh_async; 543 552 } 544 553 trunk/libtinymail/tny-folder-store.c
r3779 r3787 267 267 * @list: a #TnyList to to which the folders will be prepended 268 268 * @query: (null-ok): a #TnyFolderStoreQuery or NULL 269 * @refresh: synchronize with the service first 269 270 * @err: (null-ok): a #GError or NULL 270 271 * … … 278 279 * TnyIterator *iter; TnyFolderStoreQuery *query = ... 279 280 * TnyList *folders = tny_simple_list_new (); 280 * tny_folder_store_get_folders (store, folders, query, NULL);281 * tny_folder_store_get_folders (store, folders, query, TRUE, NULL); 281 282 * iter = tny_list_create_iterator (folders); 282 283 * while (!tny_iterator_is_done (iter)) … … 296 297 **/ 297 298 void 298 tny_folder_store_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err)299 tny_folder_store_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, GError **err) 299 300 { 300 301 #ifdef DBC /* require */ … … 307 308 #endif 308 309 309 TNY_FOLDER_STORE_GET_IFACE (self)->get_folders(self, list, query, err);310 TNY_FOLDER_STORE_GET_IFACE (self)->get_folders(self, list, query, refresh, err); 310 311 311 312 #ifdef DBC /* ensure */ … … 344 345 * @list: a #TnyList to to which the folders will be prepended 345 346 * @query: (null-ok): A #TnyFolderStoreQuery object 347 * @refresh: synchronize with the service first 346 348 * @callback: (null-ok): a #TnyGetFoldersCallback or NULL 347 349 * @status_callback: (null-ok): a #TnyStatusCallback or NULL … … 364 366 * g_print ("%s\n", tny_folder_get_name (TNY_FOLDER (folder))); 365 367 * tny_folder_store_get_folders_async (folder, 366 * folders, NULL, callback, NULL, NULL);368 * folders, NULL, true, callback, NULL, NULL); 367 369 * g_object_unref (folder); 368 370 * tny_iterator_next (iter); … … 376 378 * folders = tny_simple_list_new (); 377 379 * tny_folder_store_get_folders_async (TNY_FOLDER_STORE (account), 378 * folders, NULL, callback, NULL, NULL);380 * folders, NULL, TRUE, callback, NULL, NULL); 379 381 * g_object_unref (folders); 380 382 * } … … 389 391 **/ 390 392 void 391 tny_folder_store_get_folders_async (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data)393 tny_folder_store_get_folders_async (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data) 392 394 { 393 395 #ifdef DBC /* require */ … … 400 402 #endif 401 403 402 TNY_FOLDER_STORE_GET_IFACE (self)->get_folders_async(self, list, query, callback, status_callback, user_data); 403 404 #ifdef DBC /* ensure */ 405 #endif 406 407 return; 408 } 409 410 404 TNY_FOLDER_STORE_GET_IFACE (self)->get_folders_async(self, list, query, refresh, callback, status_callback, user_data); 405 406 #ifdef DBC /* ensure */ 407 #endif 408 409 return; 410 } 411 412 413 void tny_folder_store_refresh_async (TnyFolderStore *self, TnyFolderStoreCallback callback, TnyStatusCallback status_callback, gpointer user_data) 414 { 415 #ifdef DBC /* require */ 416 g_assert (TNY_IS_FOLDER_STORE (self)); 417 g_assert (TNY_FOLDER_STORE_GET_IFACE (self)->refresh_async != NULL); 418 #endif 419 420 TNY_FOLDER_STORE_GET_IFACE (self)->refresh_async(self, callback, status_callback, user_data); 421 422 #ifdef DBC /* ensure */ 423 #endif 424 425 return; 426 } 411 427 412 428 static void trunk/libtinymail/tny-folder-store.h
r3779 r3787 49 49 TnyFolder* (*create_folder) (TnyFolderStore *self, const gchar *name, GError **err); 50 50 void (*create_folder_async) (TnyFolderStore *self, const gchar *name, TnyCreateFolderCallback callback, TnyStatusCallback status_callback, gpointer user_data); 51 void (*get_folders) (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err);52 void (*get_folders_async) (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data);51 void (*get_folders) (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, GError **err); 52 void (*get_folders_async) (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data); 53 53 void (*add_observer) (TnyFolderStore *self, TnyFolderStoreObserver *observer); 54 54 void (*remove_observer) (TnyFolderStore *self, TnyFolderStoreObserver *observer); 55 void (*refresh_async) (TnyFolderStore *self, TnyFolderStoreCallback callback, TnyStatusCallback status_callback, gpointer user_data); 55 56 56 57 }; … … 60 61 void tny_folder_store_remove_folder (TnyFolderStore *self, TnyFolder *folder, GError **err); 61 62 void tny_folder_store_create_folder_async (TnyFolderStore *self, const gchar *name, TnyCreateFolderCallback callback, TnyStatusCallback status_callback, gpointer user_data); 62 void tny_folder_store_get_folders_async (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data);63 void tny_folder_store_get_folders_async (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data); 63 64 void tny_folder_store_add_observer (TnyFolderStore *self, TnyFolderStoreObserver *observer); 64 65 void tny_folder_store_remove_observer (TnyFolderStore *self, TnyFolderStoreObserver *observer); 66 void tny_folder_store_refresh_async (TnyFolderStore *self, TnyFolderStoreCallback callback, TnyStatusCallback status_callback, gpointer user_data); 65 67 66 68 #ifndef TNY_DISABLE_DEPRECATED 67 void tny_folder_store_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err);69 void tny_folder_store_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, GError **err); 68 70 TnyFolder *tny_folder_store_create_folder (TnyFolderStore *self, const gchar *name, GError **err); 69 71 #endif trunk/libtinymail/tny-shared.h
r3779 r3787 138 138 typedef TnyStream* (*TnyStreamCacheOpenStreamFetcher) (TnyStreamCache *self, gint64 *expected_size, gpointer userdata); 139 139 typedef gboolean (*TnyStreamCacheRemoveFilter) (TnyStreamCache *self, const gchar *id, gpointer userdata); 140 typedef void (*TnyFolderStoreCallback) (TnyFolderStore *self, gboolean cancelled, GError *err, gpointer user_data); 140 141 141 142 /** trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.c
r3779 r3787 116 116 117 117 /* TODO add error checking and reporting here */ 118 tny_folder_store_get_folders (store, folders, self->query, NULL);118 tny_folder_store_get_folders (store, folders, self->query, TRUE, NULL); 119 119 iter = tny_list_create_iterator (folders); 120 120 … … 344 344 list = tny_simple_list_new (); 345 345 tny_folder_store_get_folders_async (TNY_FOLDER_STORE (account), 346 list, self->query, get_folders_cb, NULL, g_object_ref (self));346 list, self->query, TRUE, get_folders_cb, NULL, g_object_ref (self)); 347 347 348 348 return; … … 523 523 524 524 tny_folder_store_get_folders_async (TNY_FOLDER_STORE (folder_store), 525 folders, self->query, get_folders_cb, NULL, g_object_ref (self));525 folders, self->query, TRUE, get_folders_cb, NULL, g_object_ref (self)); 526 526 527 527 /* recurse_folders_sync (self, TNY_FOLDER_STORE (folder_store), &name_iter); */ trunk/tests/c-demo/tny-demoui-summary-view.c
r3779 r3787 400 400 TnyIterator *f_iter; 401 401 402 tny_folder_store_get_folders (TNY_FOLDER_STORE (f_store), folders, NULL, NULL);402 tny_folder_store_get_folders (TNY_FOLDER_STORE (f_store), folders, NULL, TRUE, NULL); 403 403 f_iter = tny_list_create_iterator (folders); 404 404 while (!tny_iterator_is_done (f_iter)) … … 1179 1179 g_free (folder_name); 1180 1180 list = tny_simple_list_new (); 1181 tny_folder_store_get_folders (origin_store, list, query, NULL);1181 tny_folder_store_get_folders (origin_store, list, query, TRUE, NULL); 1182 1182 &n
