2004-02-04  Not Zed  <NotZed@Ximian.com>

        ** See bug #53683.

        * mail-ops.c (mail_sync_store): new async op to call
        CamelStore::sync.

        * mail-component.c (impl_requestQuit): implement, check to see if
        we can quit, or have open or unsent messages (and are in online
        mode).
        (impl_quit): implement.  Trigger off a sync of all open stores,
        and return FALSE until its done.
        (impl_upgradeFromVersion): fixed the signature to match the idl,
        killed that warning at last.

        ** See bug #53832.

        * em-folder-browser.c (emfb_folder_properties): only show this if
        we have a uri set.  Strictly, the menu item shouldn't be
        activated.

        ** See bug #53131.

        * em-folder-browser.c (em_folder_browser_show_preview): copy the
        message list's cursor_uid before calling set_message, since it can
        get freed during setting the message.

svn path=/trunk/; revision=24608
This commit is contained in:
Not Zed
2004-02-04 10:45:20 +00:00
committed by Michael Zucci
parent 0650e002ea
commit ef8a0762ac
5 changed files with 180 additions and 7 deletions
+27
View File
@@ -1,3 +1,30 @@
2004-02-04 Not Zed <NotZed@Ximian.com>
** See bug #53683.
* mail-ops.c (mail_sync_store): new async op to call
CamelStore::sync.
* mail-component.c (impl_requestQuit): implement, check to see if
we can quit, or have open or unsent messages (and are in online
mode).
(impl_quit): implement. Trigger off a sync of all open stores,
and return FALSE until its done.
(impl_upgradeFromVersion): fixed the signature to match the idl,
killed that warning at last.
** See bug #53832.
* em-folder-browser.c (emfb_folder_properties): only show this if
we have a uri set. Strictly, the menu item shouldn't be
activated.
** See bug #53131.
* em-folder-browser.c (em_folder_browser_show_preview): copy the
message list's cursor_uid before calling set_message, since it can
get freed during setting the message.
2004-02-03 Jeffrey Stedfast <fejj@ximian.com>
* em-folder-tree.c (tree_drag_data_received): Modified
+78 -3
View File
@@ -55,6 +55,8 @@
#include "mail-session.h"
#include "mail-offline-handler.h"
#include "composer/e-msg-composer.h"
#include "e-task-bar.h"
#include <gtk/gtklabel.h>
@@ -81,6 +83,10 @@ static BonoboObjectClass *parent_class = NULL;
struct _MailComponentPrivate {
GMutex *lock;
/* states/data used during shutdown */
enum { MC_QUIT_START, MC_QUIT_SYNC } quit_state;
int quit_count;
char *base_directory;
EMFolderTreeModel *model;
@@ -325,6 +331,8 @@ impl_dispose (GObject *object)
{
MailComponentPrivate *priv = MAIL_COMPONENT (object)->priv;
printf("mail dispose?\n");
if (priv->activity_handler != NULL) {
g_object_unref (priv->activity_handler);
priv->activity_handler = NULL;
@@ -357,7 +365,7 @@ static void
impl_finalize (GObject *object)
{
MailComponentPrivate *priv = MAIL_COMPONENT (object)->priv;
g_free (priv->base_directory);
mail_async_event_destroy (priv->async_event);
@@ -434,6 +442,71 @@ impl_createControls (PortableServer_Servant servant,
g_signal_connect (tree_widget, "folder-selected", G_CALLBACK (folder_selected_cb), view_widget);
}
static CORBA_boolean
impl_requestQuit(PortableServer_Servant servant, CORBA_Environment *ev)
{
/*MailComponent *mc = MAIL_COMPONENT(bonobo_object_from_servant(servant));*/
CamelFolder *folder;
if (!e_msg_composer_request_close_all())
return FALSE;
folder = mc_default_folders[MAIL_COMPONENT_FOLDER_OUTBOX].folder;
if (folder != NULL
&& camel_folder_get_message_count(folder) != 0
&& camel_session_is_online(session)) {
GtkWidget *dialog;
guint resp;
/* FIXME: HIG? */
dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_INFO, GTK_BUTTONS_YES_NO,
_("You have unsent messages, do you wish to quit anyway?"));
gtk_dialog_set_default_response((GtkDialog *)dialog, GTK_RESPONSE_NO);
resp = gtk_dialog_run((GtkDialog *)dialog);
gtk_widget_destroy(dialog);
if (resp != GTK_RESPONSE_YES)
return FALSE;
}
return TRUE;
}
static void
mc_quit_sync_done(CamelStore *store, void *data)
{
MailComponent *mc = data;
mc->priv->quit_count--;
}
static void
mc_quit_sync(CamelStore *store, char *name, MailComponent *mc)
{
int expunge = gconf_client_get_bool(mail_config_get_gconf_client(), "/apps/evolution/mail/trash/empty_on_exit", NULL);
mc->priv->quit_count++;
mail_sync_store(store, expunge, mc_quit_sync_done, mc);
}
static CORBA_boolean
impl_quit(PortableServer_Servant servant, CORBA_Environment *ev)
{
MailComponent *mc = MAIL_COMPONENT(bonobo_object_from_servant(servant));
switch (mc->priv->quit_state) {
case MC_QUIT_START:
g_hash_table_foreach(mc->priv->store_hash, (GHFunc)mc_quit_sync, mc);
mc->priv->quit_state = MC_QUIT_SYNC;
/* Falls through */
case MC_QUIT_SYNC:
return mc->priv->quit_count == 0;
/* What else do we need to do at quit time? */
}
return TRUE;
}
static GNOME_Evolution_CreatableItemTypeList *
impl__get_userCreatableItems (PortableServer_Servant servant, CORBA_Environment *ev)
{
@@ -489,8 +562,8 @@ impl_sendAndReceive (PortableServer_Servant servant, CORBA_Environment *ev)
mail_send_receive ();
}
static gboolean
impl_upgradeFromVersion (PortableServer_Servant servant, short major, short minor, short revision, CORBA_Environment *ev)
static CORBA_boolean
impl_upgradeFromVersion (PortableServer_Servant servant, const short major, const short minor, const short revision, CORBA_Environment *ev)
{
MailComponent *component;
CamelException ex;
@@ -521,6 +594,8 @@ mail_component_class_init (MailComponentClass *class)
object_class->finalize = impl_finalize;
epv->createControls = impl_createControls;
epv->requestQuit = impl_requestQuit;
epv->quit = impl_quit;
epv->_get_userCreatableItems = impl__get_userCreatableItems;
epv->requestCreateItem = impl_requestCreateItem;
epv->handleURI = impl_handleURI;
+70
View File
@@ -1571,6 +1571,76 @@ mail_sync_folder(CamelFolder *folder, void (*done) (CamelFolder *folder, void *d
e_thread_put(mail_thread_queued_slow, (EMsg *)m);
}
/* ** SYNC STORE ********************************************************* */
struct _sync_store_msg {
struct _mail_msg msg;
CamelStore *store;
int expunge;
void (*done) (CamelStore *store, void *data);
void *data;
};
static char *sync_store_desc(struct _mail_msg *mm, int done)
{
struct _sync_store_msg *m = (struct _sync_store_msg *)mm;
char *uri, *res;
uri = camel_url_to_string(((CamelService *)m->store)->url, CAMEL_URL_HIDE_ALL);
res = g_strdup_printf(m->expunge
?_("Expunging and storing account '%s'")
:_("Storing account '%s'"),
uri);
g_free(uri);
return res;
}
static void sync_store_sync(struct _mail_msg *mm)
{
struct _sync_store_msg *m = (struct _sync_store_msg *)mm;
camel_store_sync(m->store, m->expunge, &mm->ex);
}
static void sync_store_synced(struct _mail_msg *mm)
{
struct _sync_store_msg *m = (struct _sync_store_msg *)mm;
if (m->done)
m->done(m->store, m->data);
}
static void sync_store_free(struct _mail_msg *mm)
{
struct _sync_store_msg *m = (struct _sync_store_msg *)mm;
camel_object_unref(m->store);
}
static struct _mail_msg_op sync_store_op = {
sync_store_desc,
sync_store_sync,
sync_store_synced,
sync_store_free,
};
void
mail_sync_store(CamelStore *store, int expunge, void (*done) (CamelStore *store, void *data), void *data)
{
struct _sync_store_msg *m;
m = mail_msg_new(&sync_store_op, NULL, sizeof(*m));
m->store = store;
m->expunge = expunge;
camel_object_ref(store);
m->data = data;
m->done = done;
e_thread_put(mail_thread_queued_slow, (EMsg *)m);
}
/* ******************************************************************************** */
static char *refresh_folder_desc(struct _mail_msg *mm, int done)
+4 -2
View File
@@ -80,8 +80,10 @@ void mail_build_attachment (CamelFolder *folder, GPtrArray *uids,
void *data);
void mail_sync_folder (CamelFolder *folder,
void (*done) (CamelFolder *folder, void *data),
void *data);
void (*done) (CamelFolder *folder, void *data), void *data);
void mail_sync_store(CamelStore *store, int expunge,
void (*done) (CamelStore *store, void *data), void *data);
void mail_refresh_folder (CamelFolder *folder,
void (*done) (CamelFolder *folder, void *data),
+1 -2
View File
@@ -28,8 +28,6 @@
#include <string.h>
#include <libgnome/gnome-i18n.h>
#include "Evolution.h"
#include "mail-component.h"
#include "mail-vfolder.h"
#include "mail-tools.h"
@@ -38,6 +36,7 @@
#include "mail.h"
#include "mail-ops.h"
#include "mail-mt.h"
#include "em-utils.h"
#include "e-util/e-dialog-utils.h"