Changeset 2097

Show
Ignore:
Timestamp:
06/07/07 16:52:09
Author:
pvanhoof
Message:

tny_folder_poke_status improvements

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r2095 r2097  
    1414        * Fix for sergio, when removing folders the CamelFolderInfo iter was 
    1515        still cached 
    16          
     16        * tny_folder_poke_status will now, for IMAP, do a STATUS command to 
     17        more accurately find out the UNSEEN and MESSAGES statuses 
     18 
    17192007-06-06  Philip Van Hoof  <pvanhoof@gnome.org> 
    1820 
  • trunk/libtinymail-camel/camel-lite/camel/camel-folder.c

    r2088 r2097  
    17731773        CamelFolder *folder = (CamelFolder *)obj; 
    17741774        CamelFolderChangeInfo *changed = event_data; 
    1775         struct _CamelFolderChangeInfoPrivate *p = changed->priv; 
    17761775        CamelSession *session = ((CamelService *)folder->parent_store)->session; 
    17771776        CamelFilterDriver *driver = NULL; 
  • trunk/libtinymail-camel/camel-lite/camel/camel-store.c

    r2076 r2097  
    8686static int store_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args); 
    8787 
    88 static GPtrArray* get_recent_messages (CamelStore *store, const char *folder_name, int *unseen, int *messages); 
     88static void get_folder_status_impl (CamelStore *store, const char *folder_name, int *unseen, int *messages, int *uidnext); 
    8989 
    9090static void 
     
    113113        camel_store_class->unsubscribe_folder = unsubscribe_folder; 
    114114        camel_store_class->noop = noop; 
    115         camel_store_class->get_recent_messages = get_recent_messages
     115        camel_store_class->get_folder_status = get_folder_status_impl
    116116        camel_store_class->delete_cache = delete_cache; 
    117117 
     
    195195} 
    196196 
    197 GPtrArray*  
    198 camel_store_get_recent_messages (CamelStore *store, const char *folder_name,  
    199                         int *unseen, int *messages) 
    200 
    201         GPtrArray *ret; 
    202  
     197void 
     198camel_store_get_folder_status (CamelStore *store, const char *folder_name,  
     199                        int *unseen, int *messages, int *uidnext) 
     200
    203201        CAMEL_STORE_LOCK(store, folder_lock); 
    204         ret = CS_CLASS (store)->get_recent_messages (store, folder_name, unseen, messages); 
     202        CS_CLASS (store)->get_folder_status (store, folder_name, unseen, messages, uidnext); 
    205203        CAMEL_STORE_UNLOCK(store, folder_lock); 
    206204 
    207         return ret
    208 } 
    209  
    210 static GPtrArray*  
    211 get_recent_messages (CamelStore *store, const char *folder_name, int *unseen, int *messages
     205        return
     206} 
     207 
     208static void  
     209get_folder_status_impl (CamelStore *store, const char *folder_name, int *unseen, int *messages, int *uidnext
    212210{ 
    213211        *unseen = 0; 
    214212        *messages = 0; 
    215         return NULL; 
     213        *uidnext = 0; 
     214 
     215        return; 
    216216} 
    217217 
  • trunk/libtinymail-camel/camel-lite/camel/camel-store.h

    r2076 r2097  
    188188        void            (*noop)                     (CamelStore *store, 
    189189                                                     CamelException *ex); 
    190         GPtrArray*      (*get_recent_messages)      (CamelStore *store,  
     190        void            (*get_folder_status)        (CamelStore *store,  
    191191                                                     const char *folder_name,  
    192                                                      int *unseen, int *messages); 
     192                                                     int *unseen, int *messages,  
     193                                                     int *uidnext); 
    193194        void             (*delete_cache)              (CamelStore *store); 
    194195 
     
    267268                                                       int *unseen, int *messages); 
    268269 
     270void            camel_store_get_folder_status        (CamelStore *store,  
     271                                                      const char *folder_name,  
     272                                                      int *unseen, int *messages,  
     273                                                      int *uidnext); 
     274 
    269275void             camel_store_delete_cache            (CamelStore *store); 
    270276 
  • trunk/libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-store.c

    r2092 r2097  
    139139static void imap_set_server_level (CamelImapStore *store); 
    140140 
    141 static GPtrArray* imap_get_recent_messages (CamelStore *store, const char *folder_name, int *unseen, int *messages); 
     141static void imap_get_folder_status (CamelStore *store, const char *folder_name, int *unseen, int *messages, int *uidnext); 
    142142 
    143143void 
     
    244244        camel_store_class->get_trash = imap_get_trash; 
    245245        camel_store_class->get_junk = imap_get_junk; 
    246         camel_store_class->get_recent_messages = imap_get_recent_messages; 
     246        camel_store_class->get_folder_status = imap_get_folder_status; 
    247247 
    248248        camel_disco_store_class->can_work_offline = can_work_offline; 
     
    22772277} 
    22782278 
    2279 static GPtrArray* 
    2280 imap_get_recent_messages (CamelStore *store, const char *folder_name, int *unseen, int *messages) 
    2281 
    2282         GPtrArray *retval = NULL; 
     2279static void 
     2280imap_get_folder_status (CamelStore *store, const char *folder_name, int *unseen, int *messages, int *uidnext) 
     2281
    22832282        CamelImapStore *imap_store = CAMEL_IMAP_STORE (store); 
    2284  
    2285         CAMEL_SERVICE_REC_LOCK(imap_store, connect_lock); 
    2286         retval = _camel_imap_store_get_recent_messages (imap_store, folder_name, unseen, messages, TRUE); 
     2283        struct imap_status_item *items, *item; 
     2284        CamelException ex = CAMEL_EXCEPTION_INITIALISER; 
     2285 
     2286        if (!camel_disco_store_check_online (CAMEL_DISCO_STORE (imap_store), &ex)) 
     2287                return; 
     2288 
     2289        CAMEL_SERVICE_REC_LOCK (imap_store, connect_lock); 
     2290 
     2291        /* 
     2292         *  Example: C: A042 STATUS blurdybloop (UIDNEXT MESSAGES) 
     2293         *           S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) 
     2294         *           S: A042 OK STATUS completed */ 
     2295 
     2296        item = items = get_folder_status (imap_store, folder_name, "MESSAGES UNSEEN UIDNEXT"); 
     2297        while (item != NULL) { 
     2298                if (!g_ascii_strcasecmp (item->name, "MESSAGES")) 
     2299                        *messages = item->value; 
     2300                if (!g_ascii_strcasecmp (item->name, "UNSEEN")) 
     2301                        *unseen = item->value; 
     2302                if (!g_ascii_strcasecmp (item->name, "UIDNEXT")) 
     2303                        *uidnext = item->value; 
     2304                item = item->next; 
     2305        } 
     2306        imap_status_item_free (items); 
     2307 
    22872308        CAMEL_SERVICE_REC_UNLOCK (imap_store, connect_lock); 
    22882309 
    2289         return retval
     2310        return
    22902311} 
    22912312 
  • trunk/libtinymail-camel/tny-camel-folder.c

    r2096 r2097  
    33503350        TnyFolder *self = data; 
    33513351        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
    3352         guint newlen, newurlen; 
     3352        int newlen, newurlen; 
    33533353        gboolean set=FALSE; 
    33543354        TnyFolderChange *change; 
     3355        CamelStore *store = priv->store; 
    33553356 
    33563357        if (priv->folder) 
    33573358        { 
    33583359                g_static_rec_mutex_lock (priv->folder_lock); 
     3360 
    33593361                set=TRUE; 
    33603362                newurlen = camel_folder_get_unread_message_count (priv->folder); 
    33613363                newlen = camel_folder_get_message_count (priv->folder); 
     3364 
    33623365                g_static_rec_mutex_unlock (priv->folder_lock); 
    33633366        } else if (priv->iter) { 
     3367 
    33643368                g_static_rec_mutex_lock (priv->folder_lock); 
    3365                 set=TRUE; 
    3366                 newurlen = priv->iter->unread; 
    3367                 newlen = priv->iter->total; 
     3369 
     3370                if (store && priv->folder_name && camel_disco_store_status (CAMEL_DISCO_STORE (store)) == CAMEL_DISCO_STORE_ONLINE) 
     3371                { 
     3372                        int uidnext; 
     3373                        camel_store_get_folder_status (store, priv->folder_name,  
     3374                                &newurlen, &newlen, &uidnext); 
     3375                        set = TRUE; 
     3376                } else { 
     3377                        set=TRUE; 
     3378                        newurlen = priv->iter->unread; 
     3379                        newlen = priv->iter->total; 
     3380                } 
     3381 
    33683382                g_static_rec_mutex_unlock (priv->folder_lock); 
    33693383        } 
     
    33723386        { 
    33733387                change = tny_folder_change_new (self); 
    3374                 priv->cached_length = newlen; 
     3388                priv->cached_length = (guint) newlen; 
    33753389                tny_folder_change_set_new_all_count (change, priv->cached_length); 
    3376                 priv->unread_length = newurlen; 
     3390                priv->unread_length = (guint) newurlen; 
    33773391                tny_folder_change_set_new_unread_count (change, priv->unread_length); 
    33783392                notify_folder_observers_about (self, change); 
  • trunk/tests/c-demo/tny-demoui-summary-view.c

    r2076 r2097  
    9393        TnyMsgView *msg_view; 
    9494        guint accounts_reloaded_signal; 
    95         GtkWidget *status, *progress, *online_button
     95        GtkWidget *status, *progress, *online_button, *poke_button
    9696        guint status_id; 
    9797        gulong mailbox_select_sid; 
     
    277277                g_object_unref (G_OBJECT (device)); 
    278278        } 
     279} 
     280 
     281static void 
     282recurse_poke (TnyFolderStore *f_store) 
     283{ 
     284        TnyList *folders = tny_simple_list_new (); 
     285        TnyIterator *f_iter; 
     286 
     287        tny_folder_store_get_folders (TNY_FOLDER_STORE (f_store), folders, NULL, NULL); 
     288        f_iter = tny_list_create_iterator (folders); 
     289        while (!tny_iterator_is_done (f_iter)) 
     290        { 
     291                TnyFolder *f_cur = TNY_FOLDER (tny_iterator_get_current (f_iter)); 
     292 
     293                tny_folder_poke_status (f_cur); 
     294 
     295                if (TNY_IS_FOLDER_STORE (f_cur)) 
     296                        recurse_poke (TNY_FOLDER_STORE (f_cur)); 
     297 
     298                g_object_unref (f_cur); 
     299                tny_iterator_next (f_iter); 
     300        } 
     301        g_object_unref (f_iter); 
     302        g_object_unref (folders); 
     303} 
     304 
     305static void  
     306poke_button_toggled (GtkToggleButton *togglebutton, gpointer user_data) 
     307{ 
     308        TnySummaryView *self = user_data; 
     309        TnyDemouiSummaryViewPriv *priv = TNY_DEMOUI_SUMMARY_VIEW_GET_PRIVATE (self); 
     310        TnyList *accounts = tny_simple_list_new (); 
     311        TnyIterator *a_iter; 
     312 
     313        tny_account_store_get_accounts (priv->account_store, accounts,  
     314                TNY_ACCOUNT_STORE_STORE_ACCOUNTS); 
     315 
     316        a_iter = tny_list_create_iterator (accounts); 
     317 
     318        while (!tny_iterator_is_done (a_iter)) 
     319        { 
     320                TnyAccount *a_cur = TNY_ACCOUNT (tny_iterator_get_current (a_iter)); 
     321 
     322                recurse_poke (TNY_FOLDER_STORE (a_cur)); 
     323 
     324                g_object_unref (a_cur); 
     325                tny_iterator_next (a_iter); 
     326        } 
     327 
     328        g_object_unref (a_iter); 
     329        g_object_unref (accounts); 
    279330} 
    280331 
     
    13551406        priv->last_mailbox_correct_select_set = FALSE; 
    13561407        priv->online_button = gtk_toggle_button_new_with_label (GO_ONLINE_TXT); 
     1408        priv->poke_button = gtk_button_new_with_label ("Poke status"); 
    13571409        priv->current_accounts = NULL; 
    13581410 
    13591411        priv->online_button_signal = g_signal_connect (G_OBJECT (priv->online_button), "toggled",  
    13601412                G_CALLBACK (online_button_toggled), self); 
     1413 
     1414        g_signal_connect (G_OBJECT (priv->poke_button), "clicked",  
     1415                G_CALLBACK (poke_button_toggled), self); 
    13611416 
    13621417#if PLATFORM==1 
     
    13861441        gtk_box_pack_start (GTK_BOX (priv->status), priv->progress, FALSE, FALSE, 0); 
    13871442        gtk_box_pack_start (GTK_BOX (priv->status), priv->online_button, FALSE, FALSE, 0); 
     1443        gtk_box_pack_start (GTK_BOX (priv->status), priv->poke_button, FALSE, FALSE, 0); 
    13881444 
    13891445        gtk_widget_show (priv->online_button); 
     1446        gtk_widget_show (priv->poke_button); 
    13901447        gtk_widget_show (priv->status); 
    13911448        gtk_widget_show (GTK_WIDGET (vbox));