aboutsummaryrefslogblamecommitdiffstats
path: root/mail/folder-info.c
blob: c34d21efd411501fceef806f12582a751cdc7db0 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

















                                                              
                 
                    


                               






























                                                                   

                                                     





                                                          





























































































                                                                                        
                         



















































































                                                                               
/*
 * folder-info.c: Implementation of GNOME_Evolution_FolderInfo
 *
 * Copyright (C) 2001 Ximian, Inc.
 *
 * Authors: Iain Holmes  <iain@ximian.com>
 */

#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-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;

typedef struct _EvolutionFolderInfo EvolutionFolderInfo;
typedef struct _EvolutionFolderInfoClass EvolutionFolderInfoClass;

struct _EvolutionFolderInfo {
    BonoboXObject parent;
};

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

static GtkType evolution_folder_info_get_type (void);

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;
    char *uri_dup;
    char *foldername, *start, *end;
    char *storage, *protocol, *uri;
    CamelFolder *folder;
    CamelException *ex;
#if 0
    /* Fixme: Do other stuff. Different stuff to the stuff below */
    uri_dup = g_strdup (m->foldername);
    start = uri_dup + 11;
    g_warning ("Start: %s", start);

    end = strrchr (start, '/');
    if (end == NULL) {
        g_warning ("Bugger");
        return;
    }

    storage = g_strndup (start, end - start);
    start = end + 1;
    foldername = g_strdup (start);

    g_free (uri_dup);

    /* Work out the protocol.
       The storage is going to start as local, or vfolder, or an imap
       server. */
    g_warning ("Storage: %s", storage);
    if (strncmp (storage, "local", 5) == 0) {
        char *evolution_dir;
        char *proto;

        evolution_dir = gnome_util_prepend_user_home ("evolution/local");
        proto = g_strconcat ("file://", evolution_dir, NULL);
        uri = e_path_to_physical (proto, foldername);
        g_free (evolution_dir);
        g_free (proto);

    } else if (strncmp (storage, "vfolder", 7) == 0) {
        uri = g_strconcat ("vfolder://", foldername, NULL);
    } else {
        uri = g_strconcat ("imap://", storage, foldername, NULL);
    }
#endif

    ex = camel_exception_new ();
    folder = mail_tool_uri_to_folder (m->foldername, ex);
    if (camel_exception_is_set (ex)) {
        g_warning ("Camel exception: %s", camel_exception_get_description (ex));
    }

    camel_exception_free (ex);

    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;

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

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

static BonoboObject *
evolution_folder_info_factory_fn (BonoboGenericFactory *factory,
                  void *closure)
{
    EvolutionFolderInfo *info;

    info = gtk_type_new (evolution_folder_info_get_type ());
    return BONOBO_OBJECT (info);
}

void 
evolution_folder_info_factory_init (void)
{
    BonoboGenericFactory *factory;
    
    factory = bonobo_generic_factory_new (FOLDER_INFO_IID,
                          evolution_folder_info_factory_fn,
                          NULL);

    if (factory == NULL) {
        g_warning ("Error starting FolderInfo");
        return;
    }

    bonobo_running_context_auto_exit_unref (BONOBO_OBJECT (factory));
}