typedef struct {
GetMsgAsyncUserCallback user_callback;
TnyHeader *header;
+ TnyList *header_list;
+ TnyIterator *iter;
gpointer user_data;
ModestMailOperation *mail_op;
GDestroyNotify destroy_notify;
static void
tny_folder_observer_init (TnyFolderObserverIface *iface)
{
- iface->update_func = internal_folder_observer_update;
+ iface->update = internal_folder_observer_update;
}
static void
internal_folder_observer_class_init (InternalFolderObserverClass *klass)
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (info->mail_op);
priv->done++;
- finished = (priv->done == priv->total) ? TRUE : FALSE;
+
+ if (info->iter) {
+ tny_iterator_next (info->iter);
+ finished = (tny_iterator_is_done (info->iter));
+ } else {
+ finished = (priv->done == priv->total) ? TRUE : FALSE;
+ }
/* Check errors */
if (canceled || err) {
g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
err->message);
- } else {
+ } else if (finished && priv->status == MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS) {
/* Set the success status before calling the user callback */
- if (finished && priv->status == MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS)
- priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+ priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+ } else if (priv->status == MODEST_MAIL_OPERATION_STATUS_CANCELED) {
+ canceled = TRUE;
+ finished = TRUE;
}
/* Notify about operation end */
modest_mail_operation_notify_end (info->mail_op);
- }
- /* Clean */
- g_object_unref (info->header);
- g_object_unref (info->mail_op);
- g_slice_free (GetMsgInfo, info);
+ /* Clean */
+ if (info->iter)
+ g_object_unref (info->iter);
+ if (info->header_list)
+ g_object_unref (info->header_list);
+ g_object_unref (info->header);
+ g_object_unref (info->mail_op);
+ g_slice_free (GetMsgInfo, info);
+ } else if (info->iter) {
+ TnyHeader *header = TNY_HEADER (tny_iterator_get_current (info->iter));
+ TnyFolder *folder = tny_header_get_folder (header);
+
+ g_object_unref (info->header);
+ info->header = g_object_ref (header);
+
+ /* Retrieve the next message */
+ tny_folder_get_msg_async (folder, header, get_msg_async_cb, get_msg_status_cb, info);
+
+ g_object_unref (header);
+ g_object_unref (folder);
+ } else {
+ g_warning ("%s: finished != TRUE but no messages left", __FUNCTION__);
+ }
}
void
modest_mail_operation_notify_start (self);
iter = tny_list_create_iterator (header_list);
- while (!tny_iterator_is_done (iter)) {
+ if (!tny_iterator_is_done (iter)) {
/* notify about the start of the operation */
ModestMailOperationState *state;
state = modest_mail_operation_clone_state (self);
msg_info = g_slice_new0 (GetMsgInfo);
msg_info->mail_op = g_object_ref (self);
msg_info->header = g_object_ref (header);
+ msg_info->header_list = g_object_ref (header_list);
+ msg_info->iter = g_object_ref (iter);
msg_info->user_callback = user_callback;
msg_info->user_data = user_data;
msg_info->destroy_notify = notify;
/* Free and go on */
g_object_unref (header);
g_object_unref (folder);
- tny_iterator_next (iter);
+ g_slice_free (ModestMailOperationState, state);
}
g_object_unref (iter);
}