This commit implements a new handling of image attachments. We follow
[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_OPEN,
73         MODEST_MAIL_OPERATION_TYPE_DELETE,
74         MODEST_MAIL_OPERATION_TYPE_INFO,
75         MODEST_MAIL_OPERATION_TYPE_UNKNOWN,
76 } ModestMailOperationTypeOperation;
77
78 /**
79  * ErrorCheckingAsyncUserCallback:
80  *
81  * @mail_op: the current mail operation.
82  * @user_data: generic data passed to user defined function.
83  *
84  * This function implements required actions to performs under error
85  * states.  
86  */
87 typedef void (*ErrorCheckingUserCallback) (ModestMailOperation *mail_op, gpointer user_data);
88
89 /**
90  * GetMsgAsyncUserCallback:
91  *
92  * @mail_op: the current #ModestMailOperation.
93  * @header: a #TnyHeader summary item.
94  * @msg: a #TnyMsg message retrieved by async operation.
95  * @user_data: generic data passed to user defined function.
96  *
97  * This function will be called after get_msg_cb private function, which is
98  * used as tinymail operation callback. The private function fills private 
99  * fields of mail operation and calls user defined callback if it exists.
100  */
101 typedef void (*GetMsgAsyncUserCallback) (ModestMailOperation *mail_op, 
102                                          TnyHeader *header, 
103                                          TnyMsg *msg, 
104                                          gpointer user_data);
105
106 /**
107  * GetMimePartSizeCallback:
108  *
109  * @mail_op: the current #ModestMailOperation.
110  * @size: size of the attachment
111  * @user_data: generic data passed to user defined function.
112  *
113  */
114 typedef void (*GetMimePartSizeCallback) (ModestMailOperation *mail_op, 
115                                          gssize size,
116                                          gpointer user_data);
117
118 /**
119  * XferAsyncUserCallback:
120  *
121  * @obj: a #GObject generic object which has created current mail operation.
122  * @user_data: generic data passed to user defined function.
123  *
124  * This function will be called after transfer_msgs_cb private function, which is
125  * used as tinymail operation callback. The private function fills private 
126  * fields of mail operation and calls user defined callback if it exists.
127  */
128 typedef void (*XferAsyncUserCallback) (ModestMailOperation *mail_op, gpointer user_data);
129
130
131 /**
132  * RefreshAsyncUserCallback:
133  *
134  * @mail_op: the current #ModestMailOperation.
135  * @folder: a #TnyFolder which has been refreshed .
136  * @user_data: generic data passed to user defined function.
137  *
138  * This function will be called after refresh_folder_async_cb private function, which is
139  * used as tinymail operation callback. The private function fills private 
140  * fields of mail operation and calls user defined callback if it exists.
141  */
142 typedef void (*RefreshAsyncUserCallback) (ModestMailOperation *mail_op, 
143                                           TnyFolder *folder, 
144                                           gpointer user_data);
145
146 /**
147  * UpdateAccountCallback:
148  *
149  * @obj: a #GObject generic object which has created current mail operation.
150  * @new_headers: the list of new headers received
151  * @user_data: generic data passed to user defined function.
152  *
153  * This is the callback of the update_account operation. It informs
154  * the caller about the amount of new messages that have been
155  * downloaded
156  */
157 typedef void (*UpdateAccountCallback) (ModestMailOperation *self, 
158                                        TnyList *new_headers,
159                                        gpointer user_data);
160
161 /* This struct represents the internal state of a mail operation in a
162    given time */
163 typedef struct {
164         guint      done;
165         guint      total;
166         gdouble    bytes_done;
167         gdouble    bytes_total;
168         gboolean   finished;
169         ModestMailOperationStatus        status;
170         ModestMailOperationTypeOperation op_type;
171 } ModestMailOperationState;
172
173
174 struct _ModestMailOperation {
175          GObject parent;
176         /* insert public members, if any */
177 };
178
179 struct _ModestMailOperationClass {
180         GObjectClass parent_class;
181
182         /* Signals */
183         void (*progress_changed) (ModestMailOperation *self, ModestMailOperationState *state, gpointer user_data);
184 };
185
186 /* member functions */
187 GType        modest_mail_operation_get_type    (void) G_GNUC_CONST;
188
189 /**
190  * modest_mail_operation_new:
191  * @id: a #ModestMailOperationId identification of operation type.
192  * @source: a #GObject which creates this new operation.
193  * 
194  * Creates a new instance of class #ModestMailOperation, using parameters
195  * to initialize its private structure. @source parameter may be NULL.
196  **/
197 ModestMailOperation*    modest_mail_operation_new     (ModestMailOperationTypeOperation type,
198                                                        GObject *source);
199
200 /**
201  * modest_mail_operation_new_with_error_handling:
202  * @id: a #ModestMailOperationId identification of operation type.
203  * @source: a #GObject which creates this new operation.
204  * @error_handler: a #ErrorCheckingUserCallback function to performs operations when 
205  * an error occurs.
206  * 
207  * Creates a new instance of class #ModestMailOperation, using parameters
208  * to initialize its private structure. @source parameter may be NULL. 
209  * @error_handler can not be NULL, but it will be returned an mail operation
210  * object without error handling capability.
211  **/
212 ModestMailOperation*    modest_mail_operation_new_with_error_handling     (ModestMailOperationTypeOperation op_type,
213                                                                            GObject *source,
214                                                                            ErrorCheckingUserCallback error_handler,
215                                                                            gpointer user_data);
216 /**
217  * modest_mail_operation_execute_error_handler
218  * @self: a #ModestMailOperation
219  * 
220  * Executes error handler if exists. The error handler is the one that
221  * MUST free the user data passed to the
222  * modest_mail_operation_new_with_error_handling constructor
223  **/
224 void
225 modest_mail_operation_execute_error_handler (ModestMailOperation *self);
226
227 /**
228  * modest_mail_operation_get_type_operation
229  * @self: a #ModestMailOperation
230  * 
231  * Gets the private op_type field of mail operation. This op_type
232  * identifies the class/type of mail operation.
233  **/
234 ModestMailOperationTypeOperation
235 modest_mail_operation_get_type_operation (ModestMailOperation *self);
236
237 /**
238  * modest_mail_operation_is_mine
239  * @self: a #ModestMailOperation
240  * @source: a #GObject to check if it have created @self operation.
241  * 
242  * Check if @source object its owner of @self mail operation.
243  *
244  * returns: TRUE if source its owner, FALSE otherwise.
245  **/
246 gboolean 
247 modest_mail_operation_is_mine (ModestMailOperation *self, 
248                                GObject *me);
249
250 /**
251  * modest_mail_operation_get_source
252  * @self: a #ModestMailOperation
253  *
254  * returns a new reference to the object that created the mail
255  * operation passed to the constructor, or NULL if none. The caller
256  * must free the new reference
257  **/
258 GObject *
259 modest_mail_operation_get_source (ModestMailOperation *self);
260
261 /* fill in other public functions, eg.: */
262
263 /**
264  * modest_mail_operation_send_mail:
265  * @self: a #ModestMailOperation
266  * @transport_account: a non-NULL #TnyTransportAccount
267  * @msg: a non-NULL #TnyMsg
268  * 
269  * Sends and already existing message using the provided
270  * #TnyTransportAccount. This operation is synchronous, so the
271  * #ModestMailOperation should not be added to any
272  * #ModestMailOperationQueue
273   **/
274 void    modest_mail_operation_send_mail       (ModestMailOperation *self,
275                                                TnyTransportAccount *transport_account,
276                                                TnyMsg* msg);
277
278 /**
279  * modest_mail_operation_send_new_mail:
280  * @self: a #ModestMailOperation
281  * @transport_account: a non-NULL #TnyTransportAccount
282  * @draft_msg: a #TnyMsg of the origin draft message, if any
283  * @from: the email address of the mail sender
284  * @to: a non-NULL email address of the mail receiver
285  * @cc: a comma-separated list of email addresses where to send a carbon copy
286  * @bcc: a comma-separated list of email addresses where to send a blind carbon copy
287  * @subject: the subject of the new mail
288  * @plain_body: the plain text body of the new mail.
289  * @html_body: the html version of the body of the new mail. If NULL, the mail will
290  *             be sent with the plain body only.
291  * @attachments_list: a #GList of attachments, each attachment must be a #TnyMimePart
292  * @images_list: a #GList of image attachments, each attachment must be a #TnyMimePart
293  * 
294  * Sends a new mail message using the provided
295  * #TnyTransportAccount. This operation is synchronous, so the
296  * #ModestMailOperation should not be added to any
297  * #ModestMailOperationQueue
298   **/
299 void    modest_mail_operation_send_new_mail   (ModestMailOperation *self,
300                                                TnyTransportAccount *transport_account,
301                                                TnyMsg *draft_msg,
302                                                const gchar *from,
303                                                const gchar *to,
304                                                const gchar *cc,
305                                                const gchar *bcc,
306                                                const gchar *subject,
307                                                const gchar *plain_body,
308                                                const gchar *html_body,
309                                                const GList *attachments_list,
310                                                const GList *images_list,
311                                                TnyHeaderFlags priority_flags);
312
313
314 /**
315  * modest_mail_operation_save_to_drafts:
316  * @self: a #ModestMailOperation
317  * @transport_account: a non-NULL #TnyTransportAccount
318  * @draft_msg: the previous draft message, in case it's an update
319  * to an existing draft.
320  * @from: the email address of the mail sender
321  * @to: a non-NULL email address of the mail receiver
322  * @cc: a comma-separated list of email addresses where to send a carbon copy
323  * @bcc: a comma-separated list of email addresses where to send a blind carbon copy
324  * @subject: the subject of the new mail
325  * @plain_body: the plain text body of the new mail.
326  * @html_body: the html version of the body of the new mail. If NULL, the mail will
327  *             be sent with the plain body only.
328  * @attachments_list: a #GList of attachments, each attachment must be a #TnyMimePart
329  * @images_list: a #GList of image attachments, each attachment must be a #TnyMimePart
330  * 
331  * Save a mail message to drafts using the provided
332  * #TnyTransportAccount. This operation is synchronous, so the
333  * #ModestMailOperation should not be added to any
334  * #ModestMailOperationQueue
335  *
336   **/
337 void modest_mail_operation_save_to_drafts   (ModestMailOperation *self,
338                                              TnyTransportAccount *transport_account,
339                                              TnyMsg *draft_msg,
340                                              ModestMsgEditWindow *edit_window,
341                                              const gchar *from,
342                                              const gchar *to,
343                                              const gchar *cc,
344                                              const gchar *bcc,
345                                              const gchar *subject,
346                                              const gchar *plain_body,
347                                              const gchar *html_body,
348                                              const GList *attachments_list,
349                                              const GList *images_list,
350                                              TnyHeaderFlags priority_flags);
351 /**
352  * modest_mail_operation_update_account:
353  * @self: a #ModestMailOperation
354  * @account_name: the id of a Modest account
355  * 
356  * Asynchronously refreshes the root folders of the given store
357  * account. The caller should add the #ModestMailOperation to a
358  * #ModestMailOperationQueue and then free it. The caller will be
359  * notified by the "progress_changed" signal each time the progress of
360  * the operation changes.
361  *
362  * Example
363  * <informalexample><programlisting>
364  * queue = modest_tny_platform_factory_get_modest_mail_operation_queue_instance (fact)
365  * mail_op = modest_mail_operation_new ();
366  * g_signal_connect (G_OBJECT (mail_op), "progress_changed", G_CALLBACK(on_progress_changed), NULL);
367  * modest_mail_operation_queue_add (queue, mail_op);
368  * modest_mail_operation_update_account (mail_op, account_name)
369  * g_object_unref (G_OBJECT (mail_op));
370  * </programlisting></informalexample>
371  *
372  * Note that the account_name *MUST* be a modest account name, not a
373  * tinymail store account name
374  * 
375  * Returns: TRUE if the mail operation could be started, or FALSE otherwise
376  **/
377 gboolean      modest_mail_operation_update_account (ModestMailOperation *self,
378                                                     const gchar *account_name,
379                                                     UpdateAccountCallback callback,
380                                                     gpointer user_data);
381
382 /* Functions that perform store operations */
383
384 /**
385  * modest_mail_operation_create_folder:
386  * @self: a #ModestMailOperation
387  * @parent: the #TnyFolderStore which is the parent of the new folder
388  * @name: the non-NULL new name for the new folder
389  * 
390  * Creates a new folder as a children of a existing one. If the store
391  * account supports subscriptions this method also sets the new folder
392  * as subscribed. This operation is synchronous, so the
393  * #ModestMailOperation should not be added to any
394  * #ModestMailOperationQueue
395  * 
396  * Returns: a newly created #TnyFolder or NULL in case of error.
397  **/
398 TnyFolder*    modest_mail_operation_create_folder  (ModestMailOperation *self,
399                                                     TnyFolderStore *parent,
400                                                     const gchar *name);
401
402 /**
403  * modest_mail_operation_remove_folder:
404  * @self: a #ModestMailOperation
405  * @folder: a #TnyFolder
406  * @remove_to_trash: TRUE to move it to trash or FALSE to delete
407  * permanently
408  * 
409  * Removes a folder. This operation is synchronous, so the
410  * #ModestMailOperation should not be added to any
411  * #ModestMailOperationQueue
412  **/
413 void          modest_mail_operation_remove_folder  (ModestMailOperation *self,
414                                                     TnyFolder *folder,
415                                                     gboolean remove_to_trash);
416
417 /**
418  * modest_mail_operation_rename_folder:
419  * @self: a #ModestMailOperation
420  * @folder: a #TnyFolder
421  * @name: a non-NULL name without "/"
422  * 
423  * Renames a given folder with the provided new name. This operation
424  * is synchronous, so the #ModestMailOperation should not be added to
425  * any #ModestMailOperationQueue
426  **/
427 void          modest_mail_operation_rename_folder  (ModestMailOperation *self,
428                                                     TnyFolder *folder, 
429                                                     const gchar *name);
430
431 /**
432  * modest_mail_operation_xfer_folder:
433  * @self: a #ModestMailOperation
434  * @folder: a #TnyFolder
435  * @parent: the new parent of the folder as #TnyFolderStore
436  * @delete_original: wheter or not delete the original folder
437  * @user_callback: a #XferAsyncUserCallback function to call after tinymail callback execution.
438  * @user_data: generic user data which will be passed to @user_callback function.
439  * 
440  * Sets the given @folder as child of a provided #TnyFolderStore. This
441  * operation also transfers all the messages contained in the folder
442  * and all of his children folders with their messages as well. This
443  * operation is synchronous, so the #ModestMailOperation should not be
444  * added to any #ModestMailOperationQueue.
445  *
446  * If @delete_original is TRUE this function moves the original
447  * folder, if it is FALSE the it just copies it
448  *
449  **/
450 void          modest_mail_operation_xfer_folder    (ModestMailOperation *self,
451                                                     TnyFolder *folder,
452                                                     TnyFolderStore *parent,
453                                                     gboolean delete_original,
454                                                     XferAsyncUserCallback user_callback,
455                                                     gpointer user_data);
456                                                     
457
458 /* Functions that performs msg operations */
459
460 /**
461  * modest_mail_operation_xfer_msgs:
462  * @self: a #ModestMailOperation
463  * @header_list: a #TnyList of #TnyHeader to transfer
464  * @folder: the #TnyFolder where the messages will be transferred
465  * @delete_original: whether or not delete the source messages
466  * @user_callback: a #XferAsyncUserCallback function to call after tinymail callback execution.
467  * @user_data: generic user data which will be passed to @user_callback function.
468  * 
469  * Asynchronously transfers messages from their current folder to
470  * another one. The caller should add the #ModestMailOperation to a
471  * #ModestMailOperationQueue and then free it. The caller will be
472  * notified by the "progress_changed" when the operation is completed.
473  *
474  * If the @delete_original paramter is TRUE then this function moves
475  * the messages between folders, otherwise it copies them.
476  * 
477  * Example
478  * <informalexample><programlisting>
479  * queue = modest_tny_platform_factory_get_modest_mail_operation_queue_instance (fact);
480  * mail_op = modest_mail_operation_new ();
481  * modest_mail_operation_queue_add (queue, mail_op);
482  * g_signal_connect (G_OBJECT (mail_op), "progress_changed", G_CALLBACK(on_progress_changed), queue);
483  *
484  * modest_mail_operation_xfer_msg (mail_op, headers, folder, TRUE);
485  * 
486  * g_object_unref (G_OBJECT (mail_op));
487  * </programlisting></informalexample>
488  *
489  **/
490 void          modest_mail_operation_xfer_msgs      (ModestMailOperation *self,
491                                                     TnyList *header_list, 
492                                                     TnyFolder *folder,
493                                                     gboolean delete_original,
494                                                     XferAsyncUserCallback user_callback,
495                                                     gpointer user_data);
496
497 /**
498  * modest_mail_operation_remove_msg:
499  * @self: a #ModestMailOperation
500  * @header: the #TnyHeader of the message to move
501  * @remove_to_trash: TRUE to move it to trash or FALSE to delete it
502  * permanently
503  * 
504  * Deletes a message. This operation is synchronous, so the
505  * #ModestMailOperation should not be added to any
506  * #ModestMailOperationQueue
507  **/
508 void          modest_mail_operation_remove_msg     (ModestMailOperation *self,
509                                                     TnyHeader *header,
510                                                     gboolean remove_to_trash);
511
512 /**
513  * modest_mail_operation_remove_msg:
514  * @self: a #ModestMailOperation
515  * @headers: the #TnyList of the messages to delete
516  * @remove_to_trash: TRUE to move it to trash or FALSE to delete it
517  * permanently
518  * 
519  * Deletes a list of messages. This operation is synchronous, so the
520  * #ModestMailOperation should not be added to any
521  * #ModestMailOperationQueue
522  **/
523 void          modest_mail_operation_remove_msgs     (ModestMailOperation *self,
524                                                      TnyList *headers,
525                                                      gboolean remove_to_trash);
526
527 /**
528  * modest_mail_operation_get_msg:
529  * @self: a #ModestMailOperation
530  * @header_list: the #TnyHeader of the message to get
531  * @user_callback: a #GetMsgAsyncUserCallback function to call after tinymail callback execution.
532  * @user_data: generic user data which will be passed to @user_callback function.
533  * 
534  * Gets a message from header using an user defined @callback function
535  * pased as argument. This operation is asynchronous, so the
536  * #ModestMailOperation should be added to #ModestMailOperationQueue
537  **/
538 void          modest_mail_operation_get_msg     (ModestMailOperation *self,
539                                                  TnyHeader *header, 
540                                                  GetMsgAsyncUserCallback user_callback,
541                                                  gpointer user_data);
542 /**
543  * modest_mail_operation_get_msgs_full:
544  * @self: a #ModestMailOperation
545  * @header_list: a #TnyList of #TnyHeader objects to get and process
546  * @user_callback: a #TnyGetMsgCallback function to call after tinymail operation execution.
547  * @user_data: user data passed to both, user_callback and update_status_callback.
548  * 
549  * Gets messages from headers list and process hem using @callback function
550  * pased as argument. This operation is asynchronous, so the
551  * #ModestMailOperation should be added to #ModestMailOperationQueue
552  **/
553 void          modest_mail_operation_get_msgs_full   (ModestMailOperation *self,
554                                                      TnyList *headers_list,
555                                                      GetMsgAsyncUserCallback user_callback,
556                                                      gpointer user_data,
557                                                      GDestroyNotify notify);
558
559 /* Functions to control mail operations */
560 /**
561  * modest_mail_operation_get_task_done:
562  * @self: a #ModestMailOperation
563  * 
564  * Gets the amount of work done for a given mail operation. This
565  * amount of work is an absolute value.
566  * 
567  * Returns: the amount of work completed
568  **/
569 guint     modest_mail_operation_get_task_done      (ModestMailOperation *self);
570
571 /**
572  * modest_mail_operation_get_task_total:
573  * @self: a #ModestMailOperation
574  * 
575  * Gets the total amount of work that must be done to complete a given
576  * mail operation. This amount of work is an absolute value.
577  * 
578  * Returns: the total required amount of work
579  **/
580 guint     modest_mail_operation_get_task_total     (ModestMailOperation *self);
581
582
583 /**
584  * modest_mail_operation_is_finished:
585  * @self: a #ModestMailOperation
586  * 
587  * Checks if the operation is finished. A #ModestMailOperation is
588  * finished if it's in any of the following states:
589  * MODEST_MAIL_OPERATION_STATUS_SUCCESS,
590  * MODEST_MAIL_OPERATION_STATUS_FAILED,
591  * MODEST_MAIL_OPERATION_STATUS_CANCELED or
592  * MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS
593  * 
594  * Returns: TRUE if the operation is finished, FALSE otherwise
595  **/
596 gboolean  modest_mail_operation_is_finished        (ModestMailOperation *self);
597
598 /**
599  * modest_mail_operation_is_finished:
600  * @self: a #ModestMailOperation
601  * 
602  * Gets the current status of the given mail operation
603  *
604  * Returns: the current status or MODEST_MAIL_OPERATION_STATUS_INVALID in case of error
605  **/
606 ModestMailOperationStatus modest_mail_operation_get_status  (ModestMailOperation *self);
607
608 /**
609  * modest_mail_operation_get_error:
610  * @self: a #ModestMailOperation
611  * 
612  * Gets the error associated to the mail operation if exists
613  * 
614  * Returns: the #GError associated to the #ModestMailOperation if it
615  * exists or NULL otherwise
616  **/
617 const GError*             modest_mail_operation_get_error   (ModestMailOperation *self);
618
619 /**
620  * modest_mail_operation_cancel:
621  * @self: a #ModestMailOperation
622  *
623  * Cancels an active mail operation
624  * 
625  * Returns: TRUE if the operation was succesfully canceled, FALSE otherwise
626  **/
627 gboolean  modest_mail_operation_cancel          (ModestMailOperation *self);
628
629 /**
630  * modest_mail_operation_refresh_folder
631  * @self: a #ModestMailOperation
632  * @folder: the #TnyFolder to refresh
633  * @user_callback: the #RefreshAsyncUserCallback function to be called
634  * after internal refresh async callback was being executed.
635  * 
636  * Refreshes the contents of a folder. After internal callback was executed, 
637  * and all interna mail operation field were filled, if exists, it calls an 
638  * user callback function to make UI operations which must be done after folder
639  * was refreshed.
640  */
641 void      modest_mail_operation_refresh_folder  (ModestMailOperation *self,
642                                                  TnyFolder *folder,
643                                                  RefreshAsyncUserCallback user_callback,
644                                                  gpointer user_data);
645
646 guint     modest_mail_operation_get_id          (ModestMailOperation *self);
647
648 guint     modest_mail_operation_set_id          (ModestMailOperation *self,
649                                                  guint id);
650
651 G_END_DECLS
652
653 #endif /* __MODEST_MAIL_OPERATION_H__ */
654