From: Dirk-Jan C. Binnema Date: Mon, 29 Jan 2007 23:15:10 +0000 (+0000) Subject: * modest-tny-send-queue.[ch]: X-Git-Tag: git_migration_finished~4119 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=550fd0dd7ef05779886f39803809e767f83ddce6 * modest-tny-send-queue.[ch]: - compiles now pmo-trunk-r762 --- diff --git a/src/Makefile.am b/src/Makefile.am index b8909be..ee2ae40 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,6 @@ # # Makefile.am -# Time-stamp: <2007-01-27 18:11:31 (djcb)> +# Time-stamp: <2007-01-30 00:21:56 (djcb)> SUBDIRS=$(MODEST_PLATFORM) widgets DIST_SUBDIRS = widgets gtk maemo @@ -30,12 +30,12 @@ bin_PROGRAMS=\ modest modest_SOURCES=\ - modest-account-mgr.c\ - modest-account-mgr.h\ - modest-account-mgr-helpers.h\ modest-account-mgr-helpers.c\ - modest-account-mgr-priv.h\ + modest-account-mgr-helpers.h\ modest-account-mgr-priv.c\ + modest-account-mgr-priv.h\ + modest-account-mgr.c\ + modest-account-mgr.h\ modest-cache-mgr.c\ modest-cache-mgr.h\ modest-conf.c\ @@ -46,8 +46,8 @@ modest_SOURCES=\ modest-formatter.h \ modest-icon-factory.c\ modest-icon-factory.h\ - modest-local-folder-info.h \ modest-local-folder-info.c \ + modest-local-folder-info.h \ modest-mail-operation-queue.c \ modest-mail-operation-queue.h \ modest-mail-operation.c \ @@ -65,24 +65,26 @@ modest_SOURCES=\ modest-singletons.h\ modest-text-utils.c\ modest-text-utils.h\ - modest-tny-account.c\ - modest-tny-account.h\ modest-tny-account-store.c\ modest-tny-account-store.h\ + modest-tny-account.c\ + modest-tny-account.h\ modest-tny-folder.c \ modest-tny-folder.h \ modest-tny-msg-actions.c\ modest-tny-msg-actions.h\ modest-tny-platform-factory.c \ modest-tny-platform-factory.h \ + modest-tny-send-queue.c\ + modest-tny-send-queue.h\ + modest-ui-actions.h\ modest-ui.c\ modest-ui.h\ - modest-ui-actions.h\ modest-widget-factory.c \ modest-widget-factory.h \ + modest-widget-memory-priv.h \ modest-widget-memory.c\ - modest-widget-memory.h \ - modest-widget-memory-priv.h + modest-widget-memory.h modest_LDADD = \ $(MODEST_GSTUFF_LIBS) \ diff --git a/src/modest-tny-send-queue.c b/src/modest-tny-send-queue.c index 6c92281..9636bff 100644 --- a/src/modest-tny-send-queue.c +++ b/src/modest-tny-send-queue.c @@ -29,11 +29,18 @@ #include +#include +#include +#include +#include +#include /* 'private'/'protected' functions */ static void modest_tny_send_queue_class_init (ModestTnySendQueueClass *klass); -static void modest_tny_send_queue_init (ModestTnySendQueue *obj); +static void modest_tny_send_queue_init (gpointer g, gpointer iface_data); static void modest_tny_send_queue_finalize (GObject *obj); +static void modest_tny_send_queue_instance_init (GTypeInstance *instance, gpointer g_class); + /* list my signals */ enum { /* MY_SIGNAL_1, */ @@ -44,42 +51,95 @@ enum { typedef struct _ModestTnySendQueuePrivate ModestTnySendQueuePrivate; struct _ModestTnySendQueuePrivate { TnyTransportAccount *account; + GThread *flush_outbox_thread; + GMutex *flush_lock; }; #define MODEST_TNY_SEND_QUEUE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_TNY_SEND_QUEUE, \ ModestTnySendQueuePrivate)) /* globals */ -static TnySendQueueClass *parent_class = NULL; +static GObjectClass *parent_class = NULL; /* uncomment the following if you have defined any signals */ /* static guint signals[LAST_SIGNAL] = {0}; */ +/* + * this thread actually tries to send all the mails in the outbox + */ +static void +flush_outbox_thread (TnySendQueue *self) +{ + TnyFolder *outbox, *sentbox; + TnyMsg *msg; + TnyHeader *header; + + TnyList *headers; + TnyIterator *iter; + + ModestTnySendQueuePrivate *priv; + + priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); + + outbox = tny_send_queue_get_outbox (self); + sentbox = tny_send_queue_get_sentbox (self); + + headers = tny_simple_list_new (); + + g_mutex_lock (priv->flush_lock); + tny_folder_get_headers (outbox, headers, TRUE, NULL); /* FIXME: err */ + iter = tny_list_create_iterator (headers); + + while (!tny_iterator_is_done (iter)) { + header = TNY_HEADER(tny_iterator_get_current(iter)); + msg = tny_folder_get_msg (outbox, header, NULL); + tny_transport_account_send (priv->account, + msg, NULL); /* FIXME: err */ + tny_folder_add_msg (sentbox, msg, NULL); /* FIXME: err */ + tny_folder_remove_msg (outbox, header, NULL); /* FIXME: err */ + + g_object_unref (G_OBJECT(header)); + g_object_unref (G_OBJECT(msg)); + + tny_iterator_next (iter); + } + + + g_object_unref (G_OBJECT(headers)); + g_object_unref (G_OBJECT(iter)); + + priv->flush_outbox_thread = NULL; + g_mutex_unlock (priv->flush_lock); + + g_thread_exit (NULL); +} + + static void modest_tny_send_queue_cancel (TnySendQueue *self, gboolean remove) { - MODEST_TNY_SENT_QUEUE_GET_CLASS(self)->cancel_func (self, remove); + MODEST_TNY_SEND_QUEUE_GET_CLASS(self)->cancel_func (self, remove); } static void modest_tny_send_queue_add (TnySendQueue *self, TnyMsg *msg) { - MODEST_TNY_SENT_QUEUE_GET_CLASS(self)->add_func (self, msg); + MODEST_TNY_SEND_QUEUE_GET_CLASS(self)->add_func (self, msg); } -static void +static TnyFolder* modest_tny_send_queue_get_sentbox (TnySendQueue *self) { - MODEST_TNY_SENT_QUEUE_GET_CLASS(self)->get_sentbox (self); + return MODEST_TNY_SEND_QUEUE_GET_CLASS(self)->get_sentbox_func (self); } -static void -modest_tny_send_queue_get_outbox (TnySendQueue *self, TnyMsg *msg) +static TnyFolder* +modest_tny_send_queue_get_outbox (TnySendQueue *self) { - MODEST_TNY_SENT_QUEUE_GET_CLASS(self)->get_outbox (self); + return MODEST_TNY_SEND_QUEUE_GET_CLASS(self)->get_outbox_func (self); } @@ -95,42 +155,46 @@ modest_tny_send_queue_cancel_default (TnySendQueue *self, gboolean remove) static void modest_tny_send_queue_add_default (TnySendQueue *self, TnyMsg *msg) { - ModestTnySendQueuePriv *priv; - - g_return_if_fail (self, NULL); - g_return_if_fail (TNY_IS_CAMEL_MSG(msg), NULL); + ModestTnySendQueuePrivate *priv; + TnyFolder *outbox; + + g_return_if_fail (self); + g_return_if_fail (TNY_IS_CAMEL_MSG(msg)); priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); - - /* FIXME */ -} + outbox = tny_send_queue_get_outbox (self); + tny_folder_add_msg (outbox, msg, NULL); + priv->flush_outbox_thread = g_thread_create ( + (GThreadFunc)flush_outbox_thread, + self, FALSE, NULL); +} static TnyFolder* modest_tny_send_queue_get_sentbox_default (TnySendQueue *self) { - ModestTnySendQueuePriv *priv; - + ModestTnySendQueuePrivate *priv; + g_return_val_if_fail (self, NULL); priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); - return modest_tny_account_get_special_folder (priv->account, - TNY_FOLDER_TYPE_SENT); + return modest_tny_account_get_special_folder (TNY_ACCOUNT(priv->account), + TNY_FOLDER_TYPE_SENT); } static TnyFolder* modest_tny_send_queue_get_outbox_default (TnySendQueue *self) { - ModestTnySendQueuePriv *priv; + ModestTnySendQueuePrivate *priv; g_return_val_if_fail (self, NULL); priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); - return modest_tny_account_get_special_folder (priv->account, + return modest_tny_account_get_special_folder (TNY_ACCOUNT(priv->account), TNY_FOLDER_TYPE_OUTBOX); } @@ -141,6 +205,14 @@ GType modest_tny_send_queue_get_type (void) { static GType my_type = 0; + + if (G_UNLIKELY (!camel_type_init_done)) { + if (!g_thread_supported ()) + g_thread_init (NULL); + camel_type_init (); + camel_type_init_done = TRUE; + } + if (!my_type) { static const GTypeInfo my_info = { sizeof(ModestTnySendQueueClass), @@ -151,13 +223,24 @@ modest_tny_send_queue_get_type (void) NULL, /* class data */ sizeof(ModestTnySendQueue), 1, /* n_preallocs */ - (GInstanceInitFunc) modest_tny_send_queue_init, + (GInstanceInitFunc) modest_tny_send_queue_instance_init, NULL }; - my_type = g_type_register_static (TNY__TYPE__SEND_QUEUE, - "ModestTnySendQueue", + + static const GInterfaceInfo tny_send_queue_info = { + (GInterfaceInitFunc) modest_tny_send_queue_init, + /* interface_init */ + NULL, /* interface_finalize */ + NULL /* interface_data */ + }; + + my_type = g_type_register_static (G_TYPE_OBJECT, + "ModestTnySendQueue", &my_info, 0); + g_type_add_interface_static (my_type, TNY_TYPE_SEND_QUEUE, + &tny_send_queue_info); } + return my_type; } @@ -197,24 +280,31 @@ static void modest_tny_send_queue_instance_init (GTypeInstance *instance, gpointer g_class) { ModestTnySendQueue *self; - ModestTnySendQueuePriv *priv; + ModestTnySendQueuePrivate *priv; self = (ModestTnySendQueue*)instance; priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); + priv->flush_lock = g_mutex_new (); + priv->flush_outbox_thread = NULL; priv->account = NULL; } static void modest_tny_send_queue_finalize (GObject *obj) { - ModestTnySendQueuePriv *priv; + ModestTnySendQueuePrivate *priv; priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (obj); if (priv->account) { g_object_unref (priv->account); priv->account = NULL; } + + if (priv->flush_lock) { + g_mutex_free (priv->flush_lock); + priv->flush_lock = NULL; + } G_OBJECT_CLASS(parent_class)->finalize (obj); } diff --git a/src/modest-tny-send-queue.h b/src/modest-tny-send-queue.h index c16386d..fc82ed7 100644 --- a/src/modest-tny-send-queue.h +++ b/src/modest-tny-send-queue.h @@ -31,7 +31,6 @@ #ifndef __MODEST_TNY_SEND_QUEUE_H__ #define __MODEST_TNY_SEND_QUEUE_H__ -#include #include #include #include @@ -58,10 +57,10 @@ struct _ModestTnySendQueue { struct _ModestTnySendQueueClass { GObjectClass parent_class; - void (*add_func) (TnySendQueue *self, TnyMsg *msg); - TnyFolder* (*get_sentbox_func) (TnySendQueue *self); - TnyFolder* (*get_outbox_func) (TnySendQueue *self); - void (*cancel_func) (TnySendQueue *self, gboolean remove); + void (*add_func) (TnySendQueue *self, TnyMsg *msg); + TnyFolder* (*get_sentbox_func) (TnySendQueue *self); + TnyFolder* (*get_outbox_func) (TnySendQueue *self); + void (*cancel_func) (TnySendQueue *self, gboolean remove); }; /* member functions */ @@ -69,8 +68,7 @@ GType modest_tny_send_queue_get_type (void) G_GNUC_CONST; /* typical parameter-less _new function */ /* if this is a kind of GtkWidget, it should probably return at GtkWidget* */ -ModestTnySendQueue* modest_tny_send_queue_new (TnyCamelTransportAccount *trans_account); - +ModestTnySendQueue* modest_tny_send_queue_new (TnyTransportAccount *account); G_END_DECLS