Changeset 3787

Show
Ignore:
Timestamp:
10/26/08 11:44:59
Author:
pvanhoof
Message:

2008-10-24 Rob Taylor <rob.taylor@codethink.co.uk>

& Martin Bonnin <martinbonnin@gmail.com>

  • Re-submission for the add-a-refresh-parameter-to-tny_folder_store_get_folder():

makes the patch atomic by adapting to the new api where needed
also honour the camel folders flags (caused some critical camel warnings else)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r3779 r3787  
     12008-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 
    182008-10-16  Philip Van Hoof  <philip@codeminded.be> 
    29 
  • trunk/libtinymail-camel/tny-camel-folder.c

    r3779 r3787  
    31773177                TnyIterator *iter; 
    31783178 
    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); 
    31803180 
    31813181                if (nerr != NULL) 
     
    33493349 
    33503350        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); 
    33523352        iter = tny_list_create_iterator (folders); 
    33533353        while (!tny_iterator_is_done (iter)) 
     
    48854885                TnyIterator *iter; 
    48864886 
    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); 
    48894889 
    48904890                if (nerr != NULL) 
     
    53295329 
    53305330static 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); 
     5331tny_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); 
    53345334} 
    53355335 
    53365336static void  
    5337 tny_camel_folder_get_folders_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err) 
     5337tny_camel_folder_get_folders_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, GError **err) 
    53385338{ 
    53395339        gboolean cant_reuse_iter = TRUE; 
     
    53665366                g_return_if_fail (priv->folder_name != NULL); 
    53675367 
    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                } 
    53695373 
    53705374                priv->cant_reuse_iter = FALSE; 
     
    54305434} 
    54315435 
    5432  
    54335436typedef struct  
    54345437{ 
     
    54405443        TnyGetFoldersCallback callback; 
    54415444        TnyFolderStoreQuery *query; 
     5445        gboolean refresh; 
    54425446        gpointer user_data; 
    54435447        TnySessionCamel *session; 
     
    54905494 
    54915495        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); 
    54935497 
    54945498        info->cancelled = FALSE; 
     
    55375541 
    55385542static 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); 
     5543tny_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); 
    55425546} 
    55435547 
    55445548 
    55455549static void  
    5546 tny_camel_folder_get_folders_async_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data) 
     5550tny_camel_folder_get_folders_async_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data) 
    55475551{ 
    55485552        GetFoldersInfo *info; 
     
    55585562        info->user_data = user_data; 
    55595563        info->query = query; 
     5564        info->refresh = refresh; 
    55605565        info->err = NULL; 
    55615566 
     
    55805585} 
    55815586 
     5587static void 
     5588tny_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 
     5656typedef 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 
     5669static void 
     5670tny_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 
     5689static gboolean 
     5690tny_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 
     5702static gpointer  
     5703tny_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 
     5718static void 
     5719tny_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 
     5738static gboolean 
     5739tny_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 
     5750static void 
     5751tny_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} 
    55825781 
    55835782void 
     
    62316430        klass->add_observer= tny_camel_folder_store_add_observer; 
    62326431        klass->remove_observer= tny_camel_folder_store_remove_observer; 
     6432        klass->refresh_async = tny_camel_folder_store_refresh_async; 
    62336433 
    62346434        return; 
  • trunk/libtinymail-camel/tny-camel-folder.h

    r3779 r3787  
    9393        void (*remove_msgs_async) (TnyFolder *self, TnyList *headers, TnyFolderCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
    9494 
    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); 
    9797        void (*remove_folder) (TnyFolderStore *self, TnyFolder *folder, GError **err); 
    9898        TnyFolder* (*create_folder) (TnyFolderStore *self, const gchar *name, GError **err); 
  • trunk/libtinymail-camel/tny-camel-store-account.c

    r3779 r3787  
    953953 
    954954                tny_folder_store_get_folders (TNY_FOLDER_STORE (folder),  
    955                                 folders, NULL, &nerr); 
     955                                folders, NULL, TRUE, &nerr); 
    956956 
    957957                if (nerr != NULL) 
     
    12771277 
    12781278static 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); 
     1279tny_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); 
    12821282} 
    12831283 
     
    13521352 
    13531353static void  
    1354 tny_camel_store_account_get_folders_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err) 
     1354tny_camel_store_account_get_folders_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, GError **err) 
    13551355{ 
    13561356        TnyCamelAccountPriv *apriv = TNY_CAMEL_ACCOUNT_GET_PRIVATE (self); 
     
    14021402        iter = priv->iter; 
    14031403 
    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        } 
    14061412 
    14071413        /*else 
     
    14731479        TnyGetFoldersCallback callback; 
    14741480        TnyFolderStoreQuery *query; 
     1481        gboolean refresh; 
    14751482        gpointer user_data; 
    14761483        TnySessionCamel *session; 
     
    15191526 
    15201527        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); 
    15221529 
    15231530        info->cancelled = FALSE; 
     
    15601567 
    15611568static 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); 
     1569tny_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); 
    15651572} 
    15661573 
    15671574static void  
    1568 tny_camel_store_account_get_folders_async_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data) 
     1575tny_camel_store_account_get_folders_async_default (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data) 
    15691576{ 
    15701577        GetFoldersInfo *info; 
     
    15851592        info->user_data = user_data; 
    15861593        info->query = query; 
     1594        info->refresh = refresh; 
    15871595 
    15881596        /* thread reference */ 
     
    16001608                &info->cancelled, info, sizeof (GetFoldersInfo), 
    16011609                TNY_CAMEL_QUEUE_NORMAL_ITEM|TNY_CAMEL_QUEUE_PRIORITY_ITEM,  
     1610                __FUNCTION__); 
     1611 
     1612        return; 
     1613} 
     1614 
     1615static void 
     1616tny_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 
     1711typedef 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 
     1725static void 
     1726tny_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 
     1741static gboolean 
     1742tny_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 
     1754static gpointer 
     1755tny_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 
     1770static void 
     1771tny_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 
     1784static gboolean 
     1785tny_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 
     1796static void 
     1797tny_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, 
    16021824                __FUNCTION__); 
    16031825 
     
    20732295        klass->add_observer= tny_camel_store_account_add_observer; 
    20742296        klass->remove_observer= tny_camel_store_account_remove_observer; 
     2297        klass->refresh_async = tny_camel_store_account_store_refresh_async; 
    20752298 
    20762299        return; 
  • trunk/libtinymail-camel/tny-camel-store-account.h

    r3779 r3787  
    5050 
    5151        /* 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); 
    5454        void (*remove_folder) (TnyFolderStore *self, TnyFolder *folder, GError **err); 
    5555        TnyFolder* (*create_folder) (TnyFolderStore *self, const gchar *name, GError **err); 
  • trunk/libtinymail/tny-combined-account.c

    r3779 r3787  
    300300 
    301301static 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); 
     302tny_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 
     309static void 
     310tny_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 
     317static void 
     318tny_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); 
    315323} 
    316324 
     
    541549        klass->add_observer= tny_combined_account_add_observer; 
    542550        klass->remove_observer= tny_combined_account_remove_observer; 
     551        klass->refresh_async = tny_combined_account_refresh_async; 
    543552} 
    544553 
  • trunk/libtinymail/tny-folder-store.c

    r3779 r3787  
    267267 * @list: a #TnyList to to which the folders will be prepended 
    268268 * @query: (null-ok): a #TnyFolderStoreQuery or NULL 
     269 * @refresh: synchronize with the service first 
    269270 * @err: (null-ok): a #GError or NULL 
    270271 * 
     
    278279 * TnyIterator *iter; TnyFolderStoreQuery *query = ... 
    279280 * 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); 
    281282 * iter = tny_list_create_iterator (folders); 
    282283 * while (!tny_iterator_is_done (iter)) 
     
    296297 **/ 
    297298void  
    298 tny_folder_store_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err) 
     299tny_folder_store_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, GError **err) 
    299300{ 
    300301#ifdef DBC /* require */ 
     
    307308#endif 
    308309 
    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); 
    310311 
    311312#ifdef DBC /* ensure */ 
     
    344345 * @list: a #TnyList to to which the folders will be prepended 
    345346 * @query: (null-ok): A #TnyFolderStoreQuery object 
     347 * @refresh: synchronize with the service first 
    346348 * @callback: (null-ok): a #TnyGetFoldersCallback or NULL 
    347349 * @status_callback: (null-ok): a #TnyStatusCallback or NULL 
     
    364366 *         g_print ("%s\n", tny_folder_get_name (TNY_FOLDER (folder))); 
    365367 *         tny_folder_store_get_folders_async (folder, 
    366  *             folders, NULL, callback, NULL, NULL); 
     368 *             folders, NULL, true, callback, NULL, NULL); 
    367369 *         g_object_unref (folder); 
    368370 *         tny_iterator_next (iter); 
     
    376378 *     folders = tny_simple_list_new (); 
    377379 *     tny_folder_store_get_folders_async (TNY_FOLDER_STORE (account), 
    378  *         folders, NULL, callback, NULL, NULL); 
     380 *         folders, NULL, TRUE, callback, NULL, NULL); 
    379381 *     g_object_unref (folders); 
    380382 * } 
     
    389391 **/ 
    390392void  
    391 tny_folder_store_get_folders_async (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data) 
     393tny_folder_store_get_folders_async (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data) 
    392394{ 
    393395#ifdef DBC /* require */ 
     
    400402#endif 
    401403 
    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 
     413void 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
    411427 
    412428static void 
  • trunk/libtinymail/tny-folder-store.h

    r3779 r3787  
    4949        TnyFolder* (*create_folder) (TnyFolderStore *self, const gchar *name, GError **err); 
    5050        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); 
    5353        void (*add_observer) (TnyFolderStore *self, TnyFolderStoreObserver *observer); 
    5454        void (*remove_observer) (TnyFolderStore *self, TnyFolderStoreObserver *observer); 
     55        void (*refresh_async) (TnyFolderStore *self, TnyFolderStoreCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
    5556 
    5657}; 
     
    6061void tny_folder_store_remove_folder (TnyFolderStore *self, TnyFolder *folder, GError **err); 
    6162void 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); 
     63void tny_folder_store_get_folders_async (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, TnyGetFoldersCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
    6364void tny_folder_store_add_observer (TnyFolderStore *self, TnyFolderStoreObserver *observer); 
    6465void tny_folder_store_remove_observer (TnyFolderStore *self, TnyFolderStoreObserver *observer); 
     66void tny_folder_store_refresh_async (TnyFolderStore *self, TnyFolderStoreCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
    6567 
    6668#ifndef TNY_DISABLE_DEPRECATED 
    67 void tny_folder_store_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, GError **err); 
     69void tny_folder_store_get_folders (TnyFolderStore *self, TnyList *list, TnyFolderStoreQuery *query, gboolean refresh, GError **err); 
    6870TnyFolder *tny_folder_store_create_folder (TnyFolderStore *self, const gchar *name, GError **err); 
    6971#endif 
  • trunk/libtinymail/tny-shared.h

    r3779 r3787  
    138138typedef TnyStream* (*TnyStreamCacheOpenStreamFetcher) (TnyStreamCache *self, gint64 *expected_size, gpointer userdata); 
    139139typedef gboolean (*TnyStreamCacheRemoveFilter) (TnyStreamCache *self, const gchar *id, gpointer userdata); 
     140typedef void (*TnyFolderStoreCallback) (TnyFolderStore *self, gboolean cancelled, GError *err, gpointer user_data); 
    140141 
    141142/**  
  • trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.c

    r3779 r3787  
    116116 
    117117        /* 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); 
    119119        iter = tny_list_create_iterator (folders); 
    120120 
     
    344344        list = tny_simple_list_new (); 
    345345        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)); 
    347347 
    348348        return; 
     
    523523 
    524524        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)); 
    526526 
    527527        /* recurse_folders_sync (self, TNY_FOLDER_STORE (folder_store), &name_iter);  */ 
  • trunk/tests/c-demo/tny-demoui-summary-view.c

    r3779 r3787  
    400400        TnyIterator *f_iter; 
    401401 
    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); 
    403403        f_iter = tny_list_create_iterator (folders); 
    404404        while (!tny_iterator_is_done (f_iter)) 
     
    11791179                        g_free (folder_name); 
    11801180                        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); 
    11821182              &n