Fixed a refcount leak and added interfaces to add/remove folders
from an EStorage (although they are not implemented yet). svn path=/trunk/; revision=3460
This commit is contained in:
@ -1,3 +1,70 @@
|
||||
2000-06-07 Ettore Perazzoli <ettore@helixcode.com>
|
||||
|
||||
* e-storage.c (folder_destroy): Don't destroy the subfolders.
|
||||
(remove_folder): New helper function.
|
||||
(free_private): Use it.
|
||||
(e_storage_removed_folder): Use it here too.
|
||||
(folder_destroy): Don't unref the EFolder if NULL.
|
||||
|
||||
* e-storage-set-view.c (e_storage_set_view_construct): Use
|
||||
`gtk_signal_connect_while_alive()' instead of just
|
||||
`gtk_signal_connect()' so that the signal handler is automatically
|
||||
removed when we are destroyed.
|
||||
|
||||
* e-storage-set.c (e_storage_set_remove_all_storages): New
|
||||
function.
|
||||
|
||||
* e-shell-view.c (e_shell_view_construct): Use `bonobo_object_ref'
|
||||
on the shell instead of `gtk_object_ref'.
|
||||
(destroy): Unref the shell.
|
||||
|
||||
* e-local-storage.h: #include "e-component-registry.h".
|
||||
|
||||
* e-shell.c (setup_local_storage): Renamed from `setup_storages'.
|
||||
Only set up the local storage, not the CORBA one, and don't create
|
||||
the storage set.
|
||||
(e_shell_construct): Create the storage set here instead. Call
|
||||
`setup_local_storage' after setting up the components.
|
||||
|
||||
* e-local-storage.c: New member `component_registry' in
|
||||
`ELocalStoragePrivate'.
|
||||
(init): Init to NULL.
|
||||
(destroy): If not null, unref it.
|
||||
(e_local_storage_open): New arg @component_registry.
|
||||
(construct): New arg @component_registry. Init
|
||||
`priv->component_registry' from it.
|
||||
|
||||
* e-local-storage.c (impl_get_name): Renamed from `get_name'.
|
||||
(impl_create_folder): New function, implementing
|
||||
`EStorage::create_folder'. Just a stub for now.
|
||||
(impl_remove_folder): New function, implementing
|
||||
`EStorage::remove_folder'. Just a stub for now.
|
||||
(class_init): Install these stub implementations.
|
||||
|
||||
* e-storage.c (e_storage_remove_folder): New function.
|
||||
(e_storage_create_folder): New function.
|
||||
(impl_create_folder): New function, default implementation for
|
||||
`::create_folder'.
|
||||
(impl_remove_folder): New function, default implementation for
|
||||
`::remove_folder'.
|
||||
(class_init): Install the implementations.
|
||||
|
||||
* e-storage.c (impl_get_name): Renamed from `get_name'.
|
||||
(impl_get_folder): Renamed from `get_folder'.
|
||||
(impl_list_folders): Renamed from `list_folders'.
|
||||
|
||||
* e-storage.h: New virtual methods `remove_folder',
|
||||
`create_folder'.
|
||||
|
||||
* e-storage.c (e_storage_removed_folder): Renamed from
|
||||
`e_storage_remove_folder'.
|
||||
* e-corba-storage.c (impl_StorageListener_removed_folder): Updated
|
||||
accordingly.
|
||||
|
||||
2000-06-02 Ettore Perazzoli <ettore@helixcode.com>
|
||||
|
||||
* e-shell-view.c (setup_bonobo_ui_handler): Create the default toolbar.
|
||||
|
||||
2000-06-02 Jeffrey Stedfast <fejj@helixcode.com>
|
||||
|
||||
* e-shell-view-menu.c: Changed "Using the Shell" to "Getting Started"
|
||||
|
||||
@ -134,7 +134,7 @@ impl_StorageListener_removed_folder (PortableServer_Servant servant,
|
||||
storage_listener_servant = (StorageListenerServant *) servant;
|
||||
storage = storage_listener_servant->storage;
|
||||
|
||||
if (! e_storage_remove_folder (storage, path))
|
||||
if (! e_storage_removed_folder (storage, path))
|
||||
CORBA_exception_set (ev,
|
||||
CORBA_USER_EXCEPTION,
|
||||
ex_Evolution_StorageListener_NotFound,
|
||||
|
||||
@ -54,6 +54,7 @@ static EStorageClass *parent_class = NULL;
|
||||
#define SUBFOLDER_DIR_NAME_LEN 10
|
||||
|
||||
struct _ELocalStoragePrivate {
|
||||
EComponentRegistry *component_registry;
|
||||
char *base_path;
|
||||
};
|
||||
|
||||
@ -233,7 +234,7 @@ load_all_folders (ELocalStorage *local_storage)
|
||||
/* GtkObject methods. */
|
||||
|
||||
static void
|
||||
destroy (GtkObject *object)
|
||||
impl_destroy (GtkObject *object)
|
||||
{
|
||||
ELocalStorage *local_storage;
|
||||
ELocalStoragePrivate *priv;
|
||||
@ -242,6 +243,10 @@ destroy (GtkObject *object)
|
||||
priv = local_storage->priv;
|
||||
|
||||
g_free (priv->base_path);
|
||||
|
||||
if (priv->component_registry != NULL)
|
||||
gtk_object_unref (GTK_OBJECT (priv->component_registry));
|
||||
|
||||
g_free (priv);
|
||||
|
||||
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
|
||||
@ -251,12 +256,36 @@ destroy (GtkObject *object)
|
||||
/* EStorage methods. */
|
||||
|
||||
static const char *
|
||||
get_name (EStorage *storage)
|
||||
impl_get_name (EStorage *storage)
|
||||
{
|
||||
/* FIXME this sucks. */
|
||||
return "local";
|
||||
}
|
||||
|
||||
static void
|
||||
impl_create_folder (EStorage *storage,
|
||||
const char *path,
|
||||
const char *type,
|
||||
const char *description,
|
||||
EStorageResultCallback callback,
|
||||
void *data)
|
||||
{
|
||||
ELocalStorage *local_storage;
|
||||
|
||||
local_storage = E_LOCAL_STORAGE (storage);
|
||||
}
|
||||
|
||||
static void
|
||||
impl_remove_folder (EStorage *storage,
|
||||
const char *path,
|
||||
EStorageResultCallback callback,
|
||||
void *data)
|
||||
{
|
||||
ELocalStorage *local_storage;
|
||||
|
||||
local_storage = E_LOCAL_STORAGE (storage);
|
||||
}
|
||||
|
||||
|
||||
/* Initialization. */
|
||||
|
||||
@ -266,13 +295,15 @@ class_init (ELocalStorageClass *class)
|
||||
EStorageClass *storage_class;
|
||||
GtkObjectClass *object_class;
|
||||
|
||||
parent_class = gtk_type_class (e_storage_get_type ());
|
||||
|
||||
object_class = GTK_OBJECT_CLASS (class);
|
||||
object_class->destroy = destroy;
|
||||
|
||||
parent_class = gtk_type_class (e_storage_get_type ());
|
||||
object_class = GTK_OBJECT_CLASS (class);
|
||||
storage_class = E_STORAGE_CLASS (class);
|
||||
storage_class->get_name = get_name;
|
||||
|
||||
object_class->destroy = impl_destroy;
|
||||
|
||||
storage_class->get_name = impl_get_name;
|
||||
storage_class->create_folder = impl_create_folder;
|
||||
storage_class->remove_folder = impl_remove_folder;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -282,7 +313,8 @@ init (ELocalStorage *local_storage)
|
||||
|
||||
priv = g_new (ELocalStoragePrivate, 1);
|
||||
|
||||
priv->base_path = NULL;
|
||||
priv->base_path = NULL;
|
||||
priv->component_registry = NULL;
|
||||
|
||||
local_storage->priv = priv;
|
||||
}
|
||||
@ -290,33 +322,45 @@ init (ELocalStorage *local_storage)
|
||||
|
||||
static gboolean
|
||||
construct (ELocalStorage *local_storage,
|
||||
EComponentRegistry *component_registry,
|
||||
const char *base_path)
|
||||
{
|
||||
ELocalStoragePrivate *priv;
|
||||
int base_path_len;
|
||||
|
||||
e_storage_construct (E_STORAGE (local_storage));
|
||||
|
||||
priv = local_storage->priv;
|
||||
|
||||
base_path_len = strlen (base_path);
|
||||
while (base_path_len > 0 && base_path[base_path_len - 1] == G_DIR_SEPARATOR)
|
||||
base_path_len--;
|
||||
|
||||
g_return_val_if_fail (base_path_len != 0, FALSE);
|
||||
|
||||
local_storage->priv->base_path = g_strndup (base_path, base_path_len);
|
||||
g_assert (priv->component_registry == NULL);
|
||||
gtk_object_ref (GTK_OBJECT (component_registry));
|
||||
priv->component_registry = component_registry;
|
||||
|
||||
g_assert (priv->base_path == NULL);
|
||||
priv->base_path = g_strndup (base_path, base_path_len);
|
||||
|
||||
return load_all_folders (local_storage);
|
||||
}
|
||||
|
||||
EStorage *
|
||||
e_local_storage_open (const char *base_path)
|
||||
e_local_storage_open (EComponentRegistry *component_registry,
|
||||
const char *base_path)
|
||||
{
|
||||
EStorage *new;
|
||||
|
||||
g_return_val_if_fail (component_registry != NULL, NULL);
|
||||
g_return_val_if_fail (E_IS_COMPONENT_REGISTRY (component_registry), NULL);
|
||||
g_return_val_if_fail (base_path != NULL, NULL);
|
||||
|
||||
new = gtk_type_new (e_local_storage_get_type ());
|
||||
|
||||
if (! construct (E_LOCAL_STORAGE (new), base_path)) {
|
||||
if (! construct (E_LOCAL_STORAGE (new), component_registry, base_path)) {
|
||||
gtk_object_unref (GTK_OBJECT (new));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -28,6 +28,7 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include "e-component-registry.h"
|
||||
#include "e-storage.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
@ -57,8 +58,9 @@ struct _ELocalStorageClass {
|
||||
|
||||
|
||||
GtkType e_local_storage_get_type (void);
|
||||
EStorage *e_local_storage_open (const char *base_path);
|
||||
const char *e_local_storage_get_base_path (ELocalStorage *storage);
|
||||
EStorage *e_local_storage_open (EComponentRegistry *component_registry,
|
||||
const char *base_path);
|
||||
const char *e_local_storage_get_base_path (ELocalStorage *storage);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@ -311,6 +311,7 @@ setup_bonobo_ui_handler (EShellView *shell_view)
|
||||
|
||||
bonobo_ui_handler_set_app (uih, GNOME_APP (shell_view));
|
||||
bonobo_ui_handler_create_menubar (uih);
|
||||
bonobo_ui_handler_create_toolbar (uih, "Toolbar");
|
||||
bonobo_ui_handler_set_statusbar (uih, priv->appbar);
|
||||
|
||||
priv->uih = uih;
|
||||
@ -343,6 +344,9 @@ destroy (GtkObject *object)
|
||||
|
||||
g_hash_table_foreach (priv->uri_to_control, hash_forall_destroy_control, NULL);
|
||||
g_hash_table_destroy (priv->uri_to_control);
|
||||
|
||||
if (priv->shell != NULL)
|
||||
bonobo_object_unref (BONOBO_OBJECT (priv->shell));
|
||||
|
||||
g_free (priv->uri);
|
||||
|
||||
@ -432,7 +436,7 @@ e_shell_view_construct (EShellView *shell_view,
|
||||
|
||||
gnome_app_construct (GNOME_APP (shell_view), "evolution", "Evolution");
|
||||
|
||||
gtk_object_ref (GTK_OBJECT (shell));
|
||||
bonobo_object_ref (BONOBO_OBJECT (shell));
|
||||
priv->shell = shell;
|
||||
|
||||
setup_widgets (shell_view);
|
||||
|
||||
@ -161,7 +161,7 @@ setup_corba_storages (EShell *shell)
|
||||
}
|
||||
|
||||
static gboolean
|
||||
setup_storages (EShell *shell)
|
||||
setup_local_storage (EShell *shell)
|
||||
{
|
||||
EStorage *local_storage;
|
||||
EShellPrivate *priv;
|
||||
@ -171,7 +171,8 @@ setup_storages (EShell *shell)
|
||||
|
||||
local_storage_path = g_concat_dir_and_file (priv->local_directory,
|
||||
LOCAL_STORAGE_DIRECTORY);
|
||||
local_storage = e_local_storage_open (local_storage_path);
|
||||
local_storage = e_local_storage_open (shell->priv->component_registry,
|
||||
local_storage_path);
|
||||
if (local_storage == NULL) {
|
||||
g_warning (_("Cannot set up local storage -- %s"), local_storage_path);
|
||||
g_free (local_storage_path);
|
||||
@ -181,12 +182,11 @@ setup_storages (EShell *shell)
|
||||
|
||||
g_assert (shell->priv->folder_type_registry);
|
||||
|
||||
priv->storage_set = e_storage_set_new (shell->priv->folder_type_registry);
|
||||
e_storage_set_add_storage (priv->storage_set, local_storage);
|
||||
|
||||
gtk_object_unref (GTK_OBJECT (local_storage));
|
||||
|
||||
return setup_corba_storages (shell);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
@ -362,16 +362,20 @@ e_shell_construct (EShell *shell,
|
||||
|
||||
priv = shell->priv;
|
||||
|
||||
priv->local_directory = g_strdup (local_directory);
|
||||
priv->local_directory = g_strdup (local_directory);
|
||||
priv->folder_type_registry = e_folder_type_registry_new ();
|
||||
priv->storage_set = e_storage_set_new (shell->priv->folder_type_registry);
|
||||
|
||||
/* Storages must be set up before the components, because otherwise components
|
||||
/* CORBA storages must be set up before the components, because otherwise components
|
||||
cannot register their own storages. */
|
||||
if (! setup_storages (shell))
|
||||
if (! setup_corba_storages (shell))
|
||||
return;
|
||||
|
||||
setup_components (shell);
|
||||
|
||||
/* The local storage depends on the component registry. */
|
||||
setup_local_storage (shell);
|
||||
|
||||
shortcut_path = g_concat_dir_and_file (local_directory, "shortcuts.xml");
|
||||
priv->shortcuts = e_shortcuts_new (priv->storage_set,
|
||||
priv->folder_type_registry,
|
||||
@ -492,18 +496,23 @@ e_shell_quit (EShell *shell)
|
||||
g_list_free (priv->views);
|
||||
priv->views = NULL;
|
||||
|
||||
bonobo_object_unref (BONOBO_OBJECT (priv->corba_storage_registry));
|
||||
|
||||
priv->corba_storage_registry = NULL;
|
||||
|
||||
e_storage_set_remove_all_storages (priv->storage_set);
|
||||
gtk_object_unref (GTK_OBJECT (priv->storage_set));
|
||||
|
||||
gtk_object_unref (GTK_OBJECT (priv->shortcuts));
|
||||
gtk_object_unref (GTK_OBJECT (priv->folder_type_registry));
|
||||
gtk_object_unref (GTK_OBJECT (priv->component_registry));
|
||||
|
||||
priv->storage_set = NULL;
|
||||
priv->shortcuts = NULL;
|
||||
priv->storage_set = NULL;
|
||||
priv->shortcuts = NULL;
|
||||
priv->folder_type_registry = NULL;
|
||||
priv->component_registry = NULL;
|
||||
priv->component_registry = NULL;
|
||||
|
||||
/* FIXME Unref does not work here. Probably somewhere we are leaking a _ref(). */
|
||||
bonobo_object_destroy (BONOBO_OBJECT (shell));
|
||||
bonobo_object_unref (BONOBO_OBJECT (shell));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -759,29 +759,33 @@ e_storage_set_view_construct (EStorageSetView *storage_set_view,
|
||||
g_return_if_fail (E_IS_STORAGE_SET (storage_set));
|
||||
|
||||
ctree = GTK_CTREE (storage_set_view);
|
||||
|
||||
/* Set up GtkCTree/GtkCList parameters. */
|
||||
gtk_ctree_construct (ctree, 1, 0, NULL);
|
||||
|
||||
gtk_ctree_set_line_style (ctree, GTK_CTREE_LINES_DOTTED);
|
||||
gtk_ctree_set_expander_style (ctree, GTK_CTREE_EXPANDER_SQUARE);
|
||||
gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_BROWSE);
|
||||
gtk_clist_set_row_height (GTK_CLIST (ctree), E_SHELL_MINI_ICON_SIZE);
|
||||
gtk_clist_set_column_auto_resize (GTK_CLIST (ctree), 0, TRUE);
|
||||
|
||||
priv = storage_set_view->priv;
|
||||
|
||||
/* Set up GtkCTree/GtkCList parameters. */
|
||||
|
||||
gtk_ctree_construct (ctree, 1, 0, NULL);
|
||||
gtk_ctree_set_line_style (ctree, GTK_CTREE_LINES_DOTTED);
|
||||
gtk_ctree_set_expander_style (ctree, GTK_CTREE_EXPANDER_SQUARE);
|
||||
|
||||
gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_BROWSE);
|
||||
gtk_clist_set_row_height (GTK_CLIST (ctree), E_SHELL_MINI_ICON_SIZE);
|
||||
gtk_clist_set_column_auto_resize (GTK_CLIST (ctree), 0, TRUE);
|
||||
|
||||
gtk_object_ref (GTK_OBJECT (storage_set));
|
||||
priv->storage_set = storage_set;
|
||||
|
||||
gtk_signal_connect (GTK_OBJECT (storage_set), "new_storage",
|
||||
GTK_SIGNAL_FUNC (new_storage_cb), storage_set_view);
|
||||
gtk_signal_connect (GTK_OBJECT (storage_set), "removed_storage",
|
||||
GTK_SIGNAL_FUNC (removed_storage_cb), storage_set_view);
|
||||
gtk_signal_connect (GTK_OBJECT (storage_set), "new_folder",
|
||||
GTK_SIGNAL_FUNC (new_folder_cb), storage_set_view);
|
||||
gtk_signal_connect (GTK_OBJECT (storage_set), "removed_folder",
|
||||
GTK_SIGNAL_FUNC (removed_folder_cb), storage_set_view);
|
||||
gtk_signal_connect_while_alive (GTK_OBJECT (storage_set), "new_storage",
|
||||
GTK_SIGNAL_FUNC (new_storage_cb), storage_set_view,
|
||||
GTK_OBJECT (storage_set_view));
|
||||
gtk_signal_connect_while_alive (GTK_OBJECT (storage_set), "removed_storage",
|
||||
GTK_SIGNAL_FUNC (removed_storage_cb), storage_set_view,
|
||||
GTK_OBJECT (storage_set_view));
|
||||
gtk_signal_connect_while_alive (GTK_OBJECT (storage_set), "new_folder",
|
||||
GTK_SIGNAL_FUNC (new_folder_cb), storage_set_view,
|
||||
GTK_OBJECT (storage_set_view));
|
||||
gtk_signal_connect_while_alive (GTK_OBJECT (storage_set), "removed_folder",
|
||||
GTK_SIGNAL_FUNC (removed_folder_cb), storage_set_view,
|
||||
GTK_OBJECT (storage_set_view));
|
||||
|
||||
storage_list = e_storage_set_get_storage_list (storage_set);
|
||||
|
||||
|
||||
@ -49,7 +49,7 @@ struct _NamedStorage {
|
||||
typedef struct _NamedStorage NamedStorage;
|
||||
|
||||
struct _EStorageSetPrivate {
|
||||
GList *storages;
|
||||
GList *storages; /* EStorage */
|
||||
GHashTable *name_to_named_storage;
|
||||
|
||||
EFolderTypeRegistry *folder_type_registry;
|
||||
@ -85,6 +85,19 @@ named_storage_destroy (NamedStorage *named_storage)
|
||||
g_free (named_storage);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
name_to_named_storage_foreach_destroy (void *key,
|
||||
void *value,
|
||||
void *user_data)
|
||||
{
|
||||
NamedStorage *named_storage;
|
||||
|
||||
named_storage = (NamedStorage *) value;
|
||||
named_storage_destroy (named_storage);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* Handling for signals coming from the EStorages. */
|
||||
|
||||
@ -345,6 +358,35 @@ e_storage_set_remove_storage (EStorageSet *storage_set,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
e_storage_set_remove_all_storages (EStorageSet *storage_set)
|
||||
{
|
||||
EStorageSetPrivate *priv;
|
||||
GList *p;
|
||||
|
||||
g_return_if_fail (storage_set != NULL);
|
||||
g_return_if_fail (E_IS_STORAGE_SET (storage_set));
|
||||
|
||||
priv = storage_set->priv;
|
||||
|
||||
for (p = priv->storages; p != NULL; p = p->next) {
|
||||
EStorage *storage;
|
||||
|
||||
storage = E_STORAGE (p->data);
|
||||
|
||||
gtk_signal_emit (GTK_OBJECT (storage_set), signals[REMOVED_STORAGE], storage);
|
||||
gtk_object_unref (GTK_OBJECT (storage));
|
||||
}
|
||||
|
||||
g_hash_table_foreach_remove (priv->name_to_named_storage,
|
||||
name_to_named_storage_foreach_destroy,
|
||||
NULL);
|
||||
|
||||
g_list_free (priv->storages);
|
||||
priv->storages = NULL;
|
||||
}
|
||||
|
||||
|
||||
EStorage *
|
||||
e_storage_set_get_storage (EStorageSet *storage_set,
|
||||
const char *name)
|
||||
|
||||
@ -68,22 +68,24 @@ struct _EStorageSetClass {
|
||||
};
|
||||
|
||||
|
||||
GtkType e_storage_set_get_type (void);
|
||||
void e_storage_set_construct (EStorageSet *storage_set,
|
||||
EFolderTypeRegistry *folder_type_registry);
|
||||
EStorageSet *e_storage_set_new (EFolderTypeRegistry *folder_type_registry);
|
||||
GtkType e_storage_set_get_type (void);
|
||||
void e_storage_set_construct (EStorageSet *storage_set,
|
||||
EFolderTypeRegistry *folder_type_registry);
|
||||
EStorageSet *e_storage_set_new (EFolderTypeRegistry *folder_type_registry);
|
||||
|
||||
gboolean e_storage_set_add_storage (EStorageSet *storage_set,
|
||||
EStorage *storage);
|
||||
gboolean e_storage_set_remove_storage (EStorageSet *storage_set,
|
||||
EStorage *storage);
|
||||
gboolean e_storage_set_add_storage (EStorageSet *storage_set,
|
||||
EStorage *storage);
|
||||
gboolean e_storage_set_remove_storage (EStorageSet *storage_set,
|
||||
EStorage *storage);
|
||||
void e_storage_set_remove_all_storages (EStorageSet *storage_set);
|
||||
|
||||
GList *e_storage_set_get_storage_list (EStorageSet *storage_set);
|
||||
EStorage *e_storage_set_get_storage (EStorageSet *storage_set,
|
||||
const char *storage_name);
|
||||
EFolder *e_storage_set_get_folder (EStorageSet *storage_set,
|
||||
const char *path);
|
||||
GtkWidget *e_storage_set_new_view (EStorageSet *storage_set);
|
||||
GList *e_storage_set_get_storage_list (EStorageSet *storage_set);
|
||||
EStorage *e_storage_set_get_storage (EStorageSet *storage_set,
|
||||
const char *storage_name);
|
||||
EFolder *e_storage_set_get_folder (EStorageSet *storage_set,
|
||||
const char *path);
|
||||
|
||||
GtkWidget *e_storage_set_new_view (EStorageSet *storage_set);
|
||||
|
||||
EFolderTypeRegistry *e_storage_set_get_folder_type_registry (EStorageSet *storage_set);
|
||||
|
||||
|
||||
@ -64,6 +64,8 @@ enum {
|
||||
static guint signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
|
||||
/* Folder handling. */
|
||||
|
||||
static Folder *
|
||||
folder_new (EFolder *e_folder,
|
||||
const char *path)
|
||||
@ -71,9 +73,9 @@ folder_new (EFolder *e_folder,
|
||||
Folder *folder;
|
||||
|
||||
folder = g_new (Folder, 1);
|
||||
folder->path = g_strdup (path);
|
||||
folder->parent = NULL;
|
||||
folder->e_folder = e_folder;
|
||||
folder->path = g_strdup (path);
|
||||
folder->parent = NULL;
|
||||
folder->e_folder = e_folder;
|
||||
folder->subfolders = NULL;
|
||||
|
||||
return folder;
|
||||
@ -95,41 +97,83 @@ folder_add_subfolder (Folder *folder, Folder *subfolder)
|
||||
static void
|
||||
folder_destroy (Folder *folder)
|
||||
{
|
||||
GList *p;
|
||||
g_assert (folder->subfolders == NULL);
|
||||
|
||||
if (folder->parent != NULL)
|
||||
folder_remove_subfolder (folder->parent, folder);
|
||||
|
||||
g_free (folder->path);
|
||||
|
||||
gtk_object_unref (GTK_OBJECT (folder->e_folder));
|
||||
|
||||
for (p = folder->subfolders; p != NULL; p = p->next)
|
||||
folder_destroy (p->data);
|
||||
if (folder->e_folder != NULL)
|
||||
gtk_object_unref (GTK_OBJECT (folder->e_folder));
|
||||
|
||||
g_free (folder);
|
||||
}
|
||||
|
||||
static void
|
||||
remove_folder (EStorage *storage,
|
||||
Folder *folder)
|
||||
{
|
||||
EStoragePrivate *priv;
|
||||
|
||||
priv = storage->priv;
|
||||
|
||||
if (folder->subfolders != NULL) {
|
||||
GList *p;
|
||||
|
||||
for (p = folder->subfolders; p != NULL; p = p->next) {
|
||||
Folder *subfolder;
|
||||
|
||||
subfolder = (Folder *) p->data;
|
||||
remove_folder (storage, subfolder);
|
||||
}
|
||||
|
||||
g_list_free (folder->subfolders);
|
||||
folder->subfolders = NULL;
|
||||
}
|
||||
|
||||
g_hash_table_remove (priv->path_to_folder, folder->path);
|
||||
|
||||
folder_destroy (folder);
|
||||
}
|
||||
|
||||
static void
|
||||
free_private (EStorage *storage)
|
||||
{
|
||||
EStoragePrivate *priv;
|
||||
Folder *root_folder;
|
||||
|
||||
priv = storage->priv;
|
||||
|
||||
g_hash_table_foreach (priv->path_to_folder, (GHFunc) folder_destroy, NULL);
|
||||
root_folder = g_hash_table_lookup (priv->path_to_folder, G_DIR_SEPARATOR_S);
|
||||
remove_folder (storage, root_folder);
|
||||
|
||||
g_hash_table_destroy (priv->path_to_folder);
|
||||
|
||||
g_free (priv);
|
||||
}
|
||||
|
||||
|
||||
/* GtkObject methods. */
|
||||
|
||||
static void
|
||||
destroy (GtkObject *object)
|
||||
{
|
||||
EStorage *storage;
|
||||
|
||||
storage = E_STORAGE (object);
|
||||
|
||||
free_private (storage);
|
||||
|
||||
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
|
||||
}
|
||||
|
||||
|
||||
/* EStorage methods. */
|
||||
|
||||
static GList *
|
||||
list_folders (EStorage *storage,
|
||||
const char *path)
|
||||
impl_list_folders (EStorage *storage,
|
||||
const char *path)
|
||||
{
|
||||
Folder *folder;
|
||||
Folder *subfolder;
|
||||
@ -152,8 +196,8 @@ list_folders (EStorage *storage,
|
||||
}
|
||||
|
||||
static EFolder *
|
||||
get_folder (EStorage *storage,
|
||||
const char *path)
|
||||
impl_get_folder (EStorage *storage,
|
||||
const char *path)
|
||||
{
|
||||
EStoragePrivate *priv;
|
||||
Folder *folder;
|
||||
@ -168,24 +212,29 @@ get_folder (EStorage *storage,
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_name (EStorage *storage)
|
||||
impl_get_name (EStorage *storage)
|
||||
{
|
||||
return "(No name)";
|
||||
return _("(No name)");
|
||||
}
|
||||
|
||||
|
||||
/* GtkObject methods. */
|
||||
static void
|
||||
impl_create_folder (EStorage *storage,
|
||||
const char *path,
|
||||
const char *type,
|
||||
const char *description,
|
||||
EStorageResultCallback callback,
|
||||
void *data)
|
||||
{
|
||||
(* callback) (storage, E_STORAGE_NOTIMPLEMENTED, data);
|
||||
}
|
||||
|
||||
static void
|
||||
destroy (GtkObject *object)
|
||||
impl_remove_folder (EStorage *storage,
|
||||
const char *path,
|
||||
EStorageResultCallback callback,
|
||||
void *data)
|
||||
{
|
||||
EStorage *storage;
|
||||
|
||||
storage = E_STORAGE (object);
|
||||
|
||||
free_private (storage);
|
||||
|
||||
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
|
||||
(* callback) (storage, E_STORAGE_NOTIMPLEMENTED, data);
|
||||
}
|
||||
|
||||
|
||||
@ -201,9 +250,11 @@ class_init (EStorageClass *class)
|
||||
|
||||
object_class->destroy = destroy;
|
||||
|
||||
class->list_folders = list_folders;
|
||||
class->get_folder = get_folder;
|
||||
class->get_name = get_name;
|
||||
class->list_folders = impl_list_folders;
|
||||
class->get_folder = impl_get_folder;
|
||||
class->get_name = impl_get_name;
|
||||
class->create_folder = impl_create_folder;
|
||||
class->remove_folder = impl_remove_folder;
|
||||
|
||||
signals[NEW_FOLDER] =
|
||||
gtk_signal_new ("new_folder",
|
||||
@ -316,6 +367,40 @@ e_storage_get_name (EStorage *storage)
|
||||
return (* ES_CLASS (storage)->get_name) (storage);
|
||||
}
|
||||
|
||||
|
||||
/* Folder operations. */
|
||||
|
||||
void
|
||||
e_storage_create_folder (EStorage *storage,
|
||||
const char *path,
|
||||
const char *type,
|
||||
const char *description,
|
||||
EStorageResultCallback callback,
|
||||
void *data)
|
||||
{
|
||||
g_return_if_fail (storage != NULL);
|
||||
g_return_if_fail (E_IS_STORAGE (storage));
|
||||
g_return_if_fail (path != NULL);
|
||||
g_return_if_fail (type != NULL);
|
||||
g_return_if_fail (callback != NULL);
|
||||
|
||||
(* ES_CLASS (storage)->create_folder) (storage, path, type, description, callback, data);
|
||||
}
|
||||
|
||||
void
|
||||
e_storage_remove_folder (EStorage *storage,
|
||||
const char *path,
|
||||
EStorageResultCallback callback,
|
||||
void *data)
|
||||
{
|
||||
g_return_if_fail (storage != NULL);
|
||||
g_return_if_fail (E_IS_STORAGE (storage));
|
||||
g_return_if_fail (path != NULL);
|
||||
g_return_if_fail (callback != NULL);
|
||||
|
||||
(* ES_CLASS (storage)->remove_folder) (storage, path, callback, data);
|
||||
}
|
||||
|
||||
|
||||
/* These functions are used by subclasses to add and remove folders from the
|
||||
state stored in the storage object. */
|
||||
@ -374,8 +459,8 @@ e_storage_new_folder (EStorage *storage,
|
||||
}
|
||||
|
||||
gboolean
|
||||
e_storage_remove_folder (EStorage *storage,
|
||||
const char *path)
|
||||
e_storage_removed_folder (EStorage *storage,
|
||||
const char *path)
|
||||
{
|
||||
EStoragePrivate *priv;
|
||||
Folder *folder;
|
||||
@ -395,8 +480,7 @@ e_storage_remove_folder (EStorage *storage,
|
||||
|
||||
gtk_signal_emit (GTK_OBJECT (storage), signals[REMOVED_FOLDER], path);
|
||||
|
||||
g_hash_table_remove (priv->path_to_folder, path);
|
||||
folder_destroy (folder);
|
||||
remove_folder (storage, folder);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -46,6 +46,18 @@ typedef struct _EStorage EStorage;
|
||||
typedef struct _EStoragePrivate EStoragePrivate;
|
||||
typedef struct _EStorageClass EStorageClass;
|
||||
|
||||
enum _EStorageResult {
|
||||
E_STORAGE_OK,
|
||||
E_STORAGE_NOTIMPLEMENTED,
|
||||
E_STORAGE_NOTFOUND,
|
||||
E_STORAGE_EXISTS,
|
||||
E_STORAGE_IO,
|
||||
E_STORAGE_UNSUPPORTEDTYPE
|
||||
};
|
||||
typedef enum _EStorageResult EStorageResult;
|
||||
|
||||
typedef void (* EStorageResultCallback) (EStorage *storage, EStorageResult result, void *data);
|
||||
|
||||
#include "e-folder.h"
|
||||
|
||||
struct _EStorage {
|
||||
@ -58,31 +70,51 @@ struct _EStorageClass {
|
||||
GtkObjectClass parent_class;
|
||||
|
||||
/* Signals. */
|
||||
|
||||
void * (* new_folder) (EStorage *storage, const char *path);
|
||||
void * (* removed_folder) (EStorage *storage, const char *path);
|
||||
|
||||
/* Virtual methods. */
|
||||
GList * (* list_folders) (EStorage *storage, const char *path);
|
||||
EFolder * (* get_folder) (EStorage *storage, const char *path);
|
||||
const char * (* get_name) (EStorage *storage);
|
||||
|
||||
GList * (* list_folders) (EStorage *storage, const char *path);
|
||||
EFolder * (* get_folder) (EStorage *storage, const char *path);
|
||||
const char * (* get_name) (EStorage *storage);
|
||||
|
||||
void (* create_folder) (EStorage *storage, const char *path,
|
||||
const char *type, const char *description,
|
||||
EStorageResultCallback callback, void *data);
|
||||
void (* remove_folder) (EStorage *storage, const char *path,
|
||||
EStorageResultCallback callback, void *data);
|
||||
};
|
||||
|
||||
|
||||
GtkType e_storage_get_type (void);
|
||||
void e_storage_construct (EStorage *storage);
|
||||
EStorage *e_storage_new (void);
|
||||
GtkType e_storage_get_type (void);
|
||||
void e_storage_construct (EStorage *storage);
|
||||
EStorage *e_storage_new (void);
|
||||
gboolean e_storage_path_is_relative (const char *path);
|
||||
gboolean e_storage_path_is_absolute (const char *path);
|
||||
|
||||
gboolean e_storage_path_is_relative (const char *path);
|
||||
gboolean e_storage_path_is_absolute (const char *path);
|
||||
GList *e_storage_list_folders (EStorage *storage, const char *path);
|
||||
EFolder *e_storage_get_folder (EStorage *storage, const char *path);
|
||||
|
||||
GList *e_storage_list_folders (EStorage *storage, const char *path);
|
||||
EFolder *e_storage_get_folder (EStorage *storage, const char *path);
|
||||
const char *e_storage_get_name (EStorage *storage);
|
||||
|
||||
const char *e_storage_get_name (EStorage *storage);
|
||||
/* Folder operations. */
|
||||
|
||||
void e_storage_create_folder (EStorage *storage,
|
||||
const char *path,
|
||||
const char *type,
|
||||
const char *description,
|
||||
EStorageResultCallback callback,
|
||||
void *data);
|
||||
void e_storage_remove_folder (EStorage *storage,
|
||||
const char *path,
|
||||
EStorageResultCallback callback,
|
||||
void *data);
|
||||
|
||||
/* Protected. C++ anyone? */
|
||||
gboolean e_storage_new_folder (EStorage *storage, const char *path, EFolder *folder);
|
||||
gboolean e_storage_remove_folder (EStorage *storage, const char *path);
|
||||
gboolean e_storage_new_folder (EStorage *storage, const char *path, EFolder *folder);
|
||||
gboolean e_storage_removed_folder (EStorage *storage, const char *path);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user