Changeset 1299

Show
Ignore:
Timestamp:
12/06/06 18:06:03
Author:
pvanhoof
Message:

Added an API

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r1293 r1299  
     12006-12-06  Philip Van Hoof <pvanhoof@gnome.org> 
     2 
     3        * Added the tny_folder_get_msg_async API 
     4 
     5        * This was a major API change in libtinymail 
     6 
    172006-12-01  Philip Van Hoof <pvanhoof@gnome.org> 
    28 
  • trunk/bindings/python/tinymail.override

    r1272 r1299  
    9393} 
    9494%% 
     95override tny_folder_get_msg_async kwargs 
     96 
     97static void 
     98tny_get_msg_cb (TnyFolder *self, TnyHeader *header, TnyGetMsgCallback callback, gpointer user_data) 
     99{ 
     100    PyObject *callback, *args, *ret; 
     101    PyGILState_STATE state; 
     102 
     103    state = pyg_gil_state_ensure(); 
     104    callback = PyTuple_GetItem((PyObject *)user_data, 1); 
     105    args = Py_BuildValue("(NO)", 
     106                         pygobject_new((GObject *)self), 
     107                         PyTuple_GetItem((PyObject *)user_data, 2)); 
     108    ret = PyObject_CallObject(callback, args); 
     109    if (!ret) 
     110        PyErr_Print(); 
     111 
     112    pyg_error_check(err); 
     113    Py_XDECREF(ret); 
     114    Py_DECREF(args); 
     115    Py_DECREF ((PyObject *)user_data); 
     116    pyg_gil_state_release(state); 
     117} 
     118 
     119static PyObject * 
     120_wrap_tny_folder_get_msg_async (PyGObject *self, PyObject *args, PyObject *kwargs) 
     121{ 
     122    static char *kwlist[] = { "header", "get_msg_func", "user_data", NULL }; 
     123    PyObject *get_msg_func, *user_data = Py_None; 
     124    TnyHeader *header; 
     125    PyObject *data; 
     126 
     127    if (!PyArg_ParseTupleAndKeywords(args, kwargs, 
     128                                     "OO|O:TnyFolder.get_msg_async",kwlist, 
     129                                     &header, &get_msg_func, &user_data)) 
     130        return NULL; 
     131    if (!PyCallable_Check(get_msg_func)) { 
     132        PyErr_SetString(PyExc_TypeError, "get_msg_func must be callable"); 
     133        return NULL; 
     134    } 
     135 
     136    data = Py_BuildValue("(OOO)", header, get_msg_func, user_data); 
     137 
     138    tny_folder_get_msg_async (TNY_FOLDER (self->obj), header, 
     139                                      tny_get_msg_cb, data); 
     140    return Py_None; 
     141} 
     142 
     143%% 
    95144override tny_folder_refresh_async kwargs 
    96145 
  • trunk/libtinymail-camel/tny-camel-folder.c

    r1287 r1299  
    911911} 
    912912 
     913 
     914static void 
     915tny_camel_folder_get_msg_async (TnyFolder *self, TnyHeader *header, TnyGetMsgCallback callback, gpointer user_data) 
     916{ 
     917        return TNY_CAMEL_FOLDER_GET_CLASS (self)->get_msg_async_func (self, header, callback, user_data); 
     918} 
     919 
     920static void 
     921tny_camel_folder_get_msg_async_default (TnyFolder *self, TnyHeader *header, TnyGetMsgCallback callback, gpointer user_data) 
     922{ 
     923        g_critical ("Not implemented!"); 
     924} 
    913925 
    914926static TnyMsg* 
     
    17551767        klass->get_headers_func = tny_camel_folder_get_headers; 
    17561768        klass->get_msg_func = tny_camel_folder_get_msg; 
     1769        klass->get_msg_async_func = tny_camel_folder_get_msg_async; 
    17571770        klass->get_id_func = tny_camel_folder_get_id; 
    17581771        klass->set_name_func = tny_camel_folder_set_name; 
     
    17991812        class->get_headers_func = tny_camel_folder_get_headers_default; 
    18001813        class->get_msg_func = tny_camel_folder_get_msg_default; 
     1814        class->get_msg_async_func = tny_camel_folder_get_msg_async_default; 
    18011815        class->get_id_func = tny_camel_folder_get_id_default; 
    18021816        class->set_name_func = tny_camel_folder_set_name_default; 
  • trunk/libtinymail-camel/tny-camel-folder.h

    r1287 r1299  
    5757        void (*set_msg_remove_strategy_func) (TnyFolder *self, TnyMsgRemoveStrategy *st); 
    5858        TnyMsg* (*get_msg_func) (TnyFolder *self, TnyHeader *header, GError **err); 
     59        void (*get_msg_async_func) (TnyFolder *self, TnyHeader *header, TnyGetMsgCallback callback, gpointer user_data); 
    5960        void (*get_headers_func) (TnyFolder *self, TnyList *headers, gboolean refresh, GError **err); 
    6061        const gchar* (*get_name_func) (TnyFolder *self); 
  • trunk/libtinymail-camel/tny-camel-mime-part.c

    r1295 r1299  
    6464        int go = TRUE; 
    6565 
    66       if (!firstpart && callback (msg, part, data) == FALSE) 
    67                         return FALSE;  
     66/*            if (!firstpart && callback (msg, part, data) == FALSE) 
     67                        return FALSE; */ 
    6868 
    6969        containee = camel_medium_get_content_object (CAMEL_MEDIUM (part)); 
    70  
     70         
    7171        if (G_UNLIKELY (containee == NULL)) 
    7272                return go; 
     73 
    7374 
    7475        if (G_LIKELY (CAMEL_IS_MULTIPART (containee))) 
     
    7778                for (i = 0; go && i < parts; i++)  
    7879                { 
    79                         CamelMimePart *part = camel_multipart_get_part (CAMEL_MULTIPART (containee), i); 
    80                         if (part) 
    81                                 callback (msg, part, data);  
     80                        CamelMimePart *tpart = camel_multipart_get_part (CAMEL_MULTIPART (containee), i); 
     81                        if (tpart) 
     82                                callback (msg, tpart, data);  
    8283 
    8384                        /* if (part) 
     
    8889                 
    8990        } else if (G_LIKELY (CAMEL_IS_MIME_MESSAGE (containee))) 
    90                 callback (msg, part, data); 
     91                callback (msg, (CamelMimePart*) containee, data); 
    9192 
    9293        /* else if (G_LIKELY (CAMEL_IS_MIME_MESSAGE (containee))) 
  • trunk/libtinymail/tny-folder.c

    r1287 r1299  
    395395/** 
    396396 * tny_folder_get_msg: 
    397  * @self: a TnyFolder object 
     397 * @self: a #TnyFolder object 
    398398 * @header: the header of the message to get 
    399399 * @err: a #GError object or NULL 
     
    426426} 
    427427 
     428 
     429 
     430 
     431/** 
     432 * tny_folder_get_msg_async: 
     433 * @self: a #TnyFolder object 
     434 * @header: a #TnyHeader object 
     435 * @callback: The callback handler 
     436 * @user_data: user data for the callback 
     437 * 
     438 * Get a message in @self identified by @header. You must unreference the 
     439 * return value after use. 
     440 * 
     441 * If you want to use this functionality, it's advised to let your application  
     442 * use the #GMainLoop. All Gtk+ applications have this once gtk_main () is 
     443 * called. 
     444 *  
     445 * When using a #GMainLoop this method will callback using g_idle_add_full. 
     446 * Without a #GMainLoop, which the libtinymail-camel implementation detects 
     447 * using (g_main_depth > 0), the callbacks will happen in a worker thread at an 
     448 * unknown moment in time (check your locking). 
     449 * 
     450 * When using Gtk+, the callback doesn't need the gdk_threads_enter and  
     451 * gdk_threads_leave guards (because it happens in the #GMainLoop). 
     452 * 
     453 * Example: 
     454 * <informalexample><programlisting> 
     455 * static void 
     456 * folder_get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data) 
     457 * { 
     458 *       TnyMsgView *message_view = user_data; 
     459 *       tny_msg_view_set_msg (message_view, message); 
     460 * } 
     461 * TnyMsgView *message_view = tny_platform_factory_new_msg_view (platfact); 
     462 * TnyFolder *folder = ...; TnyHeader *header = ...; 
     463 * tny_folder_get_msg_async (folder, header, 
     464 *          folder_get_msg_cb, message_view);  
     465 * </programlisting></informalexample> 
     466 **/ 
     467void 
     468tny_folder_get_msg_async (TnyFolder *self, TnyHeader *header, TnyGetMsgCallback callback, gpointer user_data) 
     469{ 
     470#ifdef DEBUG 
     471        if (!TNY_FOLDER_GET_IFACE (self)->get_msg_async_func) 
     472                g_critical ("You must implement tny_folder_get_msg_async\n"); 
     473#endif 
     474 
     475        TNY_FOLDER_GET_IFACE (self)->get_msg_async_func (self, header, callback, user_data); 
     476        return; 
     477} 
    428478 
    429479/** 
  • trunk/libtinymail/tny-folder.h

    r1287 r1299  
    7777        void (*set_msg_remove_strategy_func) (TnyFolder *self, TnyMsgRemoveStrategy *st); 
    7878        TnyMsg* (*get_msg_func) (TnyFolder *self, TnyHeader *header, GError **err); 
     79        void (*get_msg_async_func) (TnyFolder *self, TnyHeader *header, TnyGetMsgCallback callback, gpointer user_data); 
    7980        void (*get_headers_func) (TnyFolder *self, TnyList *headers, gboolean refresh, GError **err); 
    8081        const gchar* (*get_name_func) (TnyFolder *self); 
  • trunk/libtinymail/tny-shared.h

    r1262 r1299  
    5050typedef void (*TnyForgetPassFunc) (TnyAccount *self); 
    5151typedef void (*TnyRefreshFolderCallback) (TnyFolder *self, gboolean cancelled, GError **err, gpointer user_data); 
     52typedef void (*TnyGetMsgCallback) (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data); 
    5253typedef void (*TnyRefreshFolderStatusCallback) (TnyFolder *self, const gchar *what, gint status, gpointer user_data); 
    5354typedef enum _TnyHeaderFlags TnyHeaderFlags; 
  • trunk/libtinymailui-gtk/tny-gtk-msg-view.c

    r1297 r1299  
    397397tny_mime_part_view_proxy_func_set_part (TnyMimePartView *mpview, TnyMimePart *part) 
    398398{ 
    399                 if (tny_mime_part_content_type_is (part, "message/rfc822") && TNY_IS_GTK_MSG_VIEW (mpview)) 
     399                if (tny_mime_part_content_type_is (part, "message/*") && TNY_IS_GTK_MSG_VIEW (mpview)) 
    400400                { 
    401401                        TnyMimePart *content_part = tny_mime_part_get_content_object (part); 
     
    511511                } 
    512512        } else if (!tny_mime_part_content_type_is (part, "multipart/*") && 
    513                 !tny_mime_part_content_type_is (part, "message/rfc822")) 
     513                !tny_mime_part_content_type_is (part, "message/*")) 
    514514        { 
    515515                g_warning (_("I don't have a mime part viewer for %s\n"),