2002-06-11 Not Zed <NotZed@Ximian.com> * folder-info.c (do_get_info): If we dont get a folder, dont try and get details off it. Should get rid of most of those annoying summary warnings, but not the cause of them. 2002-06-06 Not Zed <NotZed@Ximian.com> * message-list.c (mail_regen_list): Keep track of the regeneration request in a list. (regen_list_free): Remove the request from the regenreation list. (message_list_set_folder): If there are any outstanding regneration requests, cancel them. (regen_list_regened): If we were cancelled, do nothing. (regen_list_regen): If we were cancelled, shortcut processing. This is all for #23571. * message-list.c (regen_list_regen): Change the way we calculate the hide deleted messages and tree view options. Do it based on a search and uid's rather than a summary. (regen_list_regened): Handle changes to tree storage. (mail_regen_list): The tree is now stored between updates, so we can update the tree structure incrementally. This blows out memory use some however. We need an etree that uses this as its model directly? (message_list_destroy): Free the thread tree. (message_list_set_folder): Clear the thread tree when changing folder. svn path=/trunk/; revision=17165
297 lines
6.2 KiB
C
297 lines
6.2 KiB
C
/*
|
|
* folder-info.c: Implementation of GNOME_Evolution_FolderInfo
|
|
*
|
|
* Copyright (C) 2001 Ximian, Inc.
|
|
*
|
|
* Authors: Iain Holmes <iain@ximian.com>
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif
|
|
|
|
#include "folder-info.h"
|
|
|
|
#include "Mail.h"
|
|
|
|
#include <glib.h>
|
|
#include <libgnome/gnome-defs.h>
|
|
|
|
#include <bonobo/bonobo-xobject.h>
|
|
#include <bonobo/bonobo-generic-factory.h>
|
|
#include <bonobo/bonobo-property-bag.h>
|
|
#include <bonobo/bonobo-context.h>
|
|
#include <bonobo/bonobo-exception.h>
|
|
|
|
#include "mail.h"
|
|
#include "mail-mt.h"
|
|
#include "mail-tools.h"
|
|
|
|
#include <camel/camel-folder.h>
|
|
#include <camel/camel-exception.h>
|
|
|
|
#define FOLDER_INFO_IID "OAFIID:GNOME_Evolution_FolderInfo_Factory"
|
|
|
|
#define PARENT_TYPE BONOBO_X_OBJECT_TYPE
|
|
static BonoboObjectClass *parent_class = NULL;
|
|
|
|
static GSList *folder_infos;
|
|
|
|
typedef struct _EvolutionFolderInfo EvolutionFolderInfo;
|
|
typedef struct _EvolutionFolderInfoClass EvolutionFolderInfoClass;
|
|
|
|
struct _EvolutionFolderInfo {
|
|
BonoboXObject parent;
|
|
|
|
BonoboPropertyBag *pb;
|
|
};
|
|
|
|
struct _EvolutionFolderInfoClass {
|
|
BonoboXObjectClass parent_class;
|
|
|
|
POA_GNOME_Evolution_FolderInfo__epv epv;
|
|
};
|
|
|
|
/* MT stuff */
|
|
struct _folder_info_msg {
|
|
struct _mail_msg msg;
|
|
|
|
Bonobo_Listener listener;
|
|
char *foldername;
|
|
|
|
int read;
|
|
int unread;
|
|
};
|
|
|
|
gboolean ready;
|
|
|
|
static char *
|
|
do_describe_info (struct _mail_msg *mm, gint complete)
|
|
{
|
|
return g_strdup (_("Getting Folder Information"));
|
|
}
|
|
|
|
static void
|
|
do_get_info (struct _mail_msg *mm)
|
|
{
|
|
struct _folder_info_msg *m = (struct _folder_info_msg *) mm;
|
|
CamelFolder *folder;
|
|
|
|
folder = mail_tool_uri_to_folder (m->foldername, 0, NULL);
|
|
if (folder) {
|
|
m->read = camel_folder_get_message_count (folder);
|
|
m->unread = camel_folder_get_unread_message_count (folder);
|
|
}
|
|
}
|
|
|
|
static void
|
|
do_got_info (struct _mail_msg *mm)
|
|
{
|
|
struct _folder_info_msg *m = (struct _folder_info_msg *) mm;
|
|
CORBA_Environment ev;
|
|
CORBA_any a;
|
|
GNOME_Evolution_FolderInfo_MessageCount count;
|
|
|
|
/* g_print ("You've got mail: %d, %d\n", m->read, m->unread); */
|
|
|
|
count.path = m->foldername;
|
|
count.count = m->read;
|
|
count.unread = m->unread;
|
|
|
|
a._type = (CORBA_TypeCode) TC_GNOME_Evolution_FolderInfo_MessageCount;
|
|
a._value = &count;
|
|
|
|
CORBA_exception_init (&ev);
|
|
Bonobo_Listener_event (m->listener, "youve-got-mail", &a, &ev);
|
|
if (BONOBO_EX (&ev)) {
|
|
g_warning ("Got exception on listener: %s", CORBA_exception_id (&ev));
|
|
}
|
|
CORBA_exception_free (&ev);
|
|
}
|
|
|
|
static void
|
|
do_free_info (struct _mail_msg *mm)
|
|
{
|
|
struct _folder_info_msg *m = (struct _folder_info_msg *) mm;
|
|
|
|
bonobo_object_release_unref (m->listener, NULL);
|
|
g_free (m->foldername);
|
|
}
|
|
|
|
struct _mail_msg_op get_info_op = {
|
|
do_describe_info,
|
|
do_get_info,
|
|
do_got_info,
|
|
do_free_info,
|
|
};
|
|
|
|
typedef struct {
|
|
int read;
|
|
int unread;
|
|
} MailFolderInfo;
|
|
|
|
/* Returns a MailFolderInfo struct or NULL on error */
|
|
static void
|
|
mail_get_info (const char *foldername,
|
|
Bonobo_Listener listener)
|
|
{
|
|
CORBA_Environment ev;
|
|
struct _folder_info_msg *m;
|
|
|
|
m = mail_msg_new (&get_info_op, NULL, sizeof (*m));
|
|
|
|
/* g_print ("Folder: %s", foldername); */
|
|
m->foldername = g_strdup (foldername);
|
|
|
|
CORBA_exception_init (&ev);
|
|
m->listener = bonobo_object_dup_ref (listener, &ev);
|
|
CORBA_exception_free (&ev);
|
|
|
|
e_thread_put (mail_thread_new, (EMsg *) m);
|
|
}
|
|
|
|
static void
|
|
impl_GNOME_Evolution_FolderInfo_getInfo (PortableServer_Servant servant,
|
|
const CORBA_char *foldername,
|
|
const Bonobo_Listener listener,
|
|
CORBA_Environment *ev)
|
|
{
|
|
mail_get_info (foldername, listener);
|
|
}
|
|
|
|
#if 0
|
|
static void
|
|
destroy (GtkObject *object)
|
|
{
|
|
EvolutionFolderInfo *info = (EvolutionFolderInfo *) object;
|
|
|
|
bonobo_object_unref (BONOBO_OBJECT (info->pb));
|
|
}
|
|
#endif
|
|
|
|
static void
|
|
evolution_folder_info_class_init (EvolutionFolderInfoClass *klass)
|
|
{
|
|
POA_GNOME_Evolution_FolderInfo__epv *epv = &klass->epv;
|
|
|
|
parent_class = gtk_type_class (PARENT_TYPE);
|
|
epv->getInfo = impl_GNOME_Evolution_FolderInfo_getInfo;
|
|
}
|
|
|
|
static void
|
|
evolution_folder_info_init (EvolutionFolderInfo *info)
|
|
{
|
|
}
|
|
|
|
BONOBO_X_TYPE_FUNC_FULL (EvolutionFolderInfo,
|
|
GNOME_Evolution_FolderInfo,
|
|
PARENT_TYPE,
|
|
evolution_folder_info);
|
|
|
|
enum {
|
|
PROP_FOLDER_INFO_READY
|
|
};
|
|
|
|
static void
|
|
set_prop (BonoboPropertyBag *bag,
|
|
const BonoboArg *arg,
|
|
guint arg_id,
|
|
CORBA_Environment *ev,
|
|
gpointer user_data)
|
|
{
|
|
g_print ("Set!\n");
|
|
switch (arg_id) {
|
|
case PROP_FOLDER_INFO_READY:
|
|
ready = BONOBO_ARG_GET_BOOLEAN (arg);
|
|
break;
|
|
|
|
default:
|
|
bonobo_exception_set (ev, ex_Bonobo_PropertyBag_NotFound);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void
|
|
get_prop (BonoboPropertyBag *bag,
|
|
BonoboArg *arg,
|
|
guint arg_id,
|
|
CORBA_Environment *ev,
|
|
gpointer user_data)
|
|
{
|
|
g_print ("Get!\n");
|
|
switch (arg_id) {
|
|
case PROP_FOLDER_INFO_READY:
|
|
BONOBO_ARG_SET_BOOLEAN (arg, ready);
|
|
break;
|
|
|
|
default:
|
|
bonobo_exception_set (ev, ex_Bonobo_PropertyBag_NotFound);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static BonoboObject *
|
|
evolution_folder_info_factory_fn (BonoboGenericFactory *factory,
|
|
void *closure)
|
|
{
|
|
EvolutionFolderInfo *info;
|
|
BonoboPropertyBag *pb;
|
|
|
|
info = gtk_type_new (evolution_folder_info_get_type ());
|
|
pb = bonobo_property_bag_new (get_prop, set_prop, info);
|
|
info->pb = pb;
|
|
/* Add properties */
|
|
bonobo_property_bag_add (pb, "folder-info-ready",
|
|
PROP_FOLDER_INFO_READY,
|
|
BONOBO_ARG_BOOLEAN, NULL, FALSE,
|
|
BONOBO_PROPERTY_READABLE |
|
|
BONOBO_PROPERTY_WRITEABLE);
|
|
|
|
bonobo_object_add_interface (BONOBO_OBJECT (info), BONOBO_OBJECT (pb));
|
|
|
|
/* Add to the folder info list so we can get at them all afterwards */
|
|
folder_infos = g_slist_append (folder_infos, info);
|
|
|
|
return BONOBO_OBJECT (info);
|
|
}
|
|
|
|
gboolean
|
|
evolution_folder_info_factory_init (void)
|
|
{
|
|
BonoboGenericFactory *factory;
|
|
|
|
folder_infos = NULL;
|
|
ready = FALSE;
|
|
|
|
factory = bonobo_generic_factory_new (FOLDER_INFO_IID,
|
|
evolution_folder_info_factory_fn,
|
|
NULL);
|
|
|
|
if (factory == NULL) {
|
|
g_warning ("Error starting FolderInfo");
|
|
return FALSE;
|
|
}
|
|
|
|
bonobo_running_context_auto_exit_unref (BONOBO_OBJECT (factory));
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
evolution_folder_info_notify_ready (void)
|
|
{
|
|
GSList *p;
|
|
|
|
ready = TRUE;
|
|
|
|
for (p = folder_infos; p; p = p->next) {
|
|
BonoboArg arg;
|
|
CORBA_boolean b = ready;
|
|
EvolutionFolderInfo *info = p->data;
|
|
|
|
arg._value = &b;
|
|
arg._type = (CORBA_TypeCode) TC_boolean;
|
|
bonobo_property_bag_set_value (BONOBO_PROPERTY_BAG (info->pb),
|
|
"folder-info-ready", &arg, NULL);
|
|
}
|
|
}
|