aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/publish-calendar/publish-location.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/publish-calendar/publish-location.c')
-rw-r--r--plugins/publish-calendar/publish-location.c275
1 files changed, 275 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..79eddfc4f7
--- /dev/null
+++ b/plugins/publish-calendar/publish-location.c
@@ -0,0 +1,275 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ *
+ * Authors:
+ * David Trowbridge <trowbrds@cs.colorado.edu>
+ * Gary Ekker <gekker@novell.com>
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "publish-location.h"
+
+#include <string.h>
+#include <libxml/tree.h>
+
+#include "e-util/e-util.h"
+
+static EPublishUri *
+migrateURI (const gchar *xml,
+ xmlDocPtr doc)
+{
+ GSettings *settings;
+ GSList *events = NULL;
+ gchar **set_uris;
+ GPtrArray *uris_array;
+ xmlChar *location, *enabled, *frequency, *username;
+ xmlNodePtr root, p;
+ EPublishUri *uri;
+ gchar *password, *temp;
+ SoupURI *soup_uri;
+ gint ii;
+ gboolean found = FALSE;
+
+ uri = g_new0 (EPublishUri, 1);
+
+ root = doc->children;
+ location = xmlGetProp (root, (const guchar *)"location");
+ enabled = xmlGetProp (root, (const guchar *)"enabled");
+ frequency = xmlGetProp (root, (const guchar *)"frequency");
+ username = xmlGetProp (root, (const guchar *)"username");
+
+ soup_uri = soup_uri_new ((gchar *) location);
+
+ if (soup_uri == NULL) {
+ g_warning ("Could not form the uri for %s \n", location);
+ goto cleanup;
+ }
+
+ soup_uri_set_user (soup_uri, (gchar *) username);
+
+ temp = soup_uri_to_string (soup_uri, FALSE);
+ uri->location = g_strdup_printf ("dav://%s", strstr (temp, "//") + 2);
+ g_free (temp);
+
+ soup_uri_free (soup_uri);
+
+ if (enabled != NULL)
+ uri->enabled = atoi ((gchar *) enabled);
+ if (frequency != NULL)
+ uri->publish_frequency = atoi ((gchar *) frequency);
+ uri->publish_format = URI_PUBLISH_AS_FB;
+
+ password = e_passwords_get_password ((gchar *) location);
+ if (password) {
+ e_passwords_forget_password ((gchar *) location);
+ e_passwords_add_password (uri->location, password);
+ e_passwords_remember_password (uri->location);
+ }
+
+ for (p = root->children; p != NULL; p = p->next) {
+ xmlChar *uid = xmlGetProp (p, (const guchar *)"uid");
+ if (strcmp ((gchar *) p->name, "source") == 0) {
+ events = g_slist_append (events, uid);
+ } else {
+ g_free (uid);
+ }
+ }
+ uri->events = events;
+
+ uris_array = g_ptr_array_new_full (3, g_free);
+
+ settings = g_settings_new (PC_SETTINGS_ID);
+ set_uris = g_settings_get_strv (settings, PC_SETTINGS_URIS);
+
+ for (ii = 0; set_uris && set_uris[ii]; ii++) {
+ const gchar *str = set_uris[ii];
+ if (!found && g_str_equal (xml, str)) {
+ found = TRUE;
+ g_ptr_array_add (uris_array, e_publish_uri_to_xml (uri));
+ } else {
+ g_ptr_array_add (uris_array, g_strdup (str));
+ }
+ }
+
+ g_strfreev (set_uris);
+
+ /* this should not happen, right? */
+ if (!found)
+ g_ptr_array_add (uris_array, e_publish_uri_to_xml (uri));
+ g_ptr_array_add (uris_array, NULL);
+
+ g_settings_set_strv (settings, PC_SETTINGS_URIS, (const gchar * const *) uris_array->pdata);
+
+ g_ptr_array_free (uris_array, TRUE);
+ g_object_unref (settings);
+
+cleanup:
+ xmlFree (location);
+ xmlFree (enabled);
+ xmlFree (frequency);
+ xmlFree (username);
+ xmlFreeDoc (doc);
+
+ return uri;
+}
+
+EPublishUri *
+e_publish_uri_from_xml (const gchar *xml)
+{
+ xmlDocPtr doc;
+ xmlNodePtr root, p;
+ xmlChar *location, *enabled, *frequency, *fb_duration_value, *fb_duration_type;
+ xmlChar *publish_time, *format, *username = NULL;
+ GSList *events = NULL;
+ EPublishUri *uri;
+
+ doc = xmlParseDoc ((const guchar *) xml);
+ if (doc == NULL)
+ return NULL;
+
+ root = doc->children;
+ if (strcmp ((gchar *) root->name, "uri") != 0)
+ return NULL;
+
+ if ((username = xmlGetProp (root, (const guchar *)"username"))) {
+ xmlFree (username);
+ return migrateURI (xml, doc);
+
+ }
+
+ uri = g_new0 (EPublishUri, 1);
+
+ location = xmlGetProp (root, (const guchar *)"location");
+ enabled = xmlGetProp (root, (const guchar *)"enabled");
+ frequency = xmlGetProp (root, (const guchar *)"frequency");
+ format = xmlGetProp (root, (const guchar *)"format");
+ publish_time = xmlGetProp (root, (const guchar *)"publish_time");
+ fb_duration_value = xmlGetProp (root, (xmlChar *)"fb_duration_value");
+ fb_duration_type = xmlGetProp (root, (xmlChar *)"fb_duration_type");
+
+ if (location != NULL)
+ uri->location = (gchar *) location;
+ if (enabled != NULL)
+ uri->enabled = atoi ((gchar *) enabled);
+ if (frequency != NULL)
+ uri->publish_frequency = atoi ((gchar *) frequency);
+ if (format != NULL)
+ uri->publish_format = atoi ((gchar *) format);
+ if (publish_time != NULL)
+ uri->last_pub_time = (gchar *) publish_time;
+
+ if (fb_duration_value)
+ uri->fb_duration_value = atoi ((gchar *) fb_duration_value);
+ else
+ uri->fb_duration_value = -1;
+
+ if (uri->fb_duration_value < 1)
+ uri->fb_duration_value = 6;
+ else if (uri->fb_duration_value > 100)
+ uri->fb_duration_value = 100;
+
+ if (fb_duration_type && g_str_equal ((gchar *) fb_duration_type, "days"))
+ uri->fb_duration_type = FB_DURATION_DAYS;
+ else if (fb_duration_type && g_str_equal ((gchar *) fb_duration_type, "months"))
+ uri->fb_duration_type = FB_DURATION_MONTHS;
+ else
+ uri->fb_duration_type = FB_DURATION_WEEKS;
+
+ uri->password = g_strdup ("");
+
+ for (p = root->children; p != NULL; p = p->next) {
+ xmlChar *uid = xmlGetProp (p, (const guchar *)"uid");
+ if (strcmp ((gchar *) p->name, "event") == 0) {
+ events = g_slist_append (events, uid);
+ } else {
+ g_free (uid);
+ }
+ }
+ uri->events = events;
+
+ xmlFree (enabled);
+ xmlFree (frequency);
+ xmlFree (format);
+ xmlFree (fb_duration_value);
+ xmlFree (fb_duration_type);
+ 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;
+ gchar *returned_buffer;
+ gint xml_buffer_size;
+
+ g_return_val_if_fail (uri != NULL, NULL);
+ g_return_val_if_fail (uri->location != NULL, NULL);
+
+ doc = xmlNewDoc ((const guchar *)"1.0");
+
+ root = xmlNewDocNode (doc, NULL, (const guchar *)"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, (const guchar *)"location", (guchar *) uri->location);
+ xmlSetProp (root, (const guchar *)"enabled", (guchar *) enabled);
+ xmlSetProp (root, (const guchar *)"frequency", (guchar *) frequency);
+ xmlSetProp (root, (const guchar *)"format", (guchar *) format);
+ xmlSetProp (root, (const guchar *)"publish_time", (guchar *) uri->last_pub_time);
+
+ g_free (format);
+ format = g_strdup_printf ("%d", uri->fb_duration_value);
+ xmlSetProp (root, (xmlChar *)"fb_duration_value", (xmlChar *) format);
+
+ if (uri->fb_duration_type == FB_DURATION_DAYS)
+ xmlSetProp (root, (xmlChar *)"fb_duration_type", (xmlChar *)"days");
+ else if (uri->fb_duration_type == FB_DURATION_MONTHS)
+ xmlSetProp (root, (xmlChar *)"fb_duration_type", (xmlChar *)"months");
+ else
+ xmlSetProp (root, (xmlChar *)"fb_duration_type", (xmlChar *)"weeks");
+
+ for (calendars = uri->events; calendars != NULL;
+ calendars = g_slist_next (calendars)) {
+ xmlNodePtr node;
+ node = xmlNewChild (root, NULL, (const guchar *)"event", NULL);
+ xmlSetProp (node, (const guchar *)"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;
+}