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:
Ettore Perazzoli
2000-06-07 17:01:52 +00:00
parent 6aac85ab5b
commit e7971bb4f5
11 changed files with 396 additions and 106 deletions

View File

@ -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"

View File

@ -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,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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