X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-mail-operation-queue.c;h=cf536b92ab2a8d7c81feed0113a2eeb996a4188a;hb=ef5e8a9c2833563badae9493c4a410c073ecaae7;hp=d4e0c01c554a43c6a23d921c539ff1e7f99eb2e8;hpb=3084439a659fa9aec750337f94cad4bca0c92898;p=modest diff --git a/src/modest-mail-operation-queue.c b/src/modest-mail-operation-queue.c index d4e0c01..cf536b9 100644 --- a/src/modest-mail-operation-queue.c +++ b/src/modest-mail-operation-queue.c @@ -28,16 +28,15 @@ */ #include "config.h" +#include "modest-marshal.h" #include "modest-mail-operation-queue.h" +#include "modest-runtime.h" /* 'private'/'protected' functions */ static void modest_mail_operation_queue_class_init (ModestMailOperationQueueClass *klass); static void modest_mail_operation_queue_init (ModestMailOperationQueue *obj); static void modest_mail_operation_queue_finalize (GObject *obj); -static GObject *modest_mail_operation_queue_constructor (GType type, guint n_construct_params, - GObjectConstructParam *construct_params); - static void modest_mail_operation_queue_cancel_no_block_wrapper (ModestMailOperation *mail_op, ModestMailOperationQueue *op_queue); @@ -46,9 +45,8 @@ static void modest_mail_operation_queue_cancel_no_block (ModestMailOpera /* list my signals */ enum { - /* MY_SIGNAL_1, */ - /* MY_SIGNAL_2, */ - LAST_SIGNAL + QUEUE_CHANGED_SIGNAL, + NUM_SIGNALS }; typedef struct _ModestMailOperationQueuePrivate ModestMailOperationQueuePrivate; @@ -61,10 +59,8 @@ struct _ModestMailOperationQueuePrivate { ModestMailOperationQueuePrivate)) /* globals */ static GObjectClass *parent_class = NULL; -static ModestMailOperationQueue *singleton = NULL; -/* uncomment the following if you have defined any signals */ -/* static guint signals[LAST_SIGNAL] = {0}; */ +static guint signals[NUM_SIGNALS] = {0}; GType modest_mail_operation_queue_get_type (void) @@ -100,9 +96,26 @@ modest_mail_operation_queue_class_init (ModestMailOperationQueueClass *klass) parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = modest_mail_operation_queue_finalize; - gobject_class->constructor = modest_mail_operation_queue_constructor; g_type_class_add_private (gobject_class, sizeof(ModestMailOperationQueuePrivate)); + + /** + * ModestMailOperationQueue::queue-changed + * @self: the #ModestMailOperationQueue that emits the signal + * @mail_op: the #ModestMailOperation affected + * @type: the type of change in the queue + * @user_data: user data set when the signal handler was connected + * + * Emitted whenever the contents of the queue change + */ + signals[QUEUE_CHANGED_SIGNAL] = + g_signal_new ("queue-changed", + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (ModestMailOperationQueueClass, queue_changed), + NULL, NULL, + modest_marshal_VOID__POINTER_INT, + G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_INT); } static void @@ -116,25 +129,6 @@ modest_mail_operation_queue_init (ModestMailOperationQueue *obj) priv->queue_lock = g_mutex_new (); } -static GObject* -modest_mail_operation_queue_constructor (GType type, guint n_construct_params, - GObjectConstructParam *construct_params) -{ - GObject *object; - - if (!singleton) { - object = G_OBJECT_CLASS (parent_class)->constructor (type, - n_construct_params, construct_params); - - singleton = MODEST_MAIL_OPERATION_QUEUE (object); - } else { - object = G_OBJECT (singleton); - g_object_freeze_notify (G_OBJECT (singleton)); - } - - return object; -} - static void modest_mail_operation_queue_finalize (GObject *obj) { @@ -157,7 +151,7 @@ modest_mail_operation_queue_finalize (GObject *obj) } ModestMailOperationQueue * -modest_mail_operation_queue_get_instance (void) +modest_mail_operation_queue_new (void) { ModestMailOperationQueue *self = g_object_new (MODEST_TYPE_MAIL_OPERATION_QUEUE, NULL); @@ -165,96 +159,111 @@ modest_mail_operation_queue_get_instance (void) } void -modest_mail_operation_queue_add (ModestMailOperationQueue *op_queue, +modest_mail_operation_queue_add (ModestMailOperationQueue *self, ModestMailOperation *mail_op) { ModestMailOperationQueuePrivate *priv; - if (!MODEST_IS_MAIL_OPERATION (mail_op) || - !MODEST_IS_MAIL_OPERATION_QUEUE (op_queue)) { - g_warning ("%s: bad parametters", G_GNUC_FUNCTION); - return; - } - - priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(op_queue); + g_return_if_fail (MODEST_IS_MAIL_OPERATION_QUEUE (self)); + g_return_if_fail (MODEST_IS_MAIL_OPERATION (mail_op)); + + priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(self); g_mutex_lock (priv->queue_lock); g_queue_push_tail (priv->op_queue, g_object_ref (mail_op)); g_mutex_unlock (priv->queue_lock); + + /* Notify observers */ + g_signal_emit (self, signals[QUEUE_CHANGED_SIGNAL], 0, + mail_op, MODEST_MAIL_OPERATION_QUEUE_OPERATION_ADDED); } void -modest_mail_operation_queue_remove (ModestMailOperationQueue *op_queue, +modest_mail_operation_queue_remove (ModestMailOperationQueue *self, ModestMailOperation *mail_op) { ModestMailOperationQueuePrivate *priv; - if (!MODEST_IS_MAIL_OPERATION (mail_op) || - !MODEST_IS_MAIL_OPERATION_QUEUE (op_queue)) { - g_warning ("%s: invalid paramette", G_GNUC_FUNCTION); - return; - } + g_return_if_fail (MODEST_IS_MAIL_OPERATION_QUEUE (self)); + g_return_if_fail (MODEST_IS_MAIL_OPERATION (mail_op)); - priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(op_queue); + priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(self); g_mutex_lock (priv->queue_lock); g_queue_remove (priv->op_queue, mail_op); g_mutex_unlock (priv->queue_lock); + /* HACK see the documentation of the function. Remove this + call when tinymail provides accurate progress values */ + _modest_mail_operation_notify_end (mail_op); + + /* Notify observers */ + g_signal_emit (self, signals[QUEUE_CHANGED_SIGNAL], 0, + mail_op, MODEST_MAIL_OPERATION_QUEUE_OPERATION_REMOVED); + + /* TODO: errors? */ + { + const GError *err = modest_mail_operation_get_error (mail_op); + if (err) + g_warning (err->message); + } + + /* Free object */ g_object_unref (G_OBJECT (mail_op)); + modest_runtime_verify_object_death (mail_op, ""); } /* Utility function intended to be used with g_queue_foreach */ static void -modest_mail_operation_queue_cancel_no_block_wrapper (ModestMailOperation *mail_op, +modest_mail_operation_queue_cancel_no_block_wrapper (ModestMailOperation *self, ModestMailOperationQueue *op_queue) { - modest_mail_operation_queue_cancel_no_block (op_queue, mail_op); + modest_mail_operation_queue_cancel_no_block (op_queue, self); } static void -modest_mail_operation_queue_cancel_no_block (ModestMailOperationQueue *op_queue, +modest_mail_operation_queue_cancel_no_block (ModestMailOperationQueue *self, ModestMailOperation *mail_op) { - /* TODO: place here the cancel code */ + if (modest_mail_operation_is_finished (mail_op)) + return; + + /* TODO: the implementation is still empty */ + modest_mail_operation_cancel (mail_op); + + /* Remove from the queue */ + modest_mail_operation_queue_remove (self, mail_op); } void -modest_mail_operation_queue_cancel (ModestMailOperationQueue *op_queue, +modest_mail_operation_queue_cancel (ModestMailOperationQueue *self, ModestMailOperation *mail_op) { ModestMailOperationQueuePrivate *priv; - GList *iter; - if (!MODEST_IS_MAIL_OPERATION (mail_op) || - !MODEST_IS_MAIL_OPERATION_QUEUE (op_queue)) { - g_warning ("%s: invalid paramette", G_GNUC_FUNCTION); - return; - } + g_return_if_fail (MODEST_IS_MAIL_OPERATION_QUEUE (self)); + g_return_if_fail (MODEST_IS_MAIL_OPERATION (mail_op)); - priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(op_queue); + priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(self); g_mutex_lock (priv->queue_lock); - modest_mail_operation_queue_cancel_no_block (op_queue, mail_op); + modest_mail_operation_queue_cancel_no_block (self, mail_op); g_mutex_unlock (priv->queue_lock); } void -modest_mail_operation_queue_cancel_all (ModestMailOperationQueue *op_queue) +modest_mail_operation_queue_cancel_all (ModestMailOperationQueue *self) { ModestMailOperationQueuePrivate *priv; - if (!MODEST_IS_MAIL_OPERATION_QUEUE (op_queue)) { - g_warning ("%s: invalid paramette", G_GNUC_FUNCTION); - return; - } + g_return_if_fail (MODEST_IS_MAIL_OPERATION_QUEUE (self)); - priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(op_queue); + priv = MODEST_MAIL_OPERATION_QUEUE_GET_PRIVATE(self); g_mutex_lock (priv->queue_lock); g_queue_foreach (priv->op_queue, (GFunc) modest_mail_operation_queue_cancel_no_block_wrapper, - op_queue); + self); g_mutex_unlock (priv->queue_lock); }