Files
evolution/mail/folder-info.c
Not Zed ce2082b3ee If we dont get a folder, dont try and get details off it. Should get rid
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
2002-06-11 04:54:17 +00:00

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);
}
}