diff options
author | Chris Toshok <toshok@helixcode.com> | 2000-07-06 02:26:05 +0800 |
---|---|---|
committer | Chris Toshok <toshok@src.gnome.org> | 2000-07-06 02:26:05 +0800 |
commit | ca5704f99607dc1adf3d45387eb432a98500d3ab (patch) | |
tree | 0f450f01e659e4d6c6f7efdc49c1ff72967e54bb /addressbook/gui/component/e-ldap-storage.c | |
parent | 6cfd18ee1c0ac3ba06fdf1341e97bc8a6acd05ad (diff) | |
download | gsoc2013-evolution-ca5704f99607dc1adf3d45387eb432a98500d3ab.tar gsoc2013-evolution-ca5704f99607dc1adf3d45387eb432a98500d3ab.tar.gz gsoc2013-evolution-ca5704f99607dc1adf3d45387eb432a98500d3ab.tar.bz2 gsoc2013-evolution-ca5704f99607dc1adf3d45387eb432a98500d3ab.tar.lz gsoc2013-evolution-ca5704f99607dc1adf3d45387eb432a98500d3ab.tar.xz gsoc2013-evolution-ca5704f99607dc1adf3d45387eb432a98500d3ab.tar.zst gsoc2013-evolution-ca5704f99607dc1adf3d45387eb432a98500d3ab.zip |
remove hack to read "uri" file from local directory.
2000-07-05 Chris Toshok <toshok@helixcode.com>
* gui/component/addressbook.c (set_prop): remove hack to read
"uri" file from local directory.
* gui/component/Makefile.am (evolution_addressbook_SOURCES): add
e-ldap-storage.{c,h}
* gui/component/addressbook-component.c (owner_set_cb): call
setup_ldap_storage.
* gui/component/e-ldap-storage.c (setup_ldap_storage): Register
the LDAP storage and load the .xml file.
(load_ldap_data): function to load our xml file.
(save_ldap_data): function to save our xml file.
svn path=/trunk/; revision=3890
Diffstat (limited to 'addressbook/gui/component/e-ldap-storage.c')
-rw-r--r-- | addressbook/gui/component/e-ldap-storage.c | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/addressbook/gui/component/e-ldap-storage.c b/addressbook/gui/component/e-ldap-storage.c new file mode 100644 index 0000000000..e3663452bc --- /dev/null +++ b/addressbook/gui/component/e-ldap-storage.c @@ -0,0 +1,202 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* e-ldap-storage.c + * + * Copyright (C) 2000 Helix Code, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Chris Toshok + */ + +/* The ldap server file goes like this: + + <?xml version="1.0"?> + <contactservers> + <contactserver> + <name>LDAP Server</name> + <description>This is my company address book.</description> + <uri>ldap://ldap.somewhere.net/</uri> + </contactserver> + </contactservers> + + FIXME: Do we want to use a namespace for this? + FIXME: Do we want to have an internationalized description? + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <bonobo.h> + +#include "evolution-shell-component.h" +#include "evolution-storage.h" + +#include <gnome-xml/parser.h> +#include <gnome-xml/xmlmemory.h> + +#include "e-ldap-storage.h" +#include "e-ldap-server-dialog.h" + +#include "e-util/e-util.h" +#include "e-util/e-xml-utils.h" + +#define LDAPSERVER_XML "ldapservers.xml" + +static gboolean load_ldap_data (EvolutionStorage *storage, const char *file_path); +static gboolean save_ldap_data (const char *file_path); + +GHashTable *servers; + +void +setup_ldap_storage (EvolutionShellComponent *shell_component) +{ + EvolutionShellClient *shell_client; + Evolution_Shell corba_shell; + EvolutionStorage *storage; + char *path; + + shell_client = evolution_shell_component_get_owner (shell_component); + if (shell_client == CORBA_OBJECT_NIL) { + g_warning ("We have no shell!?"); + return; + } + + corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell_client)); + + storage = evolution_storage_new (_("External Directories")); + if (evolution_storage_register_on_shell (storage, corba_shell) != EVOLUTION_STORAGE_OK) { + g_warning ("Cannot register storage"); + return; + } + + /* save the storage for later */ + gtk_object_set_data (GTK_OBJECT (shell_component), "e-storage", storage); + + path = g_strdup_printf ("%s/evolution/" LDAPSERVER_XML, g_get_home_dir()); + load_ldap_data (storage, path); + g_free (path); +} + +static char * +get_string_value (xmlNode *node, + const char *name) +{ + xmlNode *p; + xmlChar *xml_string; + char *retval; + + p = e_xml_get_child_by_name (node, (xmlChar *) name); + if (p == NULL) + return NULL; + + p = e_xml_get_child_by_name (p, (xmlChar *) "text"); + if (p == NULL) + return NULL; + + xml_string = xmlNodeListGetString (node->doc, p, 1); + retval = g_strdup ((char *) xml_string); + xmlFree (xml_string); + + return retval; +} + +static gboolean +load_ldap_data (EvolutionStorage *storage, + const char *file_path) +{ + xmlDoc *doc; + xmlNode *root; + xmlNode *child; + + doc = xmlParseFile (file_path); + if (doc == NULL) { + return FALSE; + } + + root = xmlDocGetRootElement (doc); + if (root == NULL || strcmp (root->name, "contactservers") != 0) { + xmlFreeDoc (doc); + return FALSE; + } + + for (child = root->childs; child; child = child->next) { + char *path; + char *name; + char *uri; + char *description; + + if (strcmp (child->name, "contactserver")) { + g_warning ("unknown node '%s' in %s", child->name, file_path); + continue; + } + + name = get_string_value (child, "name"); + uri = get_string_value (child, "uri"); + description = get_string_value (child, "description"); + + path = g_strdup_printf ("/%s", name); + evolution_storage_new_folder (storage, path, "contacts", uri, description); + + g_free (path); + g_free (name); + g_free (uri); + g_free (description); + } + + xmlFreeDoc (doc); + + return TRUE; +} + +static void +ldap_server_foreach(gpointer key, gpointer value, gpointer user_data) +{ + ELDAPServer *server = (ELDAPServer*)value; + xmlNode *root = (xmlNode*)user_data; + + xmlNewChild (root, NULL, (xmlChar *) "name", + (xmlChar *) server->name); + + xmlNewChild (root, NULL, (xmlChar *) "uri", + (xmlChar *) server->uri); + + if (server->description) + xmlNewChild (root, NULL, (xmlChar *) "description", + (xmlChar *) server->description); +} + +static gboolean +save_ldap_data (const char *file_path) +{ + xmlDoc *doc; + xmlNode *root; + + doc = xmlNewDoc ((xmlChar *) "1.0"); + root = xmlNewDocNode (doc, NULL, (xmlChar *) "contactservers", NULL); + xmlDocSetRootElement (doc, root); + + g_hash_table_foreach (servers, ldap_server_foreach, root); + + if (xmlSaveFile (file_path, doc) < 0) { + unlink (file_path); + xmlFreeDoc (doc); + return FALSE; + } + + xmlFreeDoc (doc); + return TRUE; +} |