a3fac9c0851225ae9b89964a822ba0e14c509da2
[modest] / src / modest-mail-operation.h
1 /* Copyright (c) 2006, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  *   notice, this list of conditions and the following disclaimer in the
12  *   documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Nokia Corporation nor the names of its
14  *   contributors may be used to endorse or promote products derived from
15  *   this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #ifndef __MODEST_MAIL_OPERATION_H__
31 #define __MODEST_MAIL_OPERATION_H__
32
33 #include <tny-transport-account.h>
34 #include <tny-folder-store.h>
35 #include <widgets/modest-msg-edit-window.h>
36
37 G_BEGIN_DECLS
38
39 /* convenience macros */
40 #define MODEST_TYPE_MAIL_OPERATION             (modest_mail_operation_get_type())
41 #define MODEST_MAIL_OPERATION(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_MAIL_OPERATION,ModestMailOperation))
42 #define MODEST_MAIL_OPERATION_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_MAIL_OPERATION,GObject))
43 #define MODEST_IS_MAIL_OPERATION(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_MAIL_OPERATION))
44 #define MODEST_IS_MAIL_OPERATION_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_MAIL_OPERATION))
45 #define MODEST_MAIL_OPERATION_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_MAIL_OPERATION,ModestMailOperationClass))
46
47 typedef struct _ModestMailOperation      ModestMailOperation;
48 typedef struct _ModestMailOperationClass ModestMailOperationClass;
49
50 /**
51  * ModestMailOperationStatus:
52  *
53  * The state of a mail operation
54  */
55 typedef enum _ModestMailOperationStatus {
56         MODEST_MAIL_OPERATION_STATUS_INVALID,
57         MODEST_MAIL_OPERATION_STATUS_SUCCESS,
58         MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS,
59         MODEST_MAIL_OPERATION_STATUS_FAILED,
60         MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS,
61         MODEST_MAIL_OPERATION_STATUS_CANCELED
62 } ModestMailOperationStatus;
63
64 /**
65  * ModestMailOperationId:
66  *
67  * The id for identifying the type of mail operation
68  */
69 typedef enum {
70         MODEST_MAIL_OPERATION_TYPE_SEND,
71         MODEST_MAIL_OPERATION_TYPE_RECEIVE,
72         MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE,
73         MODEST_MAIL_OPERATION_TYPE_SEND,
74         MODEST_MAIL_OPERATION_TYPE_OPEN,
75         MODEST_MAIL_OPERATION_TYPE_DELETE,
76         MODEST_MAIL_OPERATION_TYPE_INFO,
77         MODEST_MAIL_OPERATION_TYPE_UNKNOWN,
78 } ModestMailOperationTypeOperation;
79
80 /**
81  * ErrorCheckingUserCallback:
82  *
83  * @mail_op: the current mail operation.
84  * @user_data: generic data passed to user defined function.
85  *
86  * This function implements required actions to performs under error
87  * states.  
88  */
89 typedef void (*ErrorCheckingUserCallback) (ModestMailOperation *mail_op, gpointer user_data);
90
91 /**
92  * ErrorCheckingUserDataDestroyer:
93  *
94  * @user_data: generic data passed to user defined function.
95  *
96  * This function is used to destroy the user_data passed to the error
97  * checking user callback function
98  */
99 typedef void (*ErrorCheckingUserDataDestroyer) (gpointer user_data);
100
101
102 /**
103  * GetMsgAsyncUserCallback:
104  *
105  * @mail_op: the current #ModestMailOperation.
106  * @header: a #TnyHeader summary item.
107  * @msg: a #TnyMsg message retrieved by async operation.
108  * @user_data: generic data passed to user defined function.
109  *
110  * This function will be called after get_msg_cb private function, which is
111  * used as tinymail operation callback. The private function fills private 
112  * fields of mail operation and calls user defined callback if it exists.
113  */
114 typedef void (*GetMsgAsyncUserCallback) (ModestMailOperation *mail_op, 
115                                          TnyHeader *header, 
116                                          gboolean canceled, 
117                                          TnyMsg *msg, 
118                                          GError *err,
119                                          gpointer user_data);
120
121 /**
122  * GetMimePartSizeCallback:
123  *
124  * @mail_op: the current #ModestMailOperation.
125  * @size: size of the attachment
126  * @user_data: generic data passed to user defined function.
127  *
128  */
129 typedef void (*GetMimePartSizeCallback) (ModestMailOperation *mail_op, 
130                                          gssize size,
131                                          gpointer user_data);
132
133 /**
134  * XferMsgsAsyncUserCallback:
135  *
136  * @obj: a #GObject generic object which has created current mail operation.
137  * @new_folder: the new instance of the #TnyFolder that has been transferred
138  * @user_data: generic data passed to user defined function.
139  *
140  * This function will be called after transfer_msgs_cb private function, which is
141  * used as tinymail operation callback. The private function fills private 
142  * fields of mail operation and calls user defined callback if it exists.
143  */
144 typedef void (*XferMsgsAsyncUserCallback) (ModestMailOperation *mail_op, 
145                                            gpointer user_data);
146
147
148 /**
149  * XferFolderAsyncUserCallback:
150  *
151  * @obj: a #GObject generic object which has created current mail operation.
152  * @new_folder: the new instance of the #TnyFolder that has been transferred
153  * @user_data: generic data passed to user defined function.
154  *
155  * This function will be called after transfer_msgs_cb private function, which is
156  * used as tinymail operation callback. The private function fills private 
157  * fields of mail operation and calls user defined callback if it exists.
158  */
159 typedef void (*XferFolderAsyncUserCallback) (ModestMailOperation *mail_op, 
160                                              TnyFolder *new_folder,
161                                              gpointer user_data);
162
163
164 /**
165  * RefreshAsyncUserCallback:
166  *
167  * @mail_op: the current #ModestMailOperation.
168  * @folder: a #TnyFolder which has been refreshed .
169  * @user_data: generic data passed to user defined function.
170  *
171  * This function will be called after refresh_folder_async_cb private function, which is
172  * used as tinymail operation callback. The private function fills private 
173  * fields of mail operation and calls user defined callback if it exists.
174  */
175 typedef void (*RefreshAsyncUserCallback) (ModestMailOperation *mail_op, 
176                                           TnyFolder *folder, 
177                                           gpointer user_data);
178
179 /**
180  * UpdateAccountCallback:
181  *
182  * @self: a #ModestMailOperation
183  * @new_headers: the list of new headers received
184  * @user_data: generic data passed to user defined function.
185  *
186  * This is the callback of the update_account operation. It informs
187  * the caller about the amount of new messages that have been
188  * downloaded
189  */
190 typedef void (*UpdateAccountCallback) (ModestMailOperation *self, 
191                                        TnyList *new_headers,
192                                        gpointer user_data);
193
194 /**
195  * SaveToDraftsCallback:
196  *
197  * @self: a #ModestMailOperation
198  * @saved_draft: the new draft message that has been saved
199  * @user_data: generic data passed to user defined function.
200  *
201  * This is the callback of the save_to_drafts operation. It returns
202  * the newly created msg stored in the Drafts folder
203  */
204 typedef void (*SaveToDraftstCallback) (ModestMailOperation *self, 
205                                        TnyMsg *saved_draft,
206                                        gpointer user_data);
207
208
209 typedef gboolean (*RetrieveAllCallback) (GObject *source,
210                                          guint num_msgs,
211                                          guint limit);
212
213 /**
214  * CreateFolderUserCallback:
215  *
216  * @mail_op: the current #ModestMailOperation.
217  * @folder: a #TnyFolder summary item.
218  * @user_data: generic data passed to user defined function.
219  *
220  * This function will be called after get_msg_cb private function, which is
221  * used as tinymail operation callback. The private function fills private 
222  * fields of mail operation and calls user defined callback if it exists.
223  */
224 typedef void (*CreateFolderUserCallback) (ModestMailOperation *mail_op, 
225                                           TnyFolderStore *parent_folder,
226                                           TnyFolder *new_folder, 
227                                           gpointer user_data);
228
229 /* This struct represents the internal state of a mail operation in a
230    given time */
231 typedef struct {
232         guint      done;
233         guint      total;
234         gdouble    bytes_done;
235         gdouble    bytes_total;
236         gboolean   finished;
237         ModestMailOperationStatus        status;
238         ModestMailOperationTypeOperation op_type;
239 } ModestMailOperationState;
240
241
242 struct _ModestMailOperation {
243          GObject parent;
244         /* insert public members, if any */
245 };
246
247 struct _ModestMailOperationClass {
248         GObjectClass parent_class;
249
250         /* Signals */
251         void (*progress_changed) (ModestMailOperation *self, ModestMailOperationState *state, gpointer user_data);
252         void (*operation_started) (ModestMailOperation *self, gpointer user_data);
253         void (*operation_finished) (ModestMailOperation *self, gpointer user_data);
254 };
255
256 /* member functions */
257 GType        modest_mail_operation_get_type    (void) G_GNUC_CONST;
258
259 /**
260  * modest_mail_operation_new:
261  * @source: a #GObject which creates this new operation.
262  * 
263  * Creates a new instance of class #ModestMailOperation, using parameters
264  * to initialize its private structure. @source parameter may be NULL.
265  **/
266 ModestMailOperation*    modest_mail_operation_new     (GObject *source);
267
268 /**
269  * modest_mail_operation_new_with_error_handling:
270  * @id: a #ModestMailOperationId identification of operation type.
271  * @source: a #GObject which creates this new operation.
272  * @error_handler: a #ErrorCheckingUserCallback function to performs operations when 
273  * an error occurs.
274  * 
275  * Creates a new instance of class #ModestMailOperation, using parameters
276  * to initialize its private structure. @source parameter may be NULL. 
277  * @error_handler can not be NULL, but it will be returned an mail operation
278  * object without error handling capability.
279  **/
280 ModestMailOperation*    modest_mail_operation_new_with_error_handling     (GObject *source,
281                                                                            ErrorCheckingUserCallback error_handler,
282                                                                            gpointer user_data,
283                                                                            ErrorCheckingUserDataDestroyer error_handler_destroyer);
284 /**
285  * modest_mail_operation_execute_error_handler
286  * @self: a #ModestMailOperation
287  * 
288  * Executes error handler if exists. The error handler is the one that
289  * MUST free the user data passed to the
290  * modest_mail_operation_new_with_error_handling constructor
291  **/
292 void
293 modest_mail_operation_execute_error_handler (ModestMailOperation *self);
294
295 /**
296  * modest_mail_operation_get_type_operation
297  * @self: a #ModestMailOperation
298  * 
299  * Gets the private op_type field of mail operation. This op_type
300  * identifies the class/type of mail operation.
301  **/
302 ModestMailOperationTypeOperation
303 modest_mail_operation_get_type_operation (ModestMailOperation *self);
304
305 /**
306  * modest_mail_operation_is_mine
307  * @self: a #ModestMailOperation
308  * @source: a #GObject to check if it have created @self operation.
309  * 
310  * Check if @source object its owner of @self mail operation.
311  *
312  * returns: TRUE if source its owner, FALSE otherwise.
313  **/
314 gboolean 
315 modest_mail_operation_is_mine (ModestMailOperation *self, 
316                                GObject *me);
317
318 /**
319  * modest_mail_operation_get_source
320  * @self: a #ModestMailOperation
321  *
322  * returns a new reference to the object that created the mail
323  * operation passed to the constructor, or NULL if none. The caller
324  * must free the new reference
325  **/
326 GObject *
327 modest_mail_operation_get_source (ModestMailOperation *self);
328
329 /* fill in other public functions, eg.: */
330
331 /**
332  * modest_mail_operation_send_mail:
333  * @self: a #ModestMailOperation
334  * @transport_account: a non-NULL #TnyTransportAccount
335  * @msg: a non-NULL #TnyMsg
336  * 
337  * Sends and already existing message using the provided
338  * #TnyTransportAccount. This operation is synchronous, so the
339  * #ModestMailOperation should not be added to any
340  * #ModestMailOperationQueue
341   **/
342 void    modest_mail_operation_send_mail       (ModestMailOperation *self,
343                                                TnyTransportAccount *transport_account,
344                                                TnyMsg* msg);
345
346 /**
347  * modest_mail_operation_send_new_mail:
348  * @self: a #ModestMailOperation
349  * @transport_account: a non-NULL #TnyTransportAccount
350  * @draft_msg: a #TnyMsg of the origin draft message, if any
351  * @from: the email address of the mail sender
352  * @to: a non-NULL email address of the mail receiver
353  * @cc: a comma-separated list of email addresses where to send a carbon copy
354  * @bcc: a comma-separated list of email addresses where to send a blind carbon copy
355  * @subject: the subject of the new mail
356  * @plain_body: the plain text body of the new mail.
357  * @html_body: the html version of the body of the new mail. If NULL, the mail will
358  *             be sent with the plain body only.
359  * @attachments_list: a #GList of attachments, each attachment must be a #TnyMimePart
360  * @images_list: a #GList of image attachments, each attachment must be a #TnyMimePart
361  * 
362  * Sends a new mail message using the provided
363  * #TnyTransportAccount. This operation is synchronous, so the
364  * #ModestMailOperation should not be added to any
365  * #ModestMailOperationQueue
366   **/
367 void    modest_mail_operation_send_new_mail   (ModestMailOperation *self,
368                                                TnyTransportAccount *transport_account,
369                                                TnyMsg *draft_msg,
370                                                const gchar *from,
371                                                const gchar *to,
372                                                const gchar *cc,
373                                                const gchar *bcc,
374                                                const gchar *subject,
375                                                const gchar *plain_body,
376                                                const gchar *html_body,
377                                                const GList *attachments_list,
378                                                const GList *images_list,
379                                                TnyHeaderFlags priority_flags);
380
381
382 /**
383  * modest_mail_operation_save_to_drafts:
384  * @self: a #ModestMailOperation
385  * @transport_account: a non-NULL #TnyTransportAccount
386  * @draft_msg: the previous draft message, in case it's an update
387  * to an existing draft.
388  * @from: the email address of the mail sender
389  * @to: a non-NULL email address of the mail receiver
390  * @cc: a comma-separated list of email addresses where to send a carbon copy
391  * @bcc: a comma-separated list of email addresses where to send a blind carbon copy
392  * @subject: the subject of the new mail
393  * @plain_body: the plain text body of the new mail.
394  * @html_body: the html version of the body of the new mail. If NULL, the mail will
395  *             be sent with the plain body only.
396  * @attachments_list: a #GList of attachments, each attachment must be a #TnyMimePart
397  * @images_list: a #GList of image attachments, each attachment must be a #TnyMimePart
398  * @callback: the user callback, will be called when the operation finishes
399  * @user_data: data that will be passed to the user callback
400  *
401  * Save a mail message to drafts using the provided
402  * #TnyTransportAccount. This operation is asynchronous.
403  *
404   **/
405 void modest_mail_operation_save_to_drafts   (ModestMailOperation *self,
406                                              TnyTransportAccount *transport_account,
407                                              TnyMsg *draft_msg,
408                                              const gchar *from,
409                                              const gchar *to,
410                                              const gchar *cc,
411                                              const gchar *bcc,
412                                              const gchar *subject,
413                                              const gchar *plain_body,
414                                              const gchar *html_body,
415                                              const GList *attachments_list,
416                                              const GList *images_list,
417                                              TnyHeaderFlags priority_flags,
418                                              SaveToDraftstCallback callback,
419                                              gpointer user_data);
420 /**
421  * modest_mail_operation_update_account:
422  * @self: a #ModestMailOperation
423  * @account_name: the id of a Modest account
424  * @poke_all: if TRUE it will also do a poke_status over all folders of the account
425  * 
426  * Asynchronously refreshes the root folders of the given store
427  * account. The caller should add the #ModestMailOperation to a
428  * #ModestMailOperationQueue and then free it. The caller will be
429  * notified by the "progress_changed" signal each time the progress of
430  * the operation changes.
431  *
432  * Example
433  * <informalexample><programlisting>
434  * queue = modest_tny_platform_factory_get_modest_mail_operation_queue_instance (fact)
435  * mail_op = modest_mail_operation_new ();
436  * g_signal_connect (G_OBJECT (mail_op), "progress_changed", G_CALLBACK(on_progress_changed), NULL);
437  * modest_mail_operation_queue_add (queue, mail_op);
438  * modest_mail_operation_update_account (mail_op, account_name)
439  * g_object_unref (G_OBJECT (mail_op));
440  * </programlisting></informalexample>
441  *
442  * Note that the account_name *MUST* be a modest account name, not a
443  * tinymail store account name
444  * 
445  **/
446 void          modest_mail_operation_update_account (ModestMailOperation *self,
447                                                     const gchar *account_name,
448                                                     gboolean poke_all,
449                                                     RetrieveAllCallback retrieve_all_cb,
450                                                     UpdateAccountCallback callback,
451                                                     gpointer user_data);
452
453 /* Functions that perform store operations */
454
455 /**
456  * modest_mail_operation_create_folder:
457  * @self: a #ModestMailOperation
458  * @parent: the #TnyFolderStore which is the parent of the new folder
459  * @name: the non-NULL new name for the new folder
460  * 
461  * Creates a new folder as a children of a existing one. If the store
462  * account supports subscriptions this method also sets the new folder
463  * as subscribed. This operation is synchronous, so the
464  * #ModestMailOperation should not be added to any
465  * #ModestMailOperationQueue
466  * 
467  * Returns: a newly created #TnyFolder or NULL in case of error.
468  **/
469 void    modest_mail_operation_create_folder  (ModestMailOperation *self,
470                                               TnyFolderStore *parent,
471                                               const gchar *name,
472                                               CreateFolderUserCallback callback,
473                                               gpointer user_data);
474
475 /**
476  * modest_mail_operation_remove_folder:
477  * @self: a #ModestMailOperation
478  * @folder: a #TnyFolder
479  * @remove_to_trash: TRUE to move it to trash or FALSE to delete
480  * permanently
481  * 
482  * Removes a folder. This operation is synchronous, so the
483  * #ModestMailOperation should not be added to any
484  * #ModestMailOperationQueue
485  **/
486 void          modest_mail_operation_remove_folder  (ModestMailOperation *self,
487                                                     TnyFolder *folder,
488                                                     gboolean remove_to_trash);
489
490 /**
491  * modest_mail_operation_rename_folder:
492  * @self: a #ModestMailOperation
493  * @folder: a #TnyFolder
494  * @name: a non-NULL name without "/"
495  * 
496  * Renames a given folder with the provided new name. This operation
497  * is synchronous, so the #ModestMailOperation should not be added to
498  * any #ModestMailOperationQueue
499  **/
500 void          modest_mail_operation_rename_folder  (ModestMailOperation *self,
501                                                     TnyFolder *folder, 
502                                                     const gchar *name,
503                                                     XferFolderAsyncUserCallback user_callback,
504                                                     gpointer user_data);
505
506 /**
507  * modest_mail_operation_xfer_folder:
508  * @self: a #ModestMailOperation
509  * @folder: a #TnyFolder
510  * @parent: the new parent of the folder as #TnyFolderStore
511  * @delete_original: wheter or not delete the original folder
512  * @user_callback: a #XferFolderAsyncUserCallback function to call after tinymail callback execution.
513  * @user_data: generic user data which will be passed to @user_callback function.
514  * 
515  * Sets the given @folder as child of a provided #TnyFolderStore. This
516  * operation also transfers all the messages contained in the folder
517  * and all of his children folders with their messages as well. This
518  * operation is synchronous, so the #ModestMailOperation should not be
519  * added to any #ModestMailOperationQueue.
520  *
521  * If @delete_original is TRUE this function moves the original
522  * folder, if it is FALSE the it just copies it
523  *
524  **/
525 void          modest_mail_operation_xfer_folder    (ModestMailOperation *self,
526                                                     TnyFolder *folder,
527                                                     TnyFolderStore *parent,
528                                                     gboolean delete_original,
529                                                     XferFolderAsyncUserCallback user_callback,
530                                                     gpointer user_data);
531                                                     
532
533 /* Functions that performs msg operations */
534
535 /**
536  * modest_mail_operation_xfer_msgs:
537  * @self: a #ModestMailOperation
538  * @header_list: a #TnyList of #TnyHeader to transfer
539  * @folder: the #TnyFolder where the messages will be transferred
540  * @delete_original: whether or not delete the source messages
541  * @user_callback: a #XferFolderAsyncUserCallback function to call after tinymail callback execution.
542  * @user_data: generic user data which will be passed to @user_callback function.
543  * 
544  * Asynchronously transfers messages from their current folder to
545  * another one. The caller should add the #ModestMailOperation to a
546  * #ModestMailOperationQueue and then free it. The caller will be
547  * notified by the "progress_changed" when the operation is completed.
548  *
549  * If the @delete_original paramter is TRUE then this function moves
550  * the messages between folders, otherwise it copies them.
551  * 
552  * Example
553  * <informalexample><programlisting>
554  * queue = modest_tny_platform_factory_get_modest_mail_operation_queue_instance (fact);
555  * mail_op = modest_mail_operation_new ();
556  * modest_mail_operation_queue_add (queue, mail_op);
557  * g_signal_connect (G_OBJECT (mail_op), "progress_changed", G_CALLBACK(on_progress_changed), queue);
558  *
559  * modest_mail_operation_xfer_msg (mail_op, headers, folder, TRUE);
560  * 
561  * g_object_unref (G_OBJECT (mail_op));
562  * </programlisting></informalexample>
563  *
564  **/
565 void          modest_mail_operation_xfer_msgs      (ModestMailOperation *self,
566                                                     TnyList *header_list, 
567                                                     TnyFolder *folder,
568                                                     gboolean delete_original,
569                                                     XferMsgsAsyncUserCallback user_callback,
570                                                     gpointer user_data);
571
572 /**
573  * modest_mail_operation_remove_msg:
574  * @self: a #ModestMailOperation
575  * @header: the #TnyHeader of the message to move
576  * @remove_to_trash: TRUE to move it to trash or FALSE to delete it
577  * permanently
578  * 
579  * Deletes a message. This operation is synchronous, so the
580  * #ModestMailOperation should not be added to any
581  * #ModestMailOperationQueue
582  **/
583 void          modest_mail_operation_remove_msg     (ModestMailOperation *self,
584                                                     TnyHeader *header,
585                                                     gboolean remove_to_trash);
586
587 /**
588  * modest_mail_operation_remove_msg:
589  * @self: a #ModestMailOperation
590  * @headers: the #TnyList of the messages to delete
591  * @remove_to_trash: TRUE to move it to trash or FALSE to delete it
592  * permanently
593  * 
594  * Deletes a list of messages. This operation is synchronous, so the
595  * #ModestMailOperation should not be added to any
596  * #ModestMailOperationQueue
597  **/
598 void          modest_mail_operation_remove_msgs     (ModestMailOperation *self,
599                                                      TnyList *headers,
600                                                      gboolean remove_to_trash);
601
602 /**
603  * modest_mail_operation_get_msg:
604  * @self: a #ModestMailOperation
605  * @header_list: the #TnyHeader of the message to get
606  * @user_callback: a #GetMsgAsyncUserCallback function to call after tinymail callback execution.
607  * @user_data: generic user data which will be passed to @user_callback function.
608  * 
609  * Gets a message from header using an user defined @callback function
610  * pased as argument. This operation is asynchronous, so the
611  * #ModestMailOperation should be added to #ModestMailOperationQueue
612  **/
613 void          modest_mail_operation_get_msg     (ModestMailOperation *self,
614                                                  TnyHeader *header, 
615                                                  GetMsgAsyncUserCallback user_callback,
616                                                  gpointer user_data);
617 /**
618  * modest_mail_operation_get_msgs_full:
619  * @self: a #ModestMailOperation
620  * @header_list: a #TnyList of #TnyHeader objects to get and process
621  * @user_callback: a #TnyGetMsgCallback function to call after tinymail operation execution.
622  * @user_data: user data passed to both, user_callback and update_status_callback.
623  * 
624  * Gets messages from headers list and process hem using @callback function
625  * pased as argument. This operation is asynchronous, so the
626  * #ModestMailOperation should be added to #ModestMailOperationQueue
627  **/
628 void          modest_mail_operation_get_msgs_full   (ModestMailOperation *self,
629                                                      TnyList *headers_list,
630                                                      GetMsgAsyncUserCallback user_callback,
631                                                      gpointer user_data,
632                                                      GDestroyNotify notify);
633
634 /* Functions to control mail operations */
635 /**
636  * modest_mail_operation_get_task_done:
637  * @self: a #ModestMailOperation
638  * 
639  * Gets the amount of work done for a given mail operation. This
640  * amount of work is an absolute value.
641  * 
642  * Returns: the amount of work completed
643  **/
644 guint     modest_mail_operation_get_task_done      (ModestMailOperation *self);
645
646 /**
647  * modest_mail_operation_get_task_total:
648  * @self: a #ModestMailOperation
649  * 
650  * Gets the total amount of work that must be done to complete a given
651  * mail operation. This amount of work is an absolute value.
652  * 
653  * Returns: the total required amount of work
654  **/
655 guint     modest_mail_operation_get_task_total     (ModestMailOperation *self);
656
657
658 /**
659  * modest_mail_operation_is_finished:
660  * @self: a #ModestMailOperation
661  * 
662  * Checks if the operation is finished. A #ModestMailOperation is
663  * finished if it's in any of the following states:
664  * MODEST_MAIL_OPERATION_STATUS_SUCCESS,
665  * MODEST_MAIL_OPERATION_STATUS_FAILED,
666  * MODEST_MAIL_OPERATION_STATUS_CANCELED or
667  * MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS
668  * 
669  * Returns: TRUE if the operation is finished, FALSE otherwise
670  **/
671 gboolean  modest_mail_operation_is_finished        (ModestMailOperation *self);
672
673 /**
674  * modest_mail_operation_is_finished:
675  * @self: a #ModestMailOperation
676  * 
677  * Gets the current status of the given mail operation
678  *
679  * Returns: the current status or MODEST_MAIL_OPERATION_STATUS_INVALID in case of error
680  **/
681 ModestMailOperationStatus modest_mail_operation_get_status  (ModestMailOperation *self);
682
683 /**
684  * modest_mail_operation_get_error:
685  * @self: a #ModestMailOperation
686  * 
687  * Gets the error associated to the mail operation if exists
688  * 
689  * Returns: the #GError associated to the #ModestMailOperation if it
690  * exists or NULL otherwise
691  **/
692 const GError*             modest_mail_operation_get_error   (ModestMailOperation *self);
693
694 /**
695  * modest_mail_operation_cancel:
696  * @self: a #ModestMailOperation
697  *
698  * Cancels an active mail operation
699  * 
700  * Returns: TRUE if the operation was succesfully canceled, FALSE otherwise
701  **/
702 gboolean  modest_mail_operation_cancel          (ModestMailOperation *self);
703
704 /**
705  * modest_mail_operation_refresh_folder
706  * @self: a #ModestMailOperation
707  * @folder: the #TnyFolder to refresh
708  * @user_callback: the #RefreshAsyncUserCallback function to be called
709  * after internal refresh async callback was being executed.
710  * 
711  * Refreshes the contents of a folder. After internal callback was executed, 
712  * and all interna mail operation field were filled, if exists, it calls an 
713  * user callback function to make UI operations which must be done after folder
714  * was refreshed.
715  */
716 void      modest_mail_operation_refresh_folder  (ModestMailOperation *self,
717                                                  TnyFolder *folder,
718                                                  RefreshAsyncUserCallback user_callback,
719                                                  gpointer user_data);
720
721 /**
722  * modest_mail_operation_get_account:
723  * @self: a #ModestMailOperation
724  * 
725  * Gets the account associated to a mail operation
726  * 
727  * Returns: the #TnyAccount associated to the #ModestMailOperation
728  **/
729 TnyAccount *modest_mail_operation_get_account   (ModestMailOperation *self);
730
731
732 /**
733  * modest_mail_operation_noop:
734  * @self: a #ModestMailOperation
735  * 
736  * Does nothing except emitting operation-started and
737  * operation-finished
738  **/
739 void modest_mail_operation_noop (ModestMailOperation *self);
740
741
742 /**
743  * modest_mail_operation_to_string:
744  * @self: a #ModestMailOperation
745  * 
746  * get a string representation of the mail operation (for debugging)
747  *
748  * Returns: a newly allocated string
749  **/
750 gchar* modest_mail_operation_to_string (ModestMailOperation *self);
751
752
753 G_END_DECLS
754
755 #endif /* __MODEST_MAIL_OPERATION_H__ */
756