Changeset 3634
- Timestamp:
- 04/28/08 18:51:22
- Files:
-
- trunk/ChangeLog (modified) (1 diff)
- trunk/libtinymail-camel/tny-camel-folder.c (modified) (4 diffs)
- trunk/libtinymail-camel/tny-camel-folder.h (modified) (1 diff)
- trunk/libtinymail/tny-folder.c (modified) (3 diffs)
- trunk/libtinymail/tny-folder.h (modified) (3 diffs)
- trunk/libtinymail/tny-merge-folder.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/ChangeLog
r3631 r3634 1 2008-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 1 10 2008-04-25 Philip Van Hoof <pvanhoof@gnome.org> 2 11 trunk/libtinymail-camel/tny-camel-folder.c
r3616 r3634 1271 1271 TnyIterator *iter = NULL; 1272 1272 TnyHeader *header = NULL; 1273 TnyMsgRemoveStrategy *strat;1274 1273 1275 1274 g_assert (TNY_IS_LIST (headers)); … … 2599 2598 2600 2599 2600 typedef 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 2617 static void 2618 tny_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 2640 static gboolean 2641 tny_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 2670 static void 2671 tny_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 2693 static gboolean 2694 tny_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 2705 static gpointer 2706 tny_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 2724 static void 2725 tny_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 2732 static void 2733 tny_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 } 2601 2774 2602 2775 static TnyMsgReceiveStrategy* … … 5887 6060 klass->find_msg= tny_camel_folder_find_msg; 5888 6061 klass->get_msg_async= tny_camel_folder_get_msg_async; 6062 klass->find_msg_async= tny_camel_folder_find_msg_async; 5889 6063 klass->get_id= tny_camel_folder_get_id; 5890 6064 klass->get_name= tny_camel_folder_get_name; … … 5953 6127 class->find_msg= tny_camel_folder_find_msg_default; 5954 6128 class->get_msg_async= tny_camel_folder_get_msg_async_default; 6129 class->find_msg_async= tny_camel_folder_find_msg_async_default; 5955 6130 class->get_id= tny_camel_folder_get_id_default; 5956 6131 class->get_name= tny_camel_folder_get_name_default; trunk/libtinymail-camel/tny-camel-folder.h
r3518 r3634 68 68 TnyMsg* (*find_msg) (TnyFolder *self, const gchar *url_string, GError **err); 69 69 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); 70 71 void (*get_headers) (TnyFolder *self, TnyList *headers, gboolean refresh, GError **err); 71 72 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 1213 1213 * </programlisting></informalexample> 1214 1214 * 1215 * Deprecated: 1.0: Use tny_folder_find_msg_async in stead 1215 1216 * returns: (null-ok) (caller-owns): The message instance or NULL 1216 1217 * since: 1.0 … … 1226 1227 g_assert (url_string); 1227 1228 g_assert (strlen (url_string) > 0); 1228 g_assert (strstr (url_string, ": //") != NULL);1229 g_assert (strstr (url_string, ":") != NULL); 1229 1230 g_assert (TNY_FOLDER_GET_IFACE (self)->find_msg!= NULL); 1230 1231 #endif … … 1285 1286 1286 1287 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 **/ 1325 void 1326 tny_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); 1287 1337 1288 1338 return; trunk/libtinymail/tny-folder.h
r3601 r3634 110 110 TnyMsg* (*find_msg) (TnyFolder *self, const gchar *url_string, GError **err); 111 111 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); 112 113 void (*get_headers) (TnyFolder *self, TnyList *headers, gboolean refresh, GError **err); 113 114 void (*get_headers_async) (TnyFolder *self, TnyList *headers, gboolean refresh, TnyGetHeadersCallback callback, TnyStatusCallback status_callback, gpointer user_data); … … 148 149 void tny_folder_add_msg_async (TnyFolder *self, TnyMsg *msg, TnyFolderCallback callback, TnyStatusCallback status_callback, gpointer user_data); 149 150 void 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);151 151 void tny_folder_get_msg_async (TnyFolder *self, TnyHeader *header, TnyGetMsgCallback callback, TnyStatusCallback status_callback, gpointer user_data); 152 void tny_folder_find_msg_async (TnyFolder *self, const gchar *url_string, TnyGetMsgCallback callback, TnyStatusCallback status_callback, gpointer user_data); 152 153 void tny_folder_get_headers_async (TnyFolder *self, TnyList *headers, gboolean refresh, TnyGetHeadersCallback callback, TnyStatusCallback status_callback, gpointer user_data); 153 154 TnyAccount* tny_folder_get_account (TnyFolder *self); … … 177 178 void tny_folder_remove_msgs (TnyFolder *self, TnyList *headers, GError **err); 178 179 TnyMsg* tny_folder_get_msg (TnyFolder *self, TnyHeader *header, GError **err); 180 TnyMsg* tny_folder_find_msg (TnyFolder *self, const gchar *url_string, GError **err); 179 181 void tny_folder_refresh (TnyFolder *self, GError **err); 180 182 void 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 634 634 635 635 thread = g_thread_create (get_msg_async_thread, info, FALSE, NULL); 636 637 return; 638 } 639 640 641 typedef 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 653 static void 654 find_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 673 static gboolean 674 find_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 689 static gpointer 690 find_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 723 static void 724 tny_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); 636 742 637 743 return; … … 1855 1961 klass->find_msg= tny_merge_folder_find_msg; 1856 1962 klass->get_msg_async= tny_merge_folder_get_msg_async; 1963 klass->find_msg_async= tny_merge_folder_find_msg_async; 1857 1964 klass->get_headers= tny_merge_folder_get_headers; 1858 1965 klass->get_headers_async= tny_merge_folder_get_headers_async;
