add a ref to input->storage here so that the ref/unref pattern more
2000-10-10 Chris Toshok <toshok@helixcode.com> * mail-ops.c (setup_scan_subfolders): add a ref to input->storage here so that the ref/unref pattern more closely matches other mail-ops. also, this keeps the storage from being freed when we hit the unref in cleanup_scan_subfolders, which is important because we maintain a reference to it in the storage_hash in component-factory.c * subscribe-dialog.h: add storage field. * subscribe-dialog.c (subscribe_folder_info): new function, subscribe to a folder given it's CamelFolderInfo, and add it to the shell - we're generating a path from the name of the folder which is bad. (unsubscribe_folder_info): same (except we unsubscribe and remove from the shell). (storage_selected_cb): unref the currently selected storage. (subscribe_dialog_destroy): unref the currently selected storage. (subscribe_dialog_construct): sc->storage = NULL. * component-factory.c (mail_lookup_storage): new function, to look up a EvolutionStorage corresponding to a CamelService. we ref the EvolutionStorage before passing it back. (mail_add_new_storage): insert the storage into storages_hash if result is EVOLUTION_STORAGE_OK. * mail.h: add prototype for mail_lookup_storage. svn path=/trunk/; revision=5830
This commit is contained in:
committed by
Chris Toshok
parent
6d26494925
commit
73f3bc0bd4
@ -1,3 +1,32 @@
|
||||
2000-10-10 Chris Toshok <toshok@helixcode.com>
|
||||
|
||||
* mail-ops.c (setup_scan_subfolders): add a ref to input->storage
|
||||
here so that the ref/unref pattern more closely matches other
|
||||
mail-ops. also, this keeps the storage from being freed when we
|
||||
hit the unref in cleanup_scan_subfolders, which is important
|
||||
because we maintain a reference to it in the storage_hash in
|
||||
component-factory.c
|
||||
|
||||
* subscribe-dialog.h: add storage field.
|
||||
|
||||
* subscribe-dialog.c (subscribe_folder_info): new function,
|
||||
subscribe to a folder given it's CamelFolderInfo, and add it to
|
||||
the shell - we're generating a path from the name of the folder
|
||||
which is bad.
|
||||
(unsubscribe_folder_info): same (except we unsubscribe and remove
|
||||
from the shell).
|
||||
(storage_selected_cb): unref the currently selected storage.
|
||||
(subscribe_dialog_destroy): unref the currently selected storage.
|
||||
(subscribe_dialog_construct): sc->storage = NULL.
|
||||
|
||||
* component-factory.c (mail_lookup_storage): new function, to look
|
||||
up a EvolutionStorage corresponding to a CamelService. we ref the
|
||||
EvolutionStorage before passing it back.
|
||||
(mail_add_new_storage): insert the storage into storages_hash if
|
||||
result is EVOLUTION_STORAGE_OK.
|
||||
|
||||
* mail.h: add prototype for mail_lookup_storage.
|
||||
|
||||
2000-10-10 Larry Ewing <lewing@helixcode.com>
|
||||
|
||||
* mail-format.c (mail_generate_reply): make sure we dup the return
|
||||
|
||||
@ -58,6 +58,7 @@ static void create_vfolder_storage (EvolutionShellComponent *shell_component);
|
||||
static BonoboGenericFactory *factory = NULL;
|
||||
static BonoboGenericFactory *summary_factory = NULL;
|
||||
static gint running_objects = 0;
|
||||
static GHashTable *storages_hash;
|
||||
|
||||
static const EvolutionShellComponentFolderType folder_types[] = {
|
||||
{ "mail", "evolution-inbox.png" },
|
||||
@ -148,6 +149,15 @@ owner_unset_cb (EvolutionShellComponent *shell_component, gpointer user_data)
|
||||
gtk_main_quit ();
|
||||
}
|
||||
|
||||
static void
|
||||
hash_foreach (gpointer key,
|
||||
gpointer value,
|
||||
gpointer data)
|
||||
{
|
||||
g_free (key);
|
||||
gtk_object_unref (GTK_OBJECT (value));
|
||||
}
|
||||
|
||||
static void
|
||||
factory_destroy (BonoboEmbeddable *embeddable,
|
||||
gpointer dummy)
|
||||
@ -162,6 +172,10 @@ factory_destroy (BonoboEmbeddable *embeddable,
|
||||
g_warning ("Serious ref counting error");
|
||||
factory = NULL;
|
||||
|
||||
g_hash_table_foreach (storages_hash, hash_foreach, NULL);
|
||||
g_hash_table_destroy (storages_hash);
|
||||
storages_hash = NULL;
|
||||
|
||||
gtk_main_quit ();
|
||||
}
|
||||
|
||||
@ -207,6 +221,7 @@ component_factory_init (void)
|
||||
|
||||
factory = bonobo_generic_factory_new (COMPONENT_FACTORY_ID, factory_fn, NULL);
|
||||
summary_factory = bonobo_generic_factory_new (SUMMARY_FACTORY_ID, summary_fn, NULL);
|
||||
storages_hash = g_hash_table_new (g_str_hash, g_str_equal);
|
||||
|
||||
if (factory == NULL) {
|
||||
e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
|
||||
@ -218,6 +233,11 @@ component_factory_init (void)
|
||||
e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
|
||||
_("Cannot initialize Evolution's mail summary component."));
|
||||
}
|
||||
|
||||
if (storages_hash == NULL) {
|
||||
e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
|
||||
_("Cannot initialize Evolution's mail storage hash."));
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME: remove */
|
||||
@ -304,12 +324,12 @@ mail_add_new_storage (const char *uri, Evolution_Shell corba_shell, CamelExcepti
|
||||
}
|
||||
|
||||
storage = evolution_storage_new (url->host);
|
||||
camel_url_free (url);
|
||||
|
||||
res = evolution_storage_register_on_shell (storage, corba_shell);
|
||||
|
||||
switch (res) {
|
||||
case EVOLUTION_STORAGE_OK:
|
||||
g_hash_table_insert (storages_hash, g_strdup(url->host), storage);
|
||||
mail_do_scan_subfolders (uri, storage);
|
||||
/* falllll */
|
||||
case EVOLUTION_STORAGE_ERROR_ALREADYREGISTERED:
|
||||
@ -320,4 +340,17 @@ mail_add_new_storage (const char *uri, Evolution_Shell corba_shell, CamelExcepti
|
||||
"mail_tool_add_new_storage: Cannot register storage on shell");
|
||||
break;
|
||||
}
|
||||
|
||||
camel_url_free (url);
|
||||
}
|
||||
|
||||
EvolutionStorage*
|
||||
mail_lookup_storage (CamelService *service)
|
||||
{
|
||||
EvolutionStorage *storage = g_hash_table_lookup (storages_hash, service->url->host);
|
||||
|
||||
if (storage)
|
||||
gtk_object_ref (GTK_OBJECT (storage));
|
||||
|
||||
return storage;
|
||||
}
|
||||
|
||||
@ -1254,6 +1254,8 @@ setup_scan_subfolders (gpointer in_data, gpointer op_data,
|
||||
|
||||
gtk_object_ref (GTK_OBJECT (input->storage));
|
||||
data->new_folders = g_ptr_array_new ();
|
||||
|
||||
gtk_object_ref (GTK_OBJECT(input->storage));
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@ -26,6 +26,7 @@
|
||||
#include "mail-config.h"
|
||||
#include "mail-config-gui.h"
|
||||
#include "folder-browser.h"
|
||||
#include "shell/evolution-storage.h"
|
||||
|
||||
extern char *evolution_dir;
|
||||
|
||||
@ -116,6 +117,8 @@ GtkWidget *mail_view_create (CamelFolder *source, const char *uid, CamelMimeMess
|
||||
/*takes a GSList of MailConfigServices */
|
||||
void mail_load_storages (Evolution_Shell corba_shell, GSList *sources);
|
||||
void mail_add_new_storage (const char *uri, Evolution_Shell corba_shell, CamelException *ex);
|
||||
/* used in the subscribe dialog code */
|
||||
EvolutionStorage* mail_lookup_storage (CamelService *service);
|
||||
|
||||
/* session */
|
||||
void session_init (void);
|
||||
|
||||
@ -135,6 +135,38 @@ make_folder_search_widget (GtkSignalFunc start_search_func,
|
||||
|
||||
|
||||
|
||||
static void
|
||||
subscribe_folder_info (SubscribeDialog *sc, CamelFolderInfo *info)
|
||||
{
|
||||
char *path;
|
||||
|
||||
path = g_strdup_printf ("/%s", info->full_name); /* XXX */
|
||||
|
||||
camel_store_subscribe_folder (sc->store, info->name, NULL);
|
||||
|
||||
evolution_storage_new_folder (sc->storage,
|
||||
path,
|
||||
info->name, "mail",
|
||||
info->url,
|
||||
_("(No description)") /* XXX */);
|
||||
|
||||
g_free (path);
|
||||
}
|
||||
|
||||
static void
|
||||
unsubscribe_folder_info (SubscribeDialog *sc, CamelFolderInfo *info)
|
||||
{
|
||||
char *path;
|
||||
|
||||
path = g_strdup_printf ("/%s", info->full_name); /* XXX */
|
||||
|
||||
camel_store_unsubscribe_folder (sc->store, info->name, NULL);
|
||||
|
||||
evolution_storage_removed_folder (sc->storage, path);
|
||||
|
||||
g_free (path);
|
||||
}
|
||||
|
||||
static void
|
||||
subscribe_close (BonoboUIComponent *uic,
|
||||
void *user_data, const char *path)
|
||||
@ -166,19 +198,12 @@ subscribe_folder_foreach (int model_row, gpointer closure)
|
||||
printf ("subscribe: row %d, node_data %p\n", model_row,
|
||||
e_tree_model_node_get_data (sc->folder_model, node));
|
||||
|
||||
if (!camel_store_folder_subscribed (sc->store, info->name)) {
|
||||
camel_store_subscribe_folder (sc->store, info->name, NULL);
|
||||
#if 0
|
||||
/* we need to remove it from the shell */
|
||||
evolution_storage_removed_folder (sc->storage, info->name);
|
||||
#endif
|
||||
|
||||
e_tree_model_node_changed (sc->folder_model, node);
|
||||
}
|
||||
if (!camel_store_folder_subscribed (sc->store, info->name))
|
||||
subscribe_folder_info (sc, info);
|
||||
}
|
||||
|
||||
static void
|
||||
subscribe_folder (GtkWidget *widget, gpointer user_data)
|
||||
subscribe_folders (GtkWidget *widget, gpointer user_data)
|
||||
{
|
||||
SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data);
|
||||
|
||||
@ -196,21 +221,13 @@ unsubscribe_folder_foreach (int model_row, gpointer closure)
|
||||
printf ("unsubscribe: row %d, node_data %p\n", model_row,
|
||||
e_tree_model_node_get_data (sc->folder_model, node));
|
||||
|
||||
if (camel_store_folder_subscribed (sc->store, info->name)) {
|
||||
camel_store_unsubscribe_folder (sc->store, info->name, NULL);
|
||||
|
||||
#if 0
|
||||
/* we need to remove it from the shell */
|
||||
evolution_storage_removed_folder (sc->storage, info->name);
|
||||
#endif
|
||||
|
||||
e_tree_model_node_changed (sc->folder_model, node);
|
||||
}
|
||||
if (camel_store_folder_subscribed (sc->store, info->name))
|
||||
unsubscribe_folder_info (sc, info);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
unsubscribe_folder (GtkWidget *widget, gpointer user_data)
|
||||
unsubscribe_folders (GtkWidget *widget, gpointer user_data)
|
||||
{
|
||||
SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data);
|
||||
|
||||
@ -392,7 +409,7 @@ store_etable_value_at (ETableModel *etm, int col, int row, void *data)
|
||||
SubscribeDialog *sc = SUBSCRIBE_DIALOG (data);
|
||||
CamelStore *store = (CamelStore*)g_list_nth_data (sc->store_list, row);
|
||||
|
||||
return camel_service_get_name (CAMEL_SERVICE (store), FALSE);
|
||||
return camel_service_get_name (CAMEL_SERVICE (store), TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -466,8 +483,11 @@ storage_selected_cb (ETable *table,
|
||||
/* free up the existing CamelFolderInfo* if there is any */
|
||||
if (sc->folder_info)
|
||||
camel_store_free_folder_info (sc->store, sc->folder_info);
|
||||
if (sc->storage)
|
||||
gtk_object_unref (GTK_OBJECT (sc->storage));
|
||||
|
||||
sc->store = store;
|
||||
sc->storage = mail_lookup_storage (CAMEL_SERVICE (sc->store));
|
||||
sc->folder_info = camel_store_get_folder_info (sc->store, NULL, TRUE, TRUE, FALSE, ex);
|
||||
|
||||
if (camel_exception_is_set (ex)) {
|
||||
@ -497,21 +517,10 @@ folder_toggle_cb (ETable *table,
|
||||
ETreePath *node = e_tree_model_node_at_row (sc->folder_model, row);
|
||||
CamelFolderInfo *info = e_tree_model_node_get_data (sc->folder_model, node);
|
||||
|
||||
if (camel_store_folder_subscribed (sc->store, info->name)) {
|
||||
camel_store_unsubscribe_folder (sc->store, info->name, NULL);
|
||||
|
||||
#if 0
|
||||
/* we need to remove it from the shell */
|
||||
evolution_storage_removed_folder (sc->storage, info->name);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
camel_store_subscribe_folder (sc->store, info->name, NULL);
|
||||
#if 0
|
||||
/* we need to remove it from the shell */
|
||||
evolution_storage_removed_folder (sc->storage, info->name);
|
||||
#endif
|
||||
}
|
||||
if (camel_store_folder_subscribed (sc->store, info->name))
|
||||
subscribe_folder_info (sc, info);
|
||||
else
|
||||
unsubscribe_folder_info (sc, info);
|
||||
|
||||
e_tree_model_node_changed (sc->folder_model, node);
|
||||
}
|
||||
@ -532,8 +541,8 @@ static BonoboUIVerb verbs [] = {
|
||||
BONOBO_UI_UNSAFE_VERB ("EditUnSelectAll", subscribe_unselect_all),
|
||||
|
||||
/* Folder Menu / Toolbar */
|
||||
BONOBO_UI_UNSAFE_VERB ("SubscribeFolder", subscribe_folder),
|
||||
BONOBO_UI_UNSAFE_VERB ("UnsubscribeFolder", unsubscribe_folder),
|
||||
BONOBO_UI_UNSAFE_VERB ("SubscribeFolder", subscribe_folders),
|
||||
BONOBO_UI_UNSAFE_VERB ("UnsubscribeFolder", unsubscribe_folders),
|
||||
|
||||
/* Toolbar Specific */
|
||||
BONOBO_UI_UNSAFE_VERB ("RefreshList", subscribe_refresh_list),
|
||||
@ -778,6 +787,10 @@ subscribe_dialog_destroy (GtkObject *object)
|
||||
gtk_object_unref (GTK_OBJECT (sc->store_model));
|
||||
g_list_foreach (sc->store_list, (GFunc)gtk_object_unref, NULL);
|
||||
|
||||
/* free our storage */
|
||||
if (sc->storage)
|
||||
gtk_object_unref (GTK_OBJECT (sc->storage));
|
||||
|
||||
subscribe_dialog_parent_class->destroy (object);
|
||||
}
|
||||
|
||||
@ -804,6 +817,7 @@ subscribe_dialog_construct (GtkObject *object, Evolution_Shell shell)
|
||||
*/
|
||||
sc->shell = shell;
|
||||
sc->store = NULL;
|
||||
sc->storage = NULL;
|
||||
sc->folder_info = NULL;
|
||||
sc->store_list = NULL;
|
||||
|
||||
|
||||
@ -11,8 +11,7 @@
|
||||
#include <bonobo/bonobo-control.h>
|
||||
#include <bonobo/bonobo-ui-compat.h>
|
||||
#include <bonobo/bonobo-property-bag.h>
|
||||
#include "shell/Evolution.h"
|
||||
#include "shell/evolution-storage-set-view-listener.h"
|
||||
#include "shell/evolution-storage.h"
|
||||
|
||||
#define SUBSCRIBE_DIALOG_TYPE (subscribe_dialog_get_type ())
|
||||
#define SUBSCRIBE_DIALOG(o) (GTK_CHECK_CAST ((o), SUBSCRIBE_DIALOG_TYPE, SubscribeDialog))
|
||||
@ -39,6 +38,7 @@ struct _SubscribeDialog {
|
||||
ETreePath *folder_root;
|
||||
|
||||
CamelStore *store;
|
||||
EvolutionStorage *storage;
|
||||
CamelFolderInfo *folder_info;
|
||||
|
||||
GList *store_list;
|
||||
|
||||
Reference in New Issue
Block a user