Re: New API function to remove n messages



Javier Fernandez wrote:
> El mar, 28-08-2007 a las 12:52 +0200, Javier Fernandez escribió:
>> I have implemented a new API function to remove multiple messages
>> in a single camel operation. 
>>
>> Thanks for review it.
> 
> I forgot the attachment, sorry.

The patch looks pretty good, just two questions:

1) why do you need it?
2) could you please remove the "printf" debug code ;-) ?

Br
> 
> 
> ------------------------------------------------------------------------
> 
> Index: libtinymail-camel/tny-camel-folder.c
> ===================================================================
> --- libtinymail-camel/tny-camel-folder.c	(revision 2651)
> +++ libtinymail-camel/tny-camel-folder.c	(working copy)
> @@ -1102,7 +1102,77 @@
>  	return;
>  }
>  
> +static void 
> +tny_camel_folder_remove_msgs (TnyFolder *self, TnyList *headers, GError **err)
> +{
> +	TNY_CAMEL_FOLDER_GET_CLASS (self)->remove_msgs_func (self, headers, err);
> +	return;
> +}
>  
> +static void 
> +tny_camel_folder_remove_msgs_default (TnyFolder *self, TnyList *headers, GError **err)
> +{
> +	TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self);
> +	TnyFolderChange *change = NULL;
> +	TnyIterator *iter = NULL;
> +	TnyHeader *header = NULL;
> +
> +	g_assert (TNY_IS_LIST (headers));
> +
> +	if (!_tny_session_check_operation (TNY_FOLDER_PRIV_GET_SESSION(priv), 
> +			priv->account, err, TNY_FOLDER_ERROR, 
> +			TNY_FOLDER_ERROR_REMOVE_MSGS))
> +		return;
> +
> +	if (!priv->remove_strat) {
> +		_tny_session_stop_operation (TNY_FOLDER_PRIV_GET_SESSION (priv));
> +		return;
> +	}
> +
> +	g_static_rec_mutex_lock (priv->folder_lock);
> +
> +	if (!priv->folder || !priv->loaded || !CAMEL_IS_FOLDER (priv->folder))
> +		if (!load_folder_no_lock (priv))
> +		{
> +			_tny_session_stop_operation (TNY_FOLDER_PRIV_GET_SESSION (priv));
> +			g_static_rec_mutex_unlock (priv->folder_lock);
> +			return;
> +		}
> +
> +	change = tny_folder_change_new (self);
> +	iter = tny_list_create_iterator (headers);
> +	while (!tny_iterator_is_done (iter)) {
> +		header = TNY_HEADER(tny_iterator_get_current (iter));
> +		g_assert(TNY_IS_HEADER(header));
> +
> +		/* Performs remove */
> +		tny_msg_remove_strategy_perform_remove (priv->remove_strat, self, header, err);
> +
> +		/* Add expunged headers to change event */
> +		tny_folder_change_add_expunged_header (change, header);
> +
> +		g_object_unref (header);
> +		tny_iterator_next (iter);
> +	}
> +
> +	/* Notify about unread count */
> +	_tny_camel_folder_check_unread_count (TNY_CAMEL_FOLDER (self));
> +
> +	/* Notify header has been removed */
> +	notify_folder_observers_about_in_idle (self, change);
> +
> +	/* Free */
> +	g_object_unref (change);
> +	g_object_unref (iter);
> +
> +	g_static_rec_mutex_unlock (priv->folder_lock);
> +
> +	_tny_session_stop_operation (TNY_FOLDER_PRIV_GET_SESSION (priv));
> +
> +	return;
> +}
> +
> +
>  CamelFolder*
>  _tny_camel_folder_get_camel_folder (TnyCamelFolder *self)
>  {
> @@ -5285,6 +5355,7 @@
>  	klass->refresh_async_func = tny_camel_folder_refresh_async;
>  	klass->refresh_func = tny_camel_folder_refresh;
>  	klass->remove_msg_func = tny_camel_folder_remove_msg;
> +	klass->remove_msgs_func = tny_camel_folder_remove_msgs;
>  	klass->sync_func = tny_camel_folder_sync;
>  	klass->sync_async_func = tny_camel_folder_sync_async;
>  	klass->add_msg_func = tny_camel_folder_add_msg;
> @@ -5348,6 +5419,7 @@
>  	class->refresh_async_func = tny_camel_folder_refresh_async_default;
>  	class->refresh_func = tny_camel_folder_refresh_default;
>  	class->remove_msg_func = tny_camel_folder_remove_msg_default;
> +	class->remove_msgs_func = tny_camel_folder_remove_msgs_default;
>  	class->add_msg_func = tny_camel_folder_add_msg_default;
>  	class->sync_func = tny_camel_folder_sync_default;
>  	class->sync_async_func = tny_camel_folder_sync_async_default;
> Index: libtinymail-camel/tny-camel-folder.h
> ===================================================================
> --- libtinymail-camel/tny-camel-folder.h	(revision 2651)
> +++ libtinymail-camel/tny-camel-folder.h	(working copy)
> @@ -54,6 +54,7 @@
>  
>  	/* virtual methods */
>  	void (*remove_msg_func) (TnyFolder *self, TnyHeader *header, GError **err);
> +	void (*remove_msgs_func) (TnyFolder *self, TnyList *headers, GError **err);
>  	void (*add_msg_func) (TnyFolder *self, TnyMsg *msg, GError **err);
>  	void (*add_msg_async_func) (TnyFolder *self, TnyMsg *msg, TnyFolderCallback callback, TnyStatusCallback status_callback, gpointer user_data);
>  	void (*sync_func) (TnyFolder *self, gboolean expunge, GError **err);
> Index: libtinymail-camel/camel-lite/camel/camel-folder.c
> ===================================================================
> --- libtinymail-camel/camel-lite/camel/camel-folder.c	(revision 2651)
> +++ libtinymail-camel/camel-lite/camel/camel-folder.c	(working copy)
> @@ -1458,6 +1458,9 @@
>  		if (transferred_uids)
>  			ret_uid = (char **)&((*transferred_uids)->pdata[i]);
>  		transfer_message_to (source, uids->pdata[i], dest, ret_uid, delete_originals, ex);
> +
> +		printf ("debug: %s:\n  progress changed (%i/%i) : %i\n", __FUNCTION__, i, uids->len);
> +
>  		camel_operation_progress(NULL, i , uids->len);
>  	}
>  	if (uids->len > 1) {
> Index: libtinymail/tny-error.c
> ===================================================================
> --- libtinymail/tny-error.c	(revision 2651)
> +++ libtinymail/tny-error.c	(working copy)
> @@ -69,6 +69,7 @@
>        { TNY_ERROR_UNSPEC, "TNY_ERROR_UNSPEC", "error_unspec" },
>        { TNY_FOLDER_ERROR_SYNC, "TNY_FOLDER_ERROR_SYNC", "folder_error_sync" },
>        { TNY_FOLDER_ERROR_REMOVE_MSG, "TNY_FOLDER_ERROR_REMOVE_MSG", "folder_error_remove_msg" },
> +      { TNY_FOLDER_ERROR_REMOVE_MSGS, "TNY_FOLDER_ERROR_REMOVE_MSGS", "folder_error_remove_msgs" },
>        { TNY_FOLDER_ERROR_ADD_MSG, "TNY_FOLDER_ERROR_ADD_MSG", "folder_error_add_msg" },
>        { TNY_FOLDER_ERROR_REFRESH, "TNY_FOLDER_ERROR_REFRESH", "folder_error_refresh" },
>        { TNY_FOLDER_ERROR_GET_MSG, "TNY_FOLDER_ERROR_GET_MSG", "folder_error_get_msg" },
> Index: libtinymail/tny-enums.h
> ===================================================================
> --- libtinymail/tny-enums.h	(revision 2651)
> +++ libtinymail/tny-enums.h	(working copy)
> @@ -96,6 +96,8 @@
>  	TNY_SEND_QUEUE_ERROR_ADD = 17,
>  
>  	TNY_ACCOUNT_STORE_ERROR_CANCEL_ALERT = 18,
> +
> +	TNY_FOLDER_ERROR_REMOVE_MSGS = 19,
>  } TnyError;
>  
>  typedef enum  {
> Index: libtinymail/tny-error.h
> ===================================================================
> --- libtinymail/tny-error.h	(revision 2651)
> +++ libtinymail/tny-error.h	(working copy)
> @@ -127,6 +127,7 @@
>  
>  	TNY_ACCOUNT_STORE_ERROR_CANCEL_ALERT = 18,
>  
> +	TNY_FOLDER_ERROR_REMOVE_MSGS = 19,
>  };
>  
>  GType tny_error_domain_get_type (void);
> Index: libtinymail/tny-folder.c
> ===================================================================
> --- libtinymail/tny-folder.c	(revision 2651)
> +++ libtinymail/tny-folder.c	(working copy)
> @@ -711,7 +711,36 @@
>  	return;
>  }
>  
> +/**
> + * tny_folder_remove_msgs:
> + * @self: a TnyFolder object
> + * @headers: the headers of the messages to remove
> + * @err: a #GError object or NULL
> + *
> + * Remove messages from a folder. It will use a #TnyMsgRemoveStrategy to 
> + * perform the removal itself. For more details, check out the documentation
> + * of the #TnyMsgRemoveStrategy type and the implementation that you activated
> + * using tny_folder_set_msg_remove_strategy. The default implementation for
> + * libtinymail-camel is the #TnyCamelMsgRemoveStrategy.
> + *
> + * Folder observers of @self will get only one header-removed trigger caused by this
> + * action.
> + *
> + */
> +void 
> +tny_folder_remove_msgs (TnyFolder *self, TnyList *headers, GError **err)
> +{
> +#ifdef DBC /* require */
> +	g_assert (TNY_IS_FOLDER (self));
> +	g_assert (headers);
> +	g_assert (TNY_IS_LIST (headers));
> +	g_assert (TNY_FOLDER_GET_IFACE (self)->remove_msgs_func != NULL);
> +#endif
>  
> +	TNY_FOLDER_GET_IFACE (self)->remove_msgs_func (self, headers, err);
> +	return;
> +}
> +
>  /**
>   * tny_folder_refresh_async:
>   * @self: a TnyFolder object
> Index: libtinymail/tny-folder.h
> ===================================================================
> --- libtinymail/tny-folder.h	(revision 2651)
> +++ libtinymail/tny-folder.h	(working copy)
> @@ -89,6 +89,7 @@
>  	
>  	/* Methods */
>  	void (*remove_msg_func) (TnyFolder *self, TnyHeader *header, GError **err);
> +	void (*remove_msgs_func) (TnyFolder *self, TnyList *headers, GError **err);
>  	void (*add_msg_func) (TnyFolder *self, TnyMsg *msg, GError **err);
>  	void (*add_msg_async_func) (TnyFolder *self, TnyMsg *msg, TnyFolderCallback callback, TnyStatusCallback status_callback, gpointer user_data);
>  	void (*sync_func) (TnyFolder *self, gboolean expunge, GError **err);
> @@ -133,6 +134,7 @@
>  TnyMsgReceiveStrategy* tny_folder_get_msg_receive_strategy (TnyFolder *self);
>  void tny_folder_set_msg_receive_strategy (TnyFolder *self, TnyMsgReceiveStrategy *st);
>  void tny_folder_remove_msg (TnyFolder *self, TnyHeader *header, GError **err);
> +void tny_folder_remove_msgs (TnyFolder *self, TnyList *headers, GError **err);
>  void tny_folder_remove_msg_async (TnyFolder *self, TnyHeader *header, GError **err);
>  void tny_folder_add_msg (TnyFolder *self, TnyMsg *msg, GError **err);
>  void tny_folder_add_msg_async (TnyFolder *self, TnyMsg *msg, TnyFolderCallback callback, TnyStatusCallback status_callback, gpointer user_data);
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> tinymail-devel-list mailing list
> tinymail-devel-list gnome org
> http://mail.gnome.org/mailman/listinfo/tinymail-devel-list




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]