Changeset 1428

Show
Ignore:
Timestamp:
01/17/07 22:15:30
Author:
pvanhoof
Message:

Introduction of folder observers and folder monitors

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r1427 r1428  
     12007-01-17   Philip Van Hoof <pvanhoof@gnome.org> 
     2 
     3        * Introduction of TnyFolderChange, TnyFolderObserver, TnyFolderMonitor 
     4        * Updated Python bindings 
     5 
     6        * This was a major API change in all 
     7 
    182007-01-17  Sergio Villar Senin <svillar@igalia.com> 
    29 
  • trunk/bindings/python/Makefile.am

    r1364 r1428  
    106106        $(top_srcdir)/libtinymail/tny-msg-remove-strategy.h \ 
    107107        $(top_srcdir)/libtinymail/tny-msg-receive-strategy.h \ 
    108         $(top_srcdir)/libtinymail/tny-send-queue.h 
     108        $(top_srcdir)/libtinymail/tny-send-queue.h \ 
     109        $(top_srcdir)/libtinymail/tny-pair.h \ 
     110        $(top_srcdir)/libtinymail/tny-lockable.h \ 
     111        $(top_srcdir)/libtinymail/tny-noop-lockable.h \ 
     112        $(top_srcdir)/libtinymail/tny-folder-change.h \ 
     113        $(top_srcdir)/libtinymail/tny-folder-observer.h \ 
     114        $(top_srcdir)/libtinymail/tny-folder-monitor.h 
    109115 
    110116tinymail.defs: $(tinymail_h_files) tinymail.defs.extra $(top_srcdir)/bindings/python/filter.py  
     
    149155        $(top_srcdir)/libtinymailui-gtk/tny-gtk-msg-window.h \ 
    150156        $(top_srcdir)/libtinymailui-gtk/tny-gtk-text-buffer-stream.h \ 
    151         $(top_srcdir)/libtinymailui-gtk/tny-gtk-text-mime-part-view.h 
     157        $(top_srcdir)/libtinymailui-gtk/tny-gtk-text-mime-part-view.h \ 
     158        $(top_srcdir)/libtinymailui-gtk/tny-gtk-lockable.h 
    152159 
    153160tinymailui-gtk.defs: $(tinymailui_gtk_h_files) tinymailui-gtk.defs.extra $(top_srcdir)/bindings/python/filter.py 
     
    191198        $(top_srcdir)/libtinymail-camel/tny-camel-store-account.h \ 
    192199        $(top_srcdir)/libtinymail-camel/tny-camel-stream.h \ 
    193         $(top_srcdir)/libtinymail-camel/tny-camel-transport-account.h  
     200        $(top_srcdir)/libtinymail-camel/tny-camel-transport-account.h \ 
     201        $(top_srcdir)/libtinymail-camel/tny-camel-mem-stream.h 
    194202 
    195203tinymail-camel.defs : $(tinymail_camel_h_files) tinymail-camel.defs.extra $(top_srcdir)/bindings/python/filter.py 
  • trunk/bindings/python/tinymail-camel.override

    r1364 r1428  
    4747#include <tny-camel-full-msg-receive-strategy.h> 
    4848#include <tny-camel-partial-msg-receive-strategy.h> 
    49  
     49#include <tny-camel-mem-stream.h> 
    5050 
    5151#define NO_IMPORT_PYGOBJECT 
  • trunk/bindings/python/tinymail.override

    r1378 r1428  
    2727#include <tny-msg-receive-strategy.h> 
    2828#include <tny-pair.h> 
     29#include <tny-folder-monitor.h> 
     30#include <tny-folder-change.h> 
     31#include <tny-lockable.h> 
     32#include <tny-noop-lockable.h> 
     33#include <tny-folder-observer.h> 
    2934 
    3035#define NO_IMPORT_PYGOBJECT 
  • trunk/bindings/python/tinymailui-gtk.override

    r1283 r1428  
    2020#include <tny-gtk-text-buffer-stream.h> 
    2121#include <tny-gtk-text-mime-part-view.h> 
     22#include <tny-gtk-lockable.h> 
    2223 
    2324%% 
  • trunk/libtinymail-camel/tny-camel-folder-priv.h

    r1368 r1428  
    4747        TnyMsgRemoveStrategy *remove_strat; 
    4848        TnyMsgReceiveStrategy *receive_strat; 
     49        TnyList *observers; 
    4950 
    5051#ifdef HEALTHY_CHECK 
  • trunk/libtinymail-camel/tny-camel-folder.c

    r1427 r1428  
    3535#include <tny-list.h> 
    3636#include <tny-error.h> 
     37#include <tny-folder-change.h> 
     38#include <tny-folder-observer.h> 
     39#include <tny-simple-list.h> 
    3740 
    3841#include <camel/camel-folder.h> 
     
    21252128} 
    21262129 
     2130 
     2131static void  
     2132tny_camel_folder_poke_recent_changes (TnyFolder *self) 
     2133{ 
     2134        TNY_CAMEL_FOLDER_GET_CLASS (self)->poke_recent_changes_func (self); 
     2135        return; 
     2136} 
     2137 
     2138static gboolean 
     2139tny_camel_folder_poke_recent_changes_callback (gpointer data) 
     2140{ 
     2141        TnyFolder *self = data; 
     2142        TnyFolderChange *change = tny_folder_change_new (self); 
     2143        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     2144        TnyIterator *iter; 
     2145 
     2146        /* TNY TODO: Implement getting the latest changes */ 
     2147 
     2148        iter = tny_list_create_iterator (priv->observers); 
     2149        while (!tny_iterator_is_done (iter)) 
     2150        { 
     2151                TnyFolderObserver *observer = TNY_FOLDER_OBSERVER (tny_iterator_get_current (iter)); 
     2152                tny_folder_observer_update (observer, change); 
     2153                g_object_unref (G_OBJECT (observer)); 
     2154        } 
     2155        g_object_unref (G_OBJECT (iter)); 
     2156 
     2157        g_object_unref (G_OBJECT (change)); 
     2158 
     2159        return FALSE; 
     2160} 
     2161 
     2162static void 
     2163tny_camel_folder_poke_recent_changes_destroyer (gpointer data) 
     2164{ 
     2165        g_object_unref (G_OBJECT (data)); 
     2166} 
     2167 
     2168static void  
     2169tny_camel_folder_poke_recent_changes_default (TnyFolder *self) 
     2170{ 
     2171        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     2172        GObject *info = g_object_ref (G_OBJECT (self)); 
     2173 
     2174        if (g_main_depth () > 0) 
     2175        { 
     2176                g_idle_add_full (G_PRIORITY_HIGH,  
     2177                                tny_camel_folder_poke_recent_changes_callback,  
     2178                                info, tny_camel_folder_poke_recent_changes_destroyer); 
     2179        } else  
     2180        { 
     2181                tny_camel_folder_poke_recent_changes_callback (info); 
     2182                tny_camel_folder_poke_recent_changes_destroyer (info); 
     2183        } 
     2184 
     2185        return; 
     2186} 
     2187 
     2188static void 
     2189tny_camel_folder_add_observer (TnyFolder *self, TnyFolderObserver *observer) 
     2190{ 
     2191        TNY_CAMEL_FOLDER_GET_CLASS (self)->add_observer_func (self, observer); 
     2192} 
     2193 
     2194static void 
     2195tny_camel_folder_add_observer_default (TnyFolder *self, TnyFolderObserver *observer) 
     2196{ 
     2197        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     2198 
     2199        g_assert (TNY_IS_FOLDER_OBSERVER (observer)); 
     2200 
     2201        tny_list_prepend (priv->observers, G_OBJECT (observer)); 
     2202 
     2203        return; 
     2204} 
     2205 
     2206 
     2207static void 
     2208tny_camel_folder_remove_observer (TnyFolder *self, TnyFolderObserver *observer) 
     2209{ 
     2210        TNY_CAMEL_FOLDER_GET_CLASS (self)->remove_observer_func (self, observer); 
     2211} 
     2212 
     2213static void 
     2214tny_camel_folder_remove_observer_default (TnyFolder *self, TnyFolderObserver *observer) 
     2215{ 
     2216        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     2217 
     2218        g_assert (TNY_IS_FOLDER_OBSERVER (observer)); 
     2219 
     2220        tny_list_remove (priv->observers, G_OBJECT (observer)); 
     2221 
     2222        return; 
     2223} 
     2224 
     2225 
    21272226/** 
    21282227 * tny_camel_folder_new_with_folder: 
     
    21692268 
    21702269        g_mutex_lock (priv->folder_lock); 
     2270 
     2271        g_object_unref (priv->observers); 
    21712272 
    21722273        if (priv->account && TNY_IS_CAMEL_STORE_ACCOUNT (priv->account)) 
     
    22482349        klass->transfer_msgs_async_func = tny_camel_folder_transfer_msgs_async; 
    22492350        klass->copy_func = tny_camel_folder_copy; 
     2351        klass->poke_recent_changes_func = tny_camel_folder_poke_recent_changes; 
     2352        klass->add_observer_func = tny_camel_folder_add_observer; 
     2353        klass->remove_observer_func = tny_camel_folder_remove_observer; 
    22502354 
    22512355        return; 
     
    22972401        class->transfer_msgs_async_func = tny_camel_folder_transfer_msgs_async_default; 
    22982402        class->copy_func = tny_camel_folder_copy_default; 
     2403        class->poke_recent_changes_func = tny_camel_folder_poke_recent_changes_default; 
     2404        class->add_observer_func = tny_camel_folder_add_observer_default; 
     2405        class->remove_observer_func = tny_camel_folder_remove_observer_default; 
    22992406 
    23002407        class->get_folders_async_func = tny_camel_folder_get_folders_async_default; 
     
    23162423        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
    23172424 
     2425        priv->observers = tny_simple_list_new (); 
    23182426        priv->iter = NULL; 
    23192427        priv->iter_parented = FALSE; 
     
    23282436        priv->cached_name = NULL; 
    23292437        priv->cached_folder_type = TNY_FOLDER_TYPE_UNKNOWN; 
    2330  
    23312438        priv->remove_strat = tny_camel_msg_remove_strategy_new (); 
    23322439        priv->receive_strat = tny_camel_full_msg_receive_strategy_new (); 
  • trunk/libtinymail-camel/tny-camel-folder.h

    r1359 r1428  
    7777        void (*transfer_msgs_async_func) (TnyFolder *self, TnyList *header_list, TnyFolder *folder_dst, gboolean delete_originals, TnyTransferMsgsCallback callback, gpointer user_data); 
    7878        TnyFolder* (*copy_func) (TnyFolder *self, TnyFolderStore *into, const gchar *new_name, gboolean del, GError **err); 
     79        void (*poke_recent_changes_func) (TnyFolder *self); 
     80        void (*add_observer_func) (TnyFolder *self, TnyFolderObserver *observer); 
     81        void (*remove_observer_func) (TnyFolder *self, TnyFolderObserver *observer); 
    7982 
    8083        void (*get_folders_async_func) (TnyFolderStore *self, TnyList *list, TnyGetFoldersCallback callback, TnyFolderStoreQuery *query, gpointer user_data); 
  • trunk/libtinymail/Makefile.am

    r1398 r1428  
    1212        tny-header.h \ 
    1313        tny-pair.h \ 
     14        tny-folder-change.h \ 
     15        tny-folder-observer.h \ 
     16        tny-folder-monitor.h \ 
    1417        tny-msg.h \ 
    1518        tny-device.h \ 
     
    3740        tny-header.c \ 
    3841        tny-pair.c \ 
     42        tny-folder-change.c \ 
     43        tny-folder-observer.c \ 
     44        tny-folder-monitor.c \ 
    3945        tny-mime-part.c \ 
    4046        tny-folder.c \ 
  • trunk/libtinymail/tny-folder.c

    r1416 r1428  
    2626guint tny_folder_signals [TNY_FOLDER_LAST_SIGNAL]; 
    2727 
    28  
    29  
     28/** 
     29 * tny_folder_add_observer: 
     30 * @self: a #TnyFolder instance 
     31 * @observer: a #TnyFolderObserver instance 
     32 * 
     33 * Add @observer to the list of interested observers for the  
     34 * event that could happen caused by a tny_folder_poke_recent_changes or 
     35 * other urgent changes. 
     36 * 
     37 **/ 
     38void  
     39tny_folder_add_observer (TnyFolder *self, TnyFolderObserver *observer) 
     40
     41#ifdef DEBUG 
     42        if (!TNY_FOLDER_GET_IFACE (self)->add_observer_func) 
     43                g_critical ("You must implement tny_folder_add_observer\n"); 
     44#endif 
     45        TNY_FOLDER_GET_IFACE (self)->add_observer_func (self, observer); 
     46        return; 
     47
     48 
     49 
     50/** 
     51 * tny_folder_remove_observer: 
     52 * @self: a #TnyFolder instance 
     53 * @observer: a #TnyFolderObserver instance 
     54 * 
     55 * Remove @observer from the list of interested observers for the  
     56 * event that could happen caused by a tny_folder_poke_recent_changes or 
     57 * other urgent changes. 
     58 * 
     59 **/ 
     60void  
     61tny_folder_remove_observer (TnyFolder *self, TnyFolderObserver *observer) 
     62
     63#ifdef DEBUG 
     64        if (!TNY_FOLDER_GET_IFACE (self)->remove_observer_func) 
     65                g_critical ("You must implement tny_folder_remove_observer\n"); 
     66#endif 
     67        TNY_FOLDER_GET_IFACE (self)->remove_observer_func (self, observer); 
     68        return; 
     69 
     70
     71 
     72/** 
     73 * tny_folder_poke_recent_changes: 
     74 * @self: a TnyFolder object 
     75 * 
     76 * Poke for recent changes 
     77 * 
     78 **/ 
     79void  
     80tny_folder_poke_recent_changes (TnyFolder *self) 
     81
     82#ifdef DEBUG 
     83        if (!TNY_FOLDER_GET_IFACE (self)->poke_recent_changes_func) 
     84                g_critical ("You must implement tny_folder_get_recent_changes\n"); 
     85#endif 
     86        TNY_FOLDER_GET_IFACE (self)->poke_recent_changes_func (self); 
     87        return; 
     88
    3089 
    3190 
  • trunk/libtinymail/tny-folder.h

    r1382 r1428  
    6464        TNY_FOLDER_TYPE_SENT, 
    6565        TNY_FOLDER_TYPE_ROOT, 
    66  
    67         /* below:not really TnyFolderTypes, 
    68          * but useful for clients */ 
    6966        TNY_FOLDER_TYPE_NOTES, 
    7067        TNY_FOLDER_TYPE_DRAFTS, 
     
    10198        void (*transfer_msgs_async_func) (TnyFolder *self, TnyList *header_list, TnyFolder *folder_dst, gboolean delete_originals, TnyTransferMsgsCallback callback, gpointer user_data); 
    10299        TnyFolder* (*copy_func) (TnyFolder *self, TnyFolderStore *into, const gchar *new_name, gboolean del, GError **err); 
     100        void (*poke_recent_changes_func) (TnyFolder *self); 
     101        void (*add_observer_func) (TnyFolder *self, TnyFolderObserver *observer); 
     102        void (*remove_observer_func) (TnyFolder *self, TnyFolderObserver *observer); 
     103 
    103104}; 
    104105 
     
    129130void tny_folder_transfer_msgs_async (TnyFolder *self, TnyList *header_list, TnyFolder *folder_dst, gboolean delete_originals, TnyTransferMsgsCallback callback, gpointer user_data); 
    130131TnyFolder* tny_folder_copy (TnyFolder *self, TnyFolderStore *into, const gchar *new_name, gboolean del, GError **err); 
     132void tny_folder_poke_recent_changes (TnyFolder *self); 
     133void tny_folder_add_observer (TnyFolder *self, TnyFolderObserver *observer); 
     134void tny_folder_remove_observer (TnyFolder *self, TnyFolderObserver *observer); 
     135 
    131136 
    132137G_END_DECLS 
  • trunk/libtinymail/tny-shared.h

    r1416 r1428  
    8787typedef struct _TnyNoopLockable TnyNoopLockable; 
    8888typedef struct _TnyNoopLockableClass TnyNoopLockableClass; 
     89typedef struct _TnyFolderObserver TnyFolderObserver; 
     90typedef struct _TnyFolderObserverIface TnyFolderObserverIface; 
     91typedef struct _TnyFolderChange TnyFolderChange; 
     92typedef struct _TnyFolderChangeClass TnyFolderChangeClass; 
     93typedef struct _TnyFolderMonitor TnyFolderMonitor; 
     94typedef struct _TnyFolderMonitorClass TnyFolderMonitorClass; 
    8995 
    9096G_END_DECLS