aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/publish-calendar/publish-location.c
diff options
context:
space:
mode:
authorChenthill Palanisamy <pchen@src.gnome.org>2005-12-19 18:08:10 +0800
committerChenthill Palanisamy <pchen@src.gnome.org>2005-12-19 18:08:10 +0800
commit58245bd32da1d2779a802b16a4e04d9fdae3b348 (patch)
tree598e35f1fad6185115470da8f76e7c2afa550d73 /plugins/publish-calendar/publish-location.c
parenteb46584e35649fc451af2e3ec3b60a7bba399738 (diff)
downloadgsoc2013-evolution-58245bd32da1d2779a802b16a4e04d9fdae3b348.tar
gsoc2013-evolution-58245bd32da1d2779a802b16a4e04d9fdae3b348.tar.gz
gsoc2013-evolution-58245bd32da1d2779a802b16a4e04d9fdae3b348.tar.bz2
gsoc2013-evolution-58245bd32da1d2779a802b16a4e04d9fdae3b348.tar.lz
gsoc2013-evolution-58245bd32da1d2779a802b16a4e04d9fdae3b348.tar.xz
gsoc2013-evolution-58245bd32da1d2779a802b16a4e04d9fdae3b348.tar.zst
gsoc2013-evolution-58245bd32da1d2779a802b16a4e04d9fdae3b348.zip
Committing the intial patch for calendar publishing.
svn path=/trunk/; revision=30875
Diffstat (limited to 'plugins/publish-calendar/publish-location.c')
-rw-r--r--plugins/publish-calendar/publish-location.c211
1 files changed, 211 insertions, 0 deletions
diff --git a/plugins/publish-calendar/publish-location.c b/plugins/publish-calendar/publish-location.c
new file mode 100644
index 0000000000..4c2b36780b
--- /dev/null
+++ b/plugins/publish-calendar/publish-location.c
@@ -0,0 +1,211 @@
+/*
+ * Authors:
+ * David Trowbridge <trowbrds@cs.colorado.edu>
+ * Gary Ekker <gekker@novell.com>
+ *
+ * Copyright (C) 2005 Novell, Inc (www.novell.com)
+ *
+ * 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.
+ *
+ */
+
+#include "publish-location.h"
+#include <libxml/tree.h>
+#include <gconf/gconf-client.h>
+#include <libgnomevfs/gnome-vfs.h>
+#include <libedataserverui/e-passwords.h>
+#include <string.h>
+
+static EPublishUri *
+migrateURI (const gchar *xml, xmlDocPtr doc)
+{
+ GConfClient *client;
+ GSList *uris, *l, *events = NULL;
+ xmlChar *location, *enabled, *frequency, *username;
+ xmlNodePtr root, p;
+ EPublishUri *uri;
+ GnomeVFSURI *vfs_uri;
+ gchar *password, *temp;
+
+ client = gconf_client_get_default ();
+ uris = gconf_client_get_list (client, "/apps/evolution/calendar/publish/uris", GCONF_VALUE_STRING, NULL);
+ l = uris;
+ while (l && l->data) {
+ gchar *str = l->data;
+ if (strcmp (xml, str) == 0) {
+ uris = g_slist_remove (uris, str);
+ g_free (str);
+ }
+ l = g_slist_next (l);
+ }
+
+ uri = g_new0 (EPublishUri, 1);
+
+ root = doc->children;
+ location = xmlGetProp (root, "location");
+ enabled = xmlGetProp (root, "enabled");
+ frequency = xmlGetProp (root, "frequency");
+ username = xmlGetProp (root, "username");
+
+ vfs_uri = gnome_vfs_uri_new (location);
+ gnome_vfs_uri_set_user_name (vfs_uri, username);
+ temp = gnome_vfs_uri_to_string (vfs_uri, GNOME_VFS_URI_HIDE_TOPLEVEL_METHOD | GNOME_VFS_URI_HIDE_PASSWORD);
+ uri->location = g_strdup_printf ("dav://%s", temp);
+ g_free (temp);
+ gnome_vfs_uri_unref (vfs_uri);
+
+ if (enabled != NULL)
+ uri->enabled = atoi (enabled);
+ if (frequency != NULL)
+ uri->publish_frequency = atoi (frequency);
+ uri->publish_format = URI_PUBLISH_AS_FB;
+
+ password = e_passwords_get_password ("Calendar", location);
+ if (password) {
+ e_passwords_forget_password ("Calendar", location);
+ e_passwords_add_password (uri->location, password);
+ e_passwords_remember_password ("Calendar", uri->location);
+ }
+
+ for (p = root->children; p != NULL; p = p->next) {
+ xmlChar *uid = xmlGetProp (p, "uid");
+ if (strcmp (p->name, "source") == 0) {
+ events = g_slist_append (events, uid);
+ } else {
+ g_free (uid);
+ }
+ }
+ uri->events = events;
+
+ uris = g_slist_prepend (uris, e_publish_uri_to_xml (uri));
+ gconf_client_set_list (client, "/apps/evolution/calendar/publish/uris", GCONF_VALUE_STRING, uris, NULL);
+ g_slist_foreach (uris, (GFunc) g_free, NULL);
+ g_slist_free (uris);
+ g_object_unref (client);
+
+ xmlFree (location);
+ xmlFree (enabled);
+ xmlFree (frequency);
+ xmlFreeDoc (doc);
+
+ return uri;
+}
+
+EPublishUri *
+e_publish_uri_from_xml (const gchar *xml)
+{
+ xmlDocPtr doc;
+ xmlNodePtr root, p;
+ xmlChar *location, *enabled, *frequency;
+ xmlChar *publish_time, *format;
+ GSList *events = NULL;
+ EPublishUri *uri;
+
+ doc = xmlParseDoc ((char *) xml);
+ if (doc == NULL)
+ return NULL;
+
+ root = doc->children;
+ if (strcmp (root->name, "uri") != 0)
+ return NULL;
+
+ if (xmlGetProp (root, "username"))
+ return migrateURI (xml, doc);
+
+ uri = g_new0 (EPublishUri, 1);
+
+ location = xmlGetProp (root, "location");
+ enabled = xmlGetProp (root, "enabled");
+ frequency = xmlGetProp (root, "frequency");
+ format = xmlGetProp (root, "format");
+ publish_time = xmlGetProp (root, "publish_time");
+
+ if (location != NULL)
+ uri->location = location;
+ if (enabled != NULL)
+ uri->enabled = atoi (enabled);
+ if (frequency != NULL)
+ uri->publish_frequency = atoi (frequency);
+ if (format != NULL)
+ uri->publish_format = atoi (format);
+ if (publish_time != NULL)
+ uri->last_pub_time = publish_time;
+
+ uri->password = g_strdup ("");
+
+ for (p = root->children; p != NULL; p = p->next) {
+ xmlChar *uid = xmlGetProp (p, "uid");
+ if (strcmp (p->name, "event") == 0) {
+ events = g_slist_append (events, uid);
+ } else {
+ g_free (uid);
+ }
+ }
+ uri->events = events;
+
+ xmlFree (enabled);
+ xmlFree (frequency);
+ xmlFree (format);
+ xmlFreeDoc (doc);
+
+ return uri;
+}
+
+gchar *
+e_publish_uri_to_xml (EPublishUri *uri)
+{
+ xmlDocPtr doc;
+ xmlNodePtr root;
+ gchar *enabled, *frequency, *format;
+ GSList *calendars = NULL;
+ xmlChar *xml_buffer;
+ char *returned_buffer;
+ int xml_buffer_size;
+
+ g_return_val_if_fail (uri != NULL, NULL);
+ g_return_val_if_fail (uri->location != NULL, NULL);
+
+ doc = xmlNewDoc ("1.0");
+
+ root = xmlNewDocNode (doc, NULL, "uri", NULL);
+ enabled = g_strdup_printf ("%d", uri->enabled);
+ frequency = g_strdup_printf ("%d", uri->publish_frequency);
+ format = g_strdup_printf ("%d", uri->publish_format);
+ xmlSetProp (root, "location", uri->location);
+ xmlSetProp (root, "enabled", enabled);
+ xmlSetProp (root, "frequency", frequency);
+ xmlSetProp (root, "format", format);
+ xmlSetProp (root, "publish_time", uri->last_pub_time);
+
+ for (calendars = uri->events; calendars != NULL; calendars = g_slist_next (calendars)) {
+ xmlNodePtr node;
+ node = xmlNewChild (root, NULL, "event", NULL);
+ xmlSetProp (node, "uid", calendars->data);
+ }
+ xmlDocSetRootElement (doc, root);
+
+ xmlDocDumpMemory (doc, &xml_buffer, &xml_buffer_size);
+ xmlFreeDoc (doc);
+
+ returned_buffer = g_malloc (xml_buffer_size + 1);
+ memcpy (returned_buffer, xml_buffer, xml_buffer_size);
+ returned_buffer[xml_buffer_size] = '\0';
+ xmlFree (xml_buffer);
+ g_free (enabled);
+ g_free (frequency);
+ g_free (format);
+
+ return returned_buffer;
+}