diff options
author | Dan Winship <danw@src.gnome.org> | 2001-01-05 01:02:57 +0800 |
---|---|---|
committer | Dan Winship <danw@src.gnome.org> | 2001-01-05 01:02:57 +0800 |
commit | f9f6c398725a2e0969e23753106edfb896ea5930 (patch) | |
tree | 669c0a196ef914fac5261bc8d7380bfcacc4f601 | |
parent | 349554fff69003e2cb426d68092f6ed33b6eb1ff (diff) | |
download | gsoc2013-evolution-f9f6c398725a2e0969e23753106edfb896ea5930.tar.gz gsoc2013-evolution-f9f6c398725a2e0969e23753106edfb896ea5930.tar.zst gsoc2013-evolution-f9f6c398725a2e0969e23753106edfb896ea5930.zip |
New function to update a folder given its URI. Plus associated changes to
* evolution-storage.c (evolution_storage_update_folder_by_uri):
New function to update a folder given its URI. Plus associated
changes to other functions to keep track of the path<->URI
mappings.
svn path=/trunk/; revision=7248
-rw-r--r-- | shell/ChangeLog | 7 | ||||
-rw-r--r-- | shell/evolution-storage.c | 64 | ||||
-rw-r--r-- | shell/evolution-storage.h | 38 |
3 files changed, 82 insertions, 27 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog index df579059bd..c6befcb49b 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,3 +1,10 @@ +2001-01-04 Dan Winship <danw@helixcode.com> + + * evolution-storage.c (evolution_storage_update_folder_by_uri): + New function to update a folder given its URI. Plus associated + changes to other functions to keep track of the path<->URI + mappings. + 2000-12-28 Ettore Perazzoli <ettore@helixcode.com> * evolution-shell-client.c (user_select_folder): Make sure the diff --git a/shell/evolution-storage.c b/shell/evolution-storage.c index 5ad51472a3..c87c031cd0 100644 --- a/shell/evolution-storage.c +++ b/shell/evolution-storage.c @@ -54,6 +54,9 @@ struct _EvolutionStoragePrivate { /* The set of folders we have in this storage. */ EFolderTree *folder_tree; + /* Mappings from URIs to folder tree paths. */ + GHashTable *uri_to_path; + /* The listener registered on this storage. */ GList *corba_storage_listeners; }; @@ -271,6 +274,13 @@ impl_Storage_remove_listener (PortableServer_Servant servant, /* GtkObject methods. */ static void +free_mapping (gpointer key, gpointer value, gpointer user_data) +{ + g_free (key); + g_free (value); +} + +static void destroy (GtkObject *object) { EvolutionStorage *storage; @@ -286,6 +296,10 @@ destroy (GtkObject *object) g_free (priv->toplevel_node_type); if (priv->folder_tree != NULL) e_folder_tree_destroy (priv->folder_tree); + if (priv->uri_to_path != NULL) { + g_hash_table_foreach (priv->uri_to_path, free_mapping, NULL); + g_hash_table_destroy (priv->uri_to_path); + } CORBA_exception_init (&ev); @@ -351,6 +365,7 @@ init (EvolutionStorage *storage) 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; storage->priv = priv; @@ -544,6 +559,12 @@ evolution_storage_new_folder (EvolutionStorage *evolution_storage, corba_folder->physical_uri = CORBA_string_dup (physical_uri); corba_folder->highlighted = highlighted; + if (! e_folder_tree_add (priv->folder_tree, path, corba_folder)) { + CORBA_free (corba_folder); + return EVOLUTION_STORAGE_ERROR_EXISTS; + } + g_hash_table_insert (priv->uri_to_path, g_strdup (physical_uri), g_strdup (path)); + result = EVOLUTION_STORAGE_OK; for (p = priv->corba_storage_listeners; p != NULL; p = p->next) { @@ -567,11 +588,6 @@ evolution_storage_new_folder (EvolutionStorage *evolution_storage, CORBA_exception_free (&ev); - if (result == EVOLUTION_STORAGE_OK) { - if (! e_folder_tree_add (priv->folder_tree, path, corba_folder)) - result = EVOLUTION_STORAGE_ERROR_EXISTS; - } - return result; } @@ -637,12 +653,35 @@ evolution_storage_update_folder (EvolutionStorage *evolution_storage, } EvolutionStorageResult +evolution_storage_update_folder_by_uri (EvolutionStorage *evolution_storage, + const char *physical_uri, + const char *display_name, + gboolean highlighted) +{ + EvolutionStoragePrivate *priv; + char *path; + + 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 (physical_uri != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); + + priv = evolution_storage->priv; + + path = g_hash_table_lookup (priv->uri_to_path, physical_uri); + return evolution_storage_update_folder (evolution_storage, path, display_name, highlighted); +} + +EvolutionStorageResult evolution_storage_removed_folder (EvolutionStorage *evolution_storage, const char *path) { EvolutionStorageResult result; EvolutionStoragePrivate *priv; CORBA_Environment ev; + GNOME_Evolution_Folder *corba_folder; + gpointer key, value; GList *p; g_return_val_if_fail (evolution_storage != NULL, @@ -657,6 +696,16 @@ evolution_storage_removed_folder (EvolutionStorage *evolution_storage, if (priv->corba_storage_listeners == NULL) return EVOLUTION_STORAGE_ERROR_NOTREGISTERED; + corba_folder = e_folder_tree_get_folder (priv->folder_tree, path); + if (corba_folder == NULL) + return EVOLUTION_STORAGE_ERROR_NOTFOUND; + if (g_hash_table_lookup_extended (priv->uri_to_path, corba_folder->physical_uri, &key, &value)) { + g_hash_table_remove (priv->uri_to_path, key); + g_free (key); + g_free (value); + } + e_folder_tree_remove (priv->folder_tree, path); + CORBA_exception_init (&ev); result = EVOLUTION_STORAGE_OK; @@ -682,11 +731,6 @@ evolution_storage_removed_folder (EvolutionStorage *evolution_storage, CORBA_exception_free (&ev); - if (result == EVOLUTION_STORAGE_OK) { - if (! e_folder_tree_remove (priv->folder_tree, path)) - result = EVOLUTION_STORAGE_ERROR_NOTFOUND; - } - return result; } diff --git a/shell/evolution-storage.h b/shell/evolution-storage.h index 4457d9f9b8..824c7ea12a 100644 --- a/shell/evolution-storage.h +++ b/shell/evolution-storage.h @@ -84,23 +84,27 @@ EvolutionStorage *evolution_storage_new (const char *name, const char *toplevel_node_uri, const char *toplevel_node_type); -EvolutionStorageResult evolution_storage_register (EvolutionStorage *storage, - GNOME_Evolution_StorageRegistry corba_registry); -EvolutionStorageResult evolution_storage_register_on_shell (EvolutionStorage *evolution_storage, - GNOME_Evolution_Shell corba_shell); -EvolutionStorageResult evolution_storage_new_folder (EvolutionStorage *evolution_storage, - const char *path, - const char *display_name, - const char *type, - const char *physical_uri, - const char *description, - gboolean highlighted); -EvolutionStorageResult evolution_storage_update_folder (EvolutionStorage *evolution_storage, - const char *path, - const char *display_name, - gboolean highlighted); -EvolutionStorageResult evolution_storage_removed_folder (EvolutionStorage *evolution_storage, - const char *path); +EvolutionStorageResult evolution_storage_register (EvolutionStorage *storage, + GNOME_Evolution_StorageRegistry corba_registry); +EvolutionStorageResult evolution_storage_register_on_shell (EvolutionStorage *evolution_storage, + GNOME_Evolution_Shell corba_shell); +EvolutionStorageResult evolution_storage_new_folder (EvolutionStorage *evolution_storage, + const char *path, + const char *display_name, + const char *type, + const char *physical_uri, + const char *description, + gboolean highlighted); +EvolutionStorageResult evolution_storage_update_folder (EvolutionStorage *evolution_storage, + const char *path, + const char *display_name, + gboolean highlighted); +EvolutionStorageResult evolution_storage_update_folder_by_uri (EvolutionStorage *evolution_storage, + const char *physical_uri, + const char *display_name, + gboolean highlighted); +EvolutionStorageResult evolution_storage_removed_folder (EvolutionStorage *evolution_storage, + const char *path); #ifdef __cplusplus } |