/* * 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-mt.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 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 = { NULL, 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)); } me/refs/?h=mate-1.16&id=d6bd1bd9fcc81eeaf85e99ca73da4507830dae7a'>refs</a><a class='active' href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/www/pear-Text_Wiki?h=mate-1.16'>log</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/tree/www/pear-Text_Wiki?h=mate-1.16&id=d6bd1bd9fcc81eeaf85e99ca73da4507830dae7a'>tree</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/www/pear-Text_Wiki?h=mate-1.16&id=d6bd1bd9fcc81eeaf85e99ca73da4507830dae7a'>commit</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/diff/www/pear-Text_Wiki?h=mate-1.16&id=d6bd1bd9fcc81eeaf85e99ca73da4507830dae7a'>diff</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/stats/www/pear-Text_Wiki?h=mate-1.16'>stats</a></td><td class='form'><form class='right' method='get' action='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/www/pear-Text_Wiki'> <input type='hidden' name='h' value='mate-1.16'/><input type='hidden' name='id' value='d6bd1bd9fcc81eeaf85e99ca73da4507830dae7a'/><select name='qt'> <option value='grep'>log msg</option> <option value='author'>author</option> <option value='committer'>committer</option> <option value='range'>range</option> </select> <input class='txt' type='search' size='10' name='q' value=''/> <input type='submit' value='search'/> </form> </td></tr></table> <div class='path'>path: <a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/?h=mate-1.16&id=d6bd1bd9fcc81eeaf85e99ca73da4507830dae7a'>root</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/www?h=mate-1.16&id=d6bd1bd9fcc81eeaf85e99ca73da4507830dae7a'>www</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/www/pear-Text_Wiki?h=mate-1.16&id=d6bd1bd9fcc81eeaf85e99ca73da4507830dae7a'>pear-Text_Wiki</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th></th><th class='left'>Commit message (<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/www/pear-Text_Wiki?h=mate-1.16&id=d6bd1bd9fcc81eeaf85e99ca73da4507830dae7a&showmsg=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Age</th><th class='left'>Files</th><th class='left'>Lines</th></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/www/pear-Text_Wiki?h=mate-1.16&id=d2b6b0d541bdd9c610a027e270848b504d414dec'>- Update to 1.0.3</a></td><td>pav</td><td><span title='2006-01-12 02:56:57 +0800'>2006-01-12</span>