aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/e-pub-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui/e-pub-utils.c')
-rw-r--r--calendar/gui/e-pub-utils.c310
1 files changed, 310 insertions, 0 deletions
diff --git a/calendar/gui/e-pub-utils.c b/calendar/gui/e-pub-utils.c
new file mode 100644
index 0000000000..2d6cce62ec
--- /dev/null
+++ b/calendar/gui/e-pub-utils.c
@@ -0,0 +1,310 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/* Evolution calendar Free/Busy utilities and types
+ *
+ * Copyright (C) 2004 Ximian, Inc.
+ *
+ * Author: Gary Ekker <gekker@novell.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * 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 <string.h>
+#include <glib.h>
+#include <gconf/gconf.h>
+#include <gconf/gconf-client.h>
+#include <libedataserver/e-source.h>
+#include <libedataserver/e-source-list.h>
+#include <libecal/e-cal-time-util.h>
+#include "calendar-config.h"
+#include "common/authentication.h"
+#include "itip-utils.h"
+#include "e-pub-utils.h"
+
+void
+e_pub_uri_from_xml (EPublishUri *uri, const gchar *xml)
+{
+ xmlDocPtr doc;
+ xmlNodePtr root, p;
+ xmlChar *location, *enabled, *frequency;
+ xmlChar *username, *password, *publish_time;
+ GSList *l = NULL;
+
+ uri->location = NULL;
+ doc = xmlParseDoc ((char *)xml);
+ if (doc == NULL) {
+ uri->location = NULL;
+ return;
+ }
+
+ root = doc->children;
+ if (strcmp (root->name, "uri") != 0) {
+ return;
+ }
+ location = xmlGetProp (root, "location");
+ enabled = xmlGetProp (root, "enabled");
+ frequency = xmlGetProp (root, "frequency");
+ username = xmlGetProp (root, "username");
+ password = xmlGetProp (root, "password");
+ publish_time = xmlGetProp (root, "publish_time");
+
+ if (location != NULL)
+ uri->location = g_strdup (location);
+ if (enabled != NULL)
+ uri->enabled = atoi (enabled);
+ if (frequency != NULL)
+ uri->publish_freq = atoi (frequency);
+ if (username != NULL)
+ uri->username = g_strdup (username);
+ if (password != NULL)
+ uri->password = g_strdup (password);
+ if (publish_time != NULL)
+ uri->last_pub_time = g_strdup (publish_time);
+
+ for (p = root->children; p != NULL; p = p->next) {
+ xmlChar *uid = xmlGetProp (p, "uid");
+
+ l = g_slist_append (l, uid);
+ }
+ uri->calendars = l;
+
+ xmlFree(location);
+ xmlFree(enabled);
+ xmlFreeDoc(doc);
+ return;
+}
+
+gchar *
+e_pub_uri_to_xml (EPublishUri *uri)
+{
+ xmlDocPtr doc;
+ xmlNodePtr root;
+ gchar *enabled, *frequency;
+ GSList *cals = 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_freq);
+ xmlSetProp (root, "location", uri->location);
+ xmlSetProp (root, "enabled", enabled);
+ xmlSetProp (root, "frequency", frequency);
+ xmlSetProp (root, "username", uri->username);
+ xmlSetProp (root, "password", uri->password);
+ xmlSetProp (root, "publish_time", uri->last_pub_time);
+
+ for (cals = uri->calendars; cals != NULL; cals = cals->next) {
+ xmlNodePtr node;
+
+ node = xmlNewChild (root, NULL, "source", NULL);
+ xmlSetProp (node, "uid", cals->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);
+
+ return returned_buffer;
+}
+
+static gboolean
+is_publish_time (EPublishUri *uri) {
+ icaltimezone *utc;
+ struct icaltimetype current_itt, adjust_itt;
+
+ if (!uri->last_pub_time) {
+ utc = icaltimezone_get_utc_timezone ();
+ current_itt = icaltime_current_time_with_zone (utc);
+ uri->last_pub_time = g_strdup (icaltime_as_ical_string (current_itt));
+ return TRUE;
+
+ } else {
+ if (strlen (uri->last_pub_time) == 0) {
+ uri->last_pub_time = g_strdup (icaltime_as_ical_string (current_itt));
+ return TRUE;
+ }
+
+ utc = icaltimezone_get_utc_timezone ();
+ current_itt = icaltime_current_time_with_zone (utc);
+ adjust_itt = icaltime_from_string (uri->last_pub_time);
+
+ switch (uri->publish_freq) {
+ case URI_PUBLISH_DAILY:
+ icaltime_adjust (&adjust_itt, 1, 0, 0, 0);
+ if (icaltime_compare_date_only (adjust_itt, current_itt ) < 0) {
+ uri->last_pub_time = g_strdup (icaltime_as_ical_string (current_itt));
+ return TRUE;
+ }
+ break;
+ case URI_PUBLISH_WEEKLY:
+ icaltime_adjust (&adjust_itt, 7, 0, 0, 0);
+ if (icaltime_compare_date_only (adjust_itt, current_itt ) < 0) {
+ uri->last_pub_time = g_strdup (icaltime_as_ical_string (current_itt));
+ return TRUE;
+ }
+ break;
+ }
+ }
+
+ return FALSE;
+}
+
+static gboolean
+just_published (gchar *last_pub_time) {
+ icaltimezone *utc;
+ struct icaltimetype pubtime_itt, adjust_itt;
+
+ if (strlen (last_pub_time) != 0) {
+ utc = icaltimezone_get_utc_timezone ();
+ pubtime_itt = icaltime_from_string (last_pub_time);
+ adjust_itt = icaltime_current_time_with_zone (utc);
+ icaltime_adjust (&adjust_itt, 0, 0, 0, 3);
+ if (icaltime_compare_date_only (pubtime_itt, adjust_itt) < 0)
+ return TRUE;
+ }
+
+
+ return FALSE;
+}
+
+void
+e_pub_publish (gboolean publish) {
+ icaltimezone *utc;
+ time_t start = time (NULL), end;
+ GSList *uri_config_list, *l, *uri_list = NULL;
+ ESourceList *source_list;
+ GConfClient *gconf_client;
+ gboolean published = FALSE;
+
+ gconf_client = gconf_client_get_default ();
+ source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/calendar/sources");
+
+ utc = icaltimezone_get_utc_timezone ();
+ start = time_day_begin_with_zone (start, utc);
+ end = time_add_week_with_zone (start, 6, utc);
+
+ uri_config_list = calendar_config_get_free_busy ();
+
+ for (l = uri_config_list; l != NULL; l = l->next) {
+ GSList *p =NULL;
+ EPublishUri *uri;
+ ECalComponent *clone = NULL;
+ gboolean cloned = FALSE;
+ ECal *client = NULL;
+ gchar *xml = (gchar *)uri_config_list->data;
+
+ uri = g_new0 (EPublishUri, 1);
+ e_pub_uri_from_xml (uri, xml);
+
+ /* kludge to safeguard against loop from gconf update */
+ if (just_published (uri->last_pub_time))
+ return;
+
+ /* TODO: make sure we're online */
+ /* skip this url if it isn't enabled or if it is manual */
+ if (!uri->enabled) {
+ uri_config_list = g_slist_next (uri_config_list);
+ continue;
+ }
+
+ if (!publish) {
+ /* a g_idle publish, make sure we are not set to user only */
+ if (uri->publish_freq == URI_PUBLISH_USER) {
+ uri_config_list = g_slist_next (uri_config_list);
+ continue;
+ }
+
+ /* If not is it time to publish again? */
+ publish = is_publish_time (uri);
+
+ }
+
+ /* User published or config change */
+ if (publish) {
+ /* We still need to set the last_pub_time */
+ uri->last_pub_time = 0;
+ is_publish_time (uri);
+
+ for (p = uri->calendars; p != NULL; p = p->next) {
+ GList *comp_list = NULL;
+ gchar *source_uid;
+ ESource * source;
+
+ source_uid = g_strdup (p->data);
+ source = e_source_list_peek_source_by_uid (source_list, source_uid);
+
+ client = auth_new_cal_from_uri (e_source_get_uri (source), E_CAL_SOURCE_TYPE_EVENT);
+
+ if (!client) {
+ g_warning (G_STRLOC ": Could not publish Free/Busy: Calendar backend no longer exists");
+
+ continue;
+ }
+
+ e_cal_open (client, TRUE, NULL);
+
+ if (e_cal_get_free_busy ((ECal *) client, NULL,
+ start, end,
+ &comp_list, NULL)) {
+ GList *l;
+
+ for (l = comp_list; l; l = l->next) {
+ ECalComponent *comp = E_CAL_COMPONENT (l->data);
+
+ cloned = itip_publish_begin (comp, (ECal *) client, cloned, &clone);
+ g_object_unref (comp);
+ }
+ g_list_free (comp_list);
+ }
+
+ g_object_unref (client);
+
+ g_free (source_uid);
+ }
+
+ published = itip_publish_comp ((ECal *) client,
+ uri->location,
+ uri->username,
+ uri->password, &clone);
+
+ g_slist_free (p);
+ }
+ xml = e_pub_uri_to_xml (uri);
+ if (xml != NULL) {
+ uri_list = g_slist_append (uri_list, xml);
+ }
+ g_free (uri);
+ }
+
+ if (published) {
+ /* Update gconf so we have the last_pub_time */
+ calendar_config_set_free_busy (uri_list);
+ }
+
+ g_slist_free (uri_config_list);
+ g_slist_free (uri_list);
+}