Changeset 3634

Show
Ignore:
Timestamp:
04/28/08 18:51:22
Author:
jdapena
Message:

* libtinymail/tny-folder.[ch]:

  • New method find_msg_async. This makes find_msg synchronous
    version be deprecated now.

* libtinymail-camel/tny-camel-folder.[ch],

libtinymail/tny-merge-folder.[ch]:

  • Added implementations of find_msg_async method.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r3631 r3634  
     12008-04-28  Jose Dapena Paz  <jdapena@igalia.com>, Sergio Villar Senin <svillar@igalia.com> 
     2 
     3        * libtinymail/tny-folder.[ch]: new method find_msg_async. This makes find_msg synchronous 
     4        version be deprecated now. 
     5 
     6        * libtinymail-camel/tny-camel-folder.[ch], 
     7        libtinymail/tny-merge-folder.[ch]: 
     8        Added implementations of find_msg_async method. 
     9 
    1102008-04-25  Philip Van Hoof <pvanhoof@gnome.org> 
    211 
  • trunk/libtinymail-camel/tny-camel-folder.c

    r3616 r3634  
    12711271        TnyIterator *iter = NULL; 
    12721272        TnyHeader *header = NULL; 
    1273         TnyMsgRemoveStrategy *strat; 
    12741273 
    12751274        g_assert (TNY_IS_LIST (headers)); 
     
    25992598 
    26002599 
     2600typedef struct  
     2601{ 
     2602        TnyCamelQueueable parent; 
     2603 
     2604        TnyFolder *self; 
     2605        TnyMsg *msg; 
     2606        gchar *url_string; 
     2607        GError *err; 
     2608        gpointer user_data; 
     2609        TnyGetMsgCallback callback; 
     2610        TnyStatusCallback status_callback; 
     2611        TnySessionCamel *session; 
     2612        TnyIdleStopper *stopper; 
     2613        gboolean cancelled; 
     2614 
     2615} FindMsgInfo; 
     2616 
     2617static void 
     2618tny_camel_folder_find_msg_async_destroyer (gpointer thr_user_data) 
     2619{ 
     2620        FindMsgInfo *info = (FindMsgInfo *) thr_user_data; 
     2621        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (info->self); 
     2622 
     2623        /* thread reference */ 
     2624        _tny_camel_folder_unreason (priv); 
     2625        g_object_unref (info->self); 
     2626 
     2627        if (info->err) 
     2628                g_error_free (info->err); 
     2629 
     2630        tny_idle_stopper_destroy (info->stopper); 
     2631        info->stopper = NULL; 
     2632 
     2633        /**/ 
     2634 
     2635        camel_object_unref (info->session); 
     2636 
     2637        return; 
     2638} 
     2639 
     2640static gboolean 
     2641tny_camel_folder_find_msg_async_callback (gpointer thr_user_data) 
     2642{ 
     2643        FindMsgInfo *info = (FindMsgInfo *) thr_user_data; 
     2644        TnyFolderChange *change; 
     2645 
     2646        if (info->msg)  
     2647        { 
     2648                change = tny_folder_change_new (info->self); 
     2649                tny_folder_change_set_check_duplicates (change, TRUE); 
     2650                tny_folder_change_set_received_msg (change, info->msg); 
     2651                notify_folder_observers_about (info->self, change, info->session); 
     2652                g_object_unref (change); 
     2653        } 
     2654 
     2655        if (info->callback) { 
     2656                tny_lockable_lock (info->session->priv->ui_lock); 
     2657                info->callback (info->self, info->cancelled, info->msg, info->err, info->user_data); 
     2658                tny_lockable_unlock (info->session->priv->ui_lock); 
     2659        } 
     2660 
     2661        if (info->msg) 
     2662                g_object_unref (info->msg); 
     2663 
     2664        tny_idle_stopper_stop (info->stopper); 
     2665 
     2666        return FALSE; 
     2667} 
     2668 
     2669 
     2670static void 
     2671tny_camel_folder_find_msg_async_cancelled_destroyer (gpointer thr_user_data) 
     2672{ 
     2673        FindMsgInfo *info = (FindMsgInfo *) thr_user_data; 
     2674        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (info->self); 
     2675 
     2676        /* thread reference */ 
     2677        _tny_camel_folder_unreason (priv); 
     2678        g_object_unref (info->self); 
     2679 
     2680        if (info->err) 
     2681                g_error_free (info->err); 
     2682 
     2683        tny_idle_stopper_destroy (info->stopper); 
     2684        info->stopper = NULL; 
     2685 
     2686        /**/ 
     2687 
     2688        camel_object_unref (info->session); 
     2689 
     2690        return; 
     2691} 
     2692 
     2693static gboolean 
     2694tny_camel_folder_find_msg_async_cancelled_callback (gpointer thr_user_data) 
     2695{ 
     2696        FindMsgInfo *info = (FindMsgInfo *) thr_user_data; 
     2697        if (info->callback) { 
     2698                tny_lockable_lock (info->session->priv->ui_lock); 
     2699                info->callback (info->self, TRUE, NULL, info->err, info->user_data); 
     2700                tny_lockable_unlock (info->session->priv->ui_lock); 
     2701        } 
     2702        return FALSE; 
     2703} 
     2704 
     2705static gpointer  
     2706tny_camel_folder_find_msg_async_thread (gpointer thr_user_data) 
     2707{ 
     2708        FindMsgInfo *info = (FindMsgInfo *) thr_user_data; 
     2709 
     2710        info->msg = tny_folder_find_msg (info->self, info->url_string, &info->err); 
     2711 
     2712        info->cancelled = FALSE; 
     2713        if (info->err != NULL) { 
     2714                if (camel_strstrcase (info->err->message, "cancel") != NULL) 
     2715                        info->cancelled = TRUE; 
     2716        } 
     2717 
     2718        /* Free the URL */ 
     2719        g_free (info->url_string); 
     2720 
     2721        return NULL; 
     2722} 
     2723 
     2724static void 
     2725tny_camel_folder_find_msg_async (TnyFolder *self, const gchar *url_string, TnyGetMsgCallback callback, TnyStatusCallback status_callback, gpointer user_data) 
     2726{ 
     2727        TNY_CAMEL_FOLDER_GET_CLASS (self)->find_msg_async(self, url_string, callback, status_callback, user_data); 
     2728        return; 
     2729} 
     2730 
     2731 
     2732static void 
     2733tny_camel_folder_find_msg_async_default (TnyFolder *self, const gchar *url_string, TnyGetMsgCallback callback, TnyStatusCallback status_callback, gpointer user_data) 
     2734{ 
     2735        FindMsgInfo *info; 
     2736        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     2737        TnyCamelQueue *queue; 
     2738 
     2739        /* Idle info for the callbacks */ 
     2740        info = g_slice_new (FindMsgInfo); 
     2741        info->cancelled = FALSE; 
     2742        info->session = TNY_FOLDER_PRIV_GET_SESSION (priv); 
     2743        camel_object_ref (info->session); 
     2744        info->self = self; 
     2745        info->url_string = g_strdup (url_string); 
     2746        info->callback = callback; 
     2747        info->status_callback = status_callback; 
     2748        info->user_data = user_data; 
     2749        info->err = NULL; 
     2750 
     2751        info->stopper = tny_idle_stopper_new(); 
     2752 
     2753        /* thread reference */ 
     2754        _tny_camel_folder_reason (priv); 
     2755        g_object_ref (info->self); 
     2756 
     2757        if (!TNY_IS_CAMEL_POP_FOLDER (self)) 
     2758                queue = TNY_FOLDER_PRIV_GET_MSG_QUEUE (priv); 
     2759        else 
     2760                queue = TNY_FOLDER_PRIV_GET_QUEUE (priv); 
     2761 
     2762        _tny_camel_queue_launch (queue,  
     2763                tny_camel_folder_find_msg_async_thread,  
     2764                tny_camel_folder_find_msg_async_callback, 
     2765                tny_camel_folder_find_msg_async_destroyer,  
     2766                tny_camel_folder_find_msg_async_cancelled_callback, 
     2767                tny_camel_folder_find_msg_async_cancelled_destroyer,  
     2768                &info->cancelled, 
     2769                info, sizeof (FindMsgInfo),  
     2770                __FUNCTION__); 
     2771 
     2772        return; 
     2773} 
    26012774 
    26022775static TnyMsgReceiveStrategy*  
     
    58876060        klass->find_msg= tny_camel_folder_find_msg; 
    58886061        klass->get_msg_async= tny_camel_folder_get_msg_async; 
     6062        klass->find_msg_async= tny_camel_folder_find_msg_async; 
    58896063        klass->get_id= tny_camel_folder_get_id; 
    58906064        klass->get_name= tny_camel_folder_get_name; 
     
    59536127        class->find_msg= tny_camel_folder_find_msg_default; 
    59546128        class->get_msg_async= tny_camel_folder_get_msg_async_default; 
     6129        class->find_msg_async= tny_camel_folder_find_msg_async_default; 
    59556130        class->get_id= tny_camel_folder_get_id_default; 
    59566131        class->get_name= tny_camel_folder_get_name_default; 
  • trunk/libtinymail-camel/tny-camel-folder.h

    r3518 r3634  
    6868        TnyMsg* (*find_msg) (TnyFolder *self, const gchar *url_string, GError **err); 
    6969        void (*get_msg_async) (TnyFolder *self, TnyHeader *header, TnyGetMsgCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
     70        void (*find_msg_async) (TnyFolder *self, const gchar *url_string, TnyGetMsgCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
    7071        void (*get_headers) (TnyFolder *self, TnyList *headers, gboolean refresh, GError **err); 
    7172        void (*get_headers_async) (TnyFolder *self, TnyList *headers, gboolean refresh, TnyGetHeadersCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
  • trunk/libtinymail/tny-folder.c

    r3567 r3634  
    12131213 * </programlisting></informalexample> 
    12141214 * 
     1215 * Deprecated: 1.0: Use tny_folder_find_msg_async in stead 
    12151216 * returns: (null-ok) (caller-owns): The message instance or NULL 
    12161217 * since: 1.0 
     
    12261227        g_assert (url_string); 
    12271228        g_assert (strlen (url_string) > 0); 
    1228         g_assert (strstr (url_string, "://") != NULL); 
     1229        g_assert (strstr (url_string, ":") != NULL); 
    12291230        g_assert (TNY_FOLDER_GET_IFACE (self)->find_msg!= NULL); 
    12301231#endif 
     
    12851286 
    12861287        TNY_FOLDER_GET_IFACE (self)->get_msg_async(self, header, callback, status_callback, user_data); 
     1288 
     1289        return; 
     1290} 
     1291 
     1292/** 
     1293 * tny_folder_find_msg_async: 
     1294 * @self: a #TnyFolder 
     1295 * @url_string: the url string 
     1296 * @callback: (null-ok): a #TnyGetMsgCallback or NULL 
     1297 * @status_callback: (null-ok): a #TnyStatusCallback or NULL 
     1298 * @user_data: (null-ok): user data that will be passed to the callbacks 
     1299 * 
     1300 * Get a message in @self identified by @url_string asynchronously. 
     1301 * 
     1302 * Example: 
     1303 * <informalexample><programlisting> 
     1304 * static void  
     1305 * status_cb (GObject *sender, TnyStatus *status, gpointer user_data) 
     1306 * { 
     1307 *       printf ("."); 
     1308 * } 
     1309 * static void 
     1310 * folder_find_msg_cb (TnyFolder *folder, gboolean cancelled, TnyMsg *msg, GError **err, gpointer user_data) 
     1311 * { 
     1312 *       TnyMsgView *message_view = user_data; 
     1313 *       if (!err && msg && !cancelled) 
     1314 *           tny_msg_view_set_msg (message_view, msg); 
     1315 * } 
     1316 * TnyMsgView *message_view = tny_platform_factory_new_msg_view (platfact); 
     1317 * TnyFolder *folder = ...; gchar *url_string = ...; 
     1318 * tny_folder_find_msg_async (folder, msg_url, 
     1319 *          folder_get_msg_cb, status_cb, message_view);  
     1320 * </programlisting></informalexample> 
     1321 * 
     1322 * since: 1.0 
     1323 * audience: application-developer 
     1324 **/ 
     1325void 
     1326tny_folder_find_msg_async (TnyFolder *self, const gchar *url_string, TnyGetMsgCallback callback, TnyStatusCallback status_callback, gpointer user_data) 
     1327{ 
     1328#ifdef DBC /* require */ 
     1329        g_assert (TNY_IS_FOLDER (self)); 
     1330        g_assert (url_string); 
     1331        g_assert (strlen (url_string) > 0); 
     1332        g_assert (strstr (url_string, ":") != NULL); 
     1333        g_assert (TNY_FOLDER_GET_IFACE (self)->get_msg_async!= NULL); 
     1334#endif 
     1335 
     1336        TNY_FOLDER_GET_IFACE (self)->find_msg_async(self, url_string, callback, status_callback, user_data); 
    12871337 
    12881338        return; 
  • trunk/libtinymail/tny-folder.h

    r3601 r3634  
    110110        TnyMsg* (*find_msg) (TnyFolder *self, const gchar *url_string, GError **err); 
    111111        void (*get_msg_async) (TnyFolder *self, TnyHeader *header, TnyGetMsgCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
     112        void (*find_msg_async) (TnyFolder *self, const gchar *url_string, TnyGetMsgCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
    112113        void (*get_headers) (TnyFolder *self, TnyList *headers, gboolean refresh, GError **err); 
    113114        void (*get_headers_async) (TnyFolder *self, TnyList *headers, gboolean refresh, TnyGetHeadersCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
     
    148149void tny_folder_add_msg_async (TnyFolder *self, TnyMsg *msg, TnyFolderCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
    149150void tny_folder_sync_async (TnyFolder *self, gboolean expunge, TnyFolderCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
    150 TnyMsg* tny_folder_find_msg (TnyFolder *self, const gchar *url_string, GError **err); 
    151151void tny_folder_get_msg_async (TnyFolder *self, TnyHeader *header, TnyGetMsgCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
     152void tny_folder_find_msg_async (TnyFolder *self, const gchar *url_string, TnyGetMsgCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
    152153void tny_folder_get_headers_async (TnyFolder *self, TnyList *headers, gboolean refresh, TnyGetHeadersCallback callback, TnyStatusCallback status_callback, gpointer user_data); 
    153154TnyAccount* tny_folder_get_account (TnyFolder *self); 
     
    177178void tny_folder_remove_msgs (TnyFolder *self, TnyList *headers, GError **err); 
    178179TnyMsg* tny_folder_get_msg (TnyFolder *self, TnyHeader *header, GError **err); 
     180TnyMsg* tny_folder_find_msg (TnyFolder *self, const gchar *url_string, GError **err); 
    179181void tny_folder_refresh (TnyFolder *self, GError **err); 
    180182void tny_folder_transfer_msgs (TnyFolder *self, TnyList *header_list, TnyFolder *folder_dst, gboolean delete_originals, GError **err); 
  • trunk/libtinymail/tny-merge-folder.c

    r3618 r3634  
    634634 
    635635        thread = g_thread_create (get_msg_async_thread, info, FALSE, NULL); 
     636 
     637        return; 
     638} 
     639 
     640 
     641typedef struct  
     642{ 
     643        TnyFolder *self; 
     644        TnyMsg *msg; 
     645        gchar *url_string; 
     646        GError *err; 
     647        gpointer user_data; 
     648        guint depth; 
     649        TnyGetMsgCallback callback; 
     650        TnyStatusCallback status_callback; 
     651} FindMsgInfo; 
     652 
     653static void 
     654find_msg_async_destroyer (gpointer thr_user_data) 
     655{ 
     656        FindMsgInfo *info = (FindMsgInfo *) thr_user_data; 
     657 
     658        /* thread reference */ 
     659        g_object_unref (info->self); 
     660 
     661        if (info->msg) 
     662                g_object_unref (info->msg); 
     663 
     664        if (info->url_string) 
     665                g_free (info->url_string); 
     666 
     667        if (info->err) 
     668                g_error_free (info->err); 
     669 
     670        g_slice_free (FindMsgInfo, info); 
     671} 
     672 
     673static gboolean 
     674find_msg_async_callback (gpointer thr_user_data) 
     675{ 
     676        FindMsgInfo *info = (FindMsgInfo *) thr_user_data; 
     677        TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (info->self); 
     678 
     679        if (info->callback) {  
     680                /* TNY TODO: the cancelled field */ 
     681                tny_lockable_lock (priv->ui_locker); 
     682                info->callback (info->self, FALSE, info->msg, info->err, info->user_data); 
     683                tny_lockable_unlock (priv->ui_locker); 
     684        } 
     685 
     686        return FALSE; 
     687} 
     688 
     689static gpointer  
     690find_msg_async_thread (gpointer thr_user_data) 
     691{ 
     692        FindMsgInfo *info = (FindMsgInfo *) thr_user_data; 
     693 
     694        info->msg = tny_folder_find_msg (info->self, info->url_string, &info->err); 
     695 
     696        if (info->err != NULL) 
     697        { 
     698                if (info->msg && G_IS_OBJECT (info->msg)) 
     699                        g_object_unref (info->msg); 
     700                info->msg = NULL; 
     701        } 
     702 
     703        if (info->callback) 
     704        { 
     705                if (info->depth > 0) 
     706                { 
     707                        g_idle_add_full (G_PRIORITY_HIGH,  
     708                                find_msg_async_callback,  
     709                                info, find_msg_async_destroyer); 
     710                } else { 
     711                        find_msg_async_callback (info); 
     712                        find_msg_async_destroyer (info); 
     713                } 
     714        } else /* thread reference */ 
     715                g_object_unref (info->self); 
     716 
     717        g_thread_exit (NULL); 
     718 
     719        return NULL; 
     720 
     721} 
     722 
     723static void 
     724tny_merge_folder_find_msg_async (TnyFolder *self, const gchar *url_string, TnyGetMsgCallback callback, TnyStatusCallback status_callback, gpointer user_data) 
     725{ 
     726        FindMsgInfo *info; 
     727        GThread *thread; 
     728 
     729        info = g_slice_new (FindMsgInfo); 
     730        info->self = self; 
     731        info->url_string = g_strdup (url_string); 
     732        info->callback = callback; 
     733        info->status_callback = status_callback; 
     734        info->user_data = user_data; 
     735        info->depth = g_main_depth (); 
     736        info->err = NULL; 
     737 
     738        /* thread reference */ 
     739        g_object_ref (info->self); 
     740 
     741        thread = g_thread_create (find_msg_async_thread, info, FALSE, NULL); 
    636742 
    637743        return; 
     
    18551961        klass->find_msg= tny_merge_folder_find_msg; 
    18561962        klass->get_msg_async= tny_merge_folder_get_msg_async; 
     1963        klass->find_msg_async= tny_merge_folder_find_msg_async; 
    18571964        klass->get_headers= tny_merge_folder_get_headers; 
    18581965        klass->get_headers_async= tny_merge_folder_get_headers_async;