aboutsummaryrefslogtreecommitdiffstats
path: root/shell/evolution-storage.c
diff options
context:
space:
mode:
Diffstat (limited to 'shell/evolution-storage.c')
-rw-r--r--shell/evolution-storage.c323
1 files changed, 66 insertions, 257 deletions
diff --git a/shell/evolution-storage.c b/shell/evolution-storage.c
index 2548ed2d35..315225242c 100644
--- a/shell/evolution-storage.c
+++ b/shell/evolution-storage.c
@@ -27,7 +27,6 @@
#include <glib.h>
#include <gtk/gtksignal.h>
#include <bonobo/bonobo-object.h>
-#include <bonobo/bonobo-exception.h>
#include <gal/util/e-util.h>
@@ -37,8 +36,6 @@
#include "evolution-storage.h"
-#include "e-shell-constants.h"
-
#define PARENT_TYPE BONOBO_OBJECT_TYPE
static BonoboObjectClass *parent_class = NULL;
@@ -47,12 +44,15 @@ struct _EvolutionStoragePrivate {
/* Name of the storage. */
char *name;
- /* Whether there are shared folders in this storage. */
- gboolean has_shared_folders;
-
/* What we will display as the name of the storage. */
char *display_name;
+ /* URI for the toplevel node of the storage. */
+ char *toplevel_node_uri;
+
+ /* Type for the toplevel node of the storage. */
+ char *toplevel_node_type;
+
/* The set of folders we have in this storage. */
EFolderTree *folder_tree;
@@ -67,10 +67,8 @@ struct _EvolutionStoragePrivate {
enum {
CREATE_FOLDER,
REMOVE_FOLDER,
- XFER_FOLDER,
UPDATE_FOLDER,
- OPEN_FOLDER,
- DISCOVER_SHARED_FOLDER,
+ XFER_FOLDER,
LAST_SIGNAL
};
@@ -80,6 +78,15 @@ static guint signals[LAST_SIGNAL] = { 0 };
/* Utility functions. */
+static const CORBA_char *
+safe_corba_string (const char *s)
+{
+ if (s == NULL)
+ return (CORBA_char *) "";
+
+ return s;
+}
+
static void
list_through_listener_foreach (EFolderTree *tree,
const char *path,
@@ -256,81 +263,14 @@ impl_Storage__get_name (PortableServer_Servant servant,
return CORBA_string_dup (priv->name);
}
-static CORBA_boolean
-impl_Storage__get_hasSharedFolders (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionStorage *storage;
- EvolutionStoragePrivate *priv;
-
- bonobo_object = bonobo_object_from_servant (servant);
- storage = EVOLUTION_STORAGE (bonobo_object);
- priv = storage->priv;
-
- return priv->has_shared_folders;
-}
-
static void
-get_folder_list_foreach (EFolderTree *tree,
- const char *path,
- void *data,
- void *closure)
-{
- const GNOME_Evolution_Folder *corba_folder;
- GNOME_Evolution_Folder *new_corba_folder;
- GNOME_Evolution_FolderList *folder_list;
-
- corba_folder = (GNOME_Evolution_Folder *) data;
- folder_list = (GNOME_Evolution_FolderList *) closure;
-
- /* The root folder has no data. */
- if (corba_folder == NULL)
- return;
-
- new_corba_folder = folder_list->_buffer + folder_list->_length;
- new_corba_folder->displayName = CORBA_string_dup (corba_folder->displayName);
- new_corba_folder->description = CORBA_string_dup (corba_folder->description);
- new_corba_folder->type = CORBA_string_dup (corba_folder->type);
- new_corba_folder->physicalUri = CORBA_string_dup (corba_folder->physicalUri);
- new_corba_folder->evolutionUri = CORBA_string_dup (corba_folder->evolutionUri);
- new_corba_folder->unreadCount = corba_folder->unreadCount;
-
- folder_list->_length++;
-}
-
-static GNOME_Evolution_FolderList *
-impl_Storage__get_folderList (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionStorage *storage;
- EvolutionStoragePrivate *priv;
- GNOME_Evolution_FolderList *folder_list;
-
- bonobo_object = bonobo_object_from_servant (servant);
- storage = EVOLUTION_STORAGE (bonobo_object);
- priv = storage->priv;
-
- folder_list = GNOME_Evolution_FolderList__alloc ();
- folder_list->_maximum = e_folder_tree_get_count (priv->folder_tree) - 1;
- folder_list->_length = 0;
- folder_list->_buffer = CORBA_sequence_GNOME_Evolution_Folder_allocbuf (folder_list->_maximum);
-
- e_folder_tree_foreach (priv->folder_tree, get_folder_list_foreach, folder_list);
-
- CORBA_sequence_set_release (folder_list, TRUE);
- return folder_list;
-}
-
-static void
-impl_Storage_asyncCreateFolder (PortableServer_Servant servant,
- const CORBA_char *path,
- const CORBA_char *type,
- const CORBA_char *description,
- const CORBA_char *parent_physical_uri,
- const Bonobo_Listener listener,
- CORBA_Environment *ev)
+impl_Storage_async_create_folder (PortableServer_Servant servant,
+ const CORBA_char *path,
+ const CORBA_char *type,
+ const CORBA_char *description,
+ const CORBA_char *parent_physical_uri,
+ const Bonobo_Listener listener,
+ CORBA_Environment *ev)
{
BonoboObject *bonobo_object;
CORBA_Object obj_dup;
@@ -346,11 +286,11 @@ impl_Storage_asyncCreateFolder (PortableServer_Servant servant,
static void
-impl_Storage_asyncRemoveFolder (PortableServer_Servant servant,
- const CORBA_char *path,
- const CORBA_char *physical_uri,
- const Bonobo_Listener listener,
- CORBA_Environment *ev)
+impl_Storage_async_remove_folder (PortableServer_Servant servant,
+ const CORBA_char *path,
+ const CORBA_char *physical_uri,
+ const Bonobo_Listener listener,
+ CORBA_Environment *ev)
{
BonoboObject *bonobo_object;
EvolutionStorage *storage;
@@ -365,12 +305,12 @@ impl_Storage_asyncRemoveFolder (PortableServer_Servant servant,
}
static void
-impl_Storage_asyncXferFolder (PortableServer_Servant servant,
- const CORBA_char *source_path,
- const CORBA_char *destination_path,
- const CORBA_boolean remove_source,
- const Bonobo_Listener listener,
- CORBA_Environment *ev)
+impl_Storage_async_xfer_folder (PortableServer_Servant servant,
+ const CORBA_char *source_path,
+ const CORBA_char *destination_path,
+ const CORBA_boolean remove_source,
+ const Bonobo_Listener listener,
+ CORBA_Environment *ev)
{
BonoboObject *bonobo_object;
EvolutionStorage *storage;
@@ -429,40 +369,9 @@ impl_Storage_updateFolder (PortableServer_Servant servant,
}
static void
-impl_Storage_asyncOpenFolder (PortableServer_Servant servant,
- const CORBA_char *path,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionStorage *storage;
-
- bonobo_object = bonobo_object_from_servant (servant);
- storage = EVOLUTION_STORAGE (bonobo_object);
-
- gtk_signal_emit (GTK_OBJECT (storage), signals[OPEN_FOLDER], path);
-}
-
-static void
-impl_Storage_asyncDiscoverSharedFolder (PortableServer_Servant servant,
- const CORBA_char *user,
- const CORBA_char *folder_name,
- Bonobo_Listener listener,
- CORBA_Environment *ev)
-{
- BonoboObject *bonobo_object;
- EvolutionStorage *storage;
-
- bonobo_object = bonobo_object_from_servant (servant);
- storage = EVOLUTION_STORAGE (bonobo_object);
-
- gtk_signal_emit (GTK_OBJECT (storage), signals[DISCOVER_SHARED_FOLDER],
- user, folder_name, listener);
-}
-
-static void
-impl_Storage_addListener (PortableServer_Servant servant,
- const GNOME_Evolution_StorageListener listener,
- CORBA_Environment *ev)
+impl_Storage_add_listener (PortableServer_Servant servant,
+ const GNOME_Evolution_StorageListener listener,
+ CORBA_Environment *ev)
{
BonoboObject *bonobo_object;
EvolutionStorage *storage;
@@ -475,9 +384,9 @@ impl_Storage_addListener (PortableServer_Servant servant,
}
static void
-impl_Storage_removeListener (PortableServer_Servant servant,
- const GNOME_Evolution_StorageListener listener,
- CORBA_Environment *ev)
+impl_Storage_remove_listener (PortableServer_Servant servant,
+ const GNOME_Evolution_StorageListener listener,
+ CORBA_Environment *ev)
{
BonoboObject *bonobo_object;
EvolutionStorage *storage;
@@ -511,6 +420,8 @@ destroy (GtkObject *object)
priv = storage->priv;
g_free (priv->name);
+ g_free (priv->toplevel_node_uri);
+ g_free (priv->toplevel_node_type);
if (priv->folder_tree != NULL)
e_folder_tree_destroy (priv->folder_tree);
if (priv->uri_to_path != NULL) {
@@ -658,26 +569,6 @@ class_init (EvolutionStorageClass *klass)
GTK_TYPE_STRING,
GTK_TYPE_INT);
- signals[OPEN_FOLDER] = gtk_signal_new ("open_folder",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EvolutionStorageClass,
- open_folder),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_STRING);
-
- signals[DISCOVER_SHARED_FOLDER] = gtk_signal_new ("discover_shared_folder",
- GTK_RUN_LAST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EvolutionStorageClass,
- discover_shared_folder),
- e_marshal_NONE__POINTER_POINTER_POINTER,
- GTK_TYPE_NONE, 3,
- GTK_TYPE_STRING,
- GTK_TYPE_STRING,
- GTK_TYPE_POINTER);
-
gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
corba_class_init ();
@@ -690,7 +581,8 @@ init (EvolutionStorage *storage)
priv = g_new (EvolutionStoragePrivate, 1);
priv->name = NULL;
- priv->has_shared_folders = FALSE;
+ priv->toplevel_node_uri = NULL;
+ priv->toplevel_node_type = NULL;
priv->folder_tree = e_folder_tree_new (folder_destroy_notify, storage);
priv->uri_to_path = g_hash_table_new (g_str_hash, g_str_equal);
priv->corba_storage_listeners = NULL;
@@ -705,17 +597,13 @@ evolution_storage_get_epv (void)
POA_GNOME_Evolution_Storage__epv *epv;
epv = g_new0 (POA_GNOME_Evolution_Storage__epv, 1);
- epv->_get_name = impl_Storage__get_name;
- epv->_get_hasSharedFolders = impl_Storage__get_hasSharedFolders;
- epv->_get_folderList = impl_Storage__get_folderList;
- epv->asyncCreateFolder = impl_Storage_asyncCreateFolder;
- epv->asyncRemoveFolder = impl_Storage_asyncRemoveFolder;
- epv->asyncXferFolder = impl_Storage_asyncXferFolder;
- epv->asyncOpenFolder = impl_Storage_asyncOpenFolder;
- epv->updateFolder = impl_Storage_updateFolder;
- epv->asyncDiscoverSharedFolder = impl_Storage_asyncDiscoverSharedFolder;
- epv->addListener = impl_Storage_addListener;
- epv->removeListener = impl_Storage_removeListener;
+ epv->_get_name = impl_Storage__get_name;
+ epv->asyncCreateFolder = impl_Storage_async_create_folder;
+ epv->asyncRemoveFolder = impl_Storage_async_remove_folder;
+ epv->asyncXferFolder = impl_Storage_async_xfer_folder;
+ epv->updateFolder = impl_Storage_updateFolder;
+ epv->addListener = impl_Storage_add_listener;
+ epv->removeListener = impl_Storage_remove_listener;
return epv;
}
@@ -724,7 +612,8 @@ void
evolution_storage_construct (EvolutionStorage *storage,
GNOME_Evolution_Storage corba_object,
const char *name,
- gboolean has_shared_folders)
+ const char *toplevel_node_uri,
+ const char *toplevel_node_type)
{
EvolutionStoragePrivate *priv;
CORBA_Environment ev;
@@ -741,14 +630,16 @@ evolution_storage_construct (EvolutionStorage *storage,
priv = storage->priv;
priv->name = g_strdup (name);
- priv->has_shared_folders = !! has_shared_folders;
+ priv->toplevel_node_uri = g_strdup (toplevel_node_uri);
+ priv->toplevel_node_type = g_strdup (toplevel_node_type);
CORBA_exception_free (&ev);
}
EvolutionStorage *
evolution_storage_new (const char *name,
- gboolean has_shared_folders)
+ const char *toplevel_node_uri,
+ const char *toplevel_node_type)
{
EvolutionStorage *new;
POA_GNOME_Evolution_Storage *servant;
@@ -764,7 +655,7 @@ evolution_storage_new (const char *name,
new = gtk_type_new (evolution_storage_get_type ());
corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (new), servant);
- evolution_storage_construct (new, corba_object, name, has_shared_folders);
+ evolution_storage_construct (new, corba_object, name, toplevel_node_uri, toplevel_node_type);
return new;
}
@@ -804,6 +695,8 @@ evolution_storage_register (EvolutionStorage *evolution_storage,
corba_storage_listener = GNOME_Evolution_StorageRegistry_addStorage (corba_storage_registry,
corba_storage,
priv->name,
+ safe_corba_string (priv->toplevel_node_uri),
+ safe_corba_string (priv->toplevel_node_type),
&ev);
if (ev._major == CORBA_NO_EXCEPTION) {
@@ -912,31 +805,6 @@ evolution_storage_deregister_on_shell (EvolutionStorage *evolution_storage,
return result;
}
-static char *
-make_full_uri (EvolutionStorage *storage,
- const char *path)
-{
- const char *storage_name;
- char *full_path;
-
- storage_name = storage->priv->name;
-
- if (strcmp (path, G_DIR_SEPARATOR_S) == 0)
- full_path = g_strconcat (E_SHELL_URI_PREFIX,
- G_DIR_SEPARATOR_S, storage_name,
- NULL);
- else if (! g_path_is_absolute (path))
- full_path = g_strconcat (E_SHELL_URI_PREFIX,
- G_DIR_SEPARATOR_S, storage_name,
- G_DIR_SEPARATOR_S, path, NULL);
- else
- full_path = g_strconcat (E_SHELL_URI_PREFIX,
- G_DIR_SEPARATOR_S, storage_name,
- path, NULL);
-
- return full_path;
-}
-
EvolutionStorageResult
evolution_storage_new_folder (EvolutionStorage *evolution_storage,
const char *path,
@@ -944,15 +812,13 @@ evolution_storage_new_folder (EvolutionStorage *evolution_storage,
const char *type,
const char *physical_uri,
const char *description,
- int unread_count,
- gboolean can_sync_offline)
+ int unread_count)
{
EvolutionStorageResult result;
EvolutionStoragePrivate *priv;
GNOME_Evolution_Folder *corba_folder;
CORBA_Environment ev;
GList *p;
- char *evolutionUri;
g_return_val_if_fail (evolution_storage != NULL,
EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
@@ -972,17 +838,11 @@ evolution_storage_new_folder (EvolutionStorage *evolution_storage,
CORBA_exception_init (&ev);
corba_folder = GNOME_Evolution_Folder__alloc ();
- corba_folder->displayName = CORBA_string_dup (display_name);
- corba_folder->description = CORBA_string_dup (description);
- corba_folder->type = CORBA_string_dup (type);
- corba_folder->physicalUri = CORBA_string_dup (physical_uri);
- corba_folder->canSyncOffline = (CORBA_boolean) can_sync_offline;
-
- evolutionUri = make_full_uri (evolution_storage, path);
- corba_folder->evolutionUri = CORBA_string_dup (evolutionUri);
- g_free (evolutionUri);
-
- corba_folder->unreadCount = unread_count;
+ corba_folder->displayName = CORBA_string_dup (display_name);
+ corba_folder->description = CORBA_string_dup (description);
+ corba_folder->type = CORBA_string_dup (type);
+ corba_folder->physicalUri = CORBA_string_dup (physical_uri);
+ corba_folder->unreadCount = unread_count;
if (! e_folder_tree_add (priv->folder_tree, path, corba_folder)) {
CORBA_free (corba_folder);
@@ -1175,56 +1035,5 @@ evolution_storage_folder_exists (EvolutionStorage *evolution_storage,
return e_folder_tree_get_folder (priv->folder_tree, path) != NULL;
}
-EvolutionStorageResult
-evolution_storage_has_subfolders (EvolutionStorage *evolution_storage,
- const char *path,
- const char *message)
-{
- EvolutionStorageResult result;
- EvolutionStoragePrivate *priv;
- CORBA_Environment ev;
- GList *p;
-
- g_return_val_if_fail (evolution_storage != NULL,
- EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (EVOLUTION_IS_STORAGE (evolution_storage),
- EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (path != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (g_path_is_absolute (path), EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
- g_return_val_if_fail (message != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER);
-
- priv = evolution_storage->priv;
-
- if (priv->corba_storage_listeners == NULL)
- return EVOLUTION_STORAGE_ERROR_NOTREGISTERED;
-
- CORBA_exception_init (&ev);
-
- result = EVOLUTION_STORAGE_OK;
-
- for (p = priv->corba_storage_listeners; p != NULL; p = p->next) {
- GNOME_Evolution_StorageListener listener;
-
- listener = p->data;
- GNOME_Evolution_StorageListener_notifyHasSubfolders (listener, path, message, &ev);
-
- if (ev._major == CORBA_NO_EXCEPTION)
- continue;
- if (ev._major != CORBA_USER_EXCEPTION)
- result = EVOLUTION_STORAGE_ERROR_CORBA;
- else if (strcmp (CORBA_exception_id (&ev), ex_GNOME_Evolution_StorageListener_NotFound) == 0)
- result = EVOLUTION_STORAGE_ERROR_NOTFOUND;
- else
- result = EVOLUTION_STORAGE_ERROR_GENERIC;
-
- break;
- }
-
- CORBA_exception_free (&ev);
-
- return result;
-}
-
-
E_MAKE_TYPE (evolution_storage, "EvolutionStorage", EvolutionStorage, class_init, init, PARENT_TYPE)