aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/cal-util/cal-component.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/cal-util/cal-component.c')
-rw-r--r--calendar/cal-util/cal-component.c386
1 files changed, 386 insertions, 0 deletions
diff --git a/calendar/cal-util/cal-component.c b/calendar/cal-util/cal-component.c
new file mode 100644
index 0000000000..bb2fd1a50e
--- /dev/null
+++ b/calendar/cal-util/cal-component.c
@@ -0,0 +1,386 @@
+/* Evolution calendar - iCalendar component object
+ *
+ * Copyright (C) 2000 Helix Code, Inc.
+ *
+ * Author: Federico Mena-Quintero <federico@helixcode.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 <config.h>
+#include <unistd.h>
+#include "cal-component.h"
+#include "timeutil.h"
+
+
+
+/* Private part of the CalComponent structure */
+typedef struct {
+ /* Type of this component */
+ CalComponentVType type;
+
+ /* Summary string, optional */
+ char *summary;
+
+ /* Unique identifier, MUST be present */
+ char *uid;
+} CalComponentPrivate;
+
+
+
+static void cal_component_class_init (CalComponentClass *class);
+static void cal_component_init (CalComponent *comp);
+static void cal_component_destroy (GtkObject *object);
+
+static GtkObjectClass *parent_class;
+
+
+
+/**
+ * cal_component_get_type:
+ * @void:
+ *
+ * Registers the #CalComponent class if necessary, and returns the type ID
+ * associated to it.
+ *
+ * Return value: The type ID of the #CalComponent class.
+ **/
+GtkType
+cal_component_get_type (void)
+{
+ static GtkType cal_component_type = 0;
+
+ if (!cal_component_type) {
+ static const GtkTypeInfo cal_component_info = {
+ "CalComponent",
+ sizeof (CalComponent),
+ sizeof (CalComponentClass),
+ (GtkClassInitFunc) cal_component_class_init,
+ (GtkObjectInitFunc) cal_component_init,
+ NULL, /* reserved_1 */
+ NULL, /* reserved_2 */
+ (GtkClassInitFunc) NULL
+ };
+
+ cal_component_type = gtk_type_unique (GTK_TYPE_OBJECT, &cal_component_info);
+ }
+
+ return cal_component_type;
+}
+
+/* Class initialization function for the calendar component object */
+static void
+cal_component_class_init (CalComponentClass *class)
+{
+ GtkObjectClass *object_class;
+
+ object_class = (GtkObjectClass *) class;
+
+ parent_class = gtk_type_class (GTK_TYPE_OBJECT);
+
+ object_class->destroy = cal_component_destroy;
+}
+
+/* Object initialization function for the calendar component object */
+static void
+cal_component_init (CalComponent *comp)
+{
+ CalComponentPrivate *priv;
+
+ priv = g_new0 (CalComponentPrivate, 1);
+ comp->priv = priv;
+
+ priv->uid = cal_component_gen_uid ();
+}
+
+/* Destroy handler for the calendar component object */
+static void
+cal_component_destroy (GtkObject *object)
+{
+ CalComponent *comp;
+ CalComponentPrivate *priv;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (IS_CAL_COMPONENT (object));
+
+ comp = CAL_COMPONENT (object);
+ priv = comp->priv;
+
+ if (priv->uid) {
+ g_free (priv->uid);
+ priv->uid = NULL;
+ }
+
+ g_free (priv);
+ comp->priv = NULL;
+
+ if (GTK_OBJECT_CLASS (parent_class)->destroy)
+ (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+
+
+/**
+ * cal_component_gen_uid:
+ * @void:
+ *
+ * Generates a unique identifier suitable for calendar components.
+ *
+ * Return value: A unique identifier string. Every time this function is called
+ * a different string is returned.
+ **/
+char *
+cal_component_gen_uid (void)
+{
+ static char *hostname;
+ time_t t = time (NULL);
+ static int serial;
+
+ if (!hostname) {
+ static char buffer [512];
+
+ if ((gethostname (buffer, sizeof (buffer) - 1) == 0) &&
+ (buffer [0] != 0))
+ hostname = buffer;
+ else
+ hostname = "localhost";
+ }
+
+ return g_strdup_printf (
+ "%s-%d-%d-%d-%d@%s",
+ isodate_from_time_t (t),
+ getpid (),
+ getgid (),
+ getppid (),
+ serial++,
+ hostname);
+}
+
+/**
+ * cal_component_new:
+ * @void:
+ *
+ * Creates a new empty calendar component object whose only set field is the
+ * unique identifier. You should set the type of this component as soon as
+ * possible by using cal_component_set_vtype().
+ *
+ * Return value: A newly-created calendar component object.
+ **/
+CalComponent *
+cal_component_new (void)
+{
+ return CAL_COMPONENT (gtk_type_new (CAL_COMPONENT_TYPE));
+}
+
+/* Parses a property and stores it in the calendar component */
+static void
+load_property (CalComponent *comp, icalproperty *prop)
+{
+ icalproperty_kind kind;
+
+ kind = icalproperty_isa (prop);
+
+ /* FIXME */
+}
+
+/**
+ * cal_component_new_from_icalcomponent:
+ * @ical: An #icalcomponent structure with the component to parse.
+ *
+ * Creates a new calendar component object from an #icalcomponent from libical.
+ * This function only deals with VEVENT, VTODO, VJOURNAL, VFREEBUSY, AND
+ * VTIMEZONE components.
+ *
+ * Return value: A newly-created calendar component object.
+ **/
+CalComponent *
+cal_component_new_from_icalcomponent (icalcomponent *ical)
+{
+ CalComponent *comp;
+ icalcomponent_kind kind;
+ CalComponentVType type;
+ icalproperty *prop;
+
+ g_return_val_if_fail (ical != NULL, NULL);
+
+ kind = icalcomponent_isa (ical);
+
+ switch (kind) {
+ case ICAL_VEVENT_COMPONENT:
+ type = CAL_COMPONENT_EVENT;
+ break;
+
+ case ICAL_VTODO_COMPONENT:
+ type = CAL_COMPONENT_TODO;
+ break;
+
+ case ICAL_VJOURNAL_COMPONENT:
+ type = CAL_COMPONENT_JOURNAL;
+ break;
+
+ case ICAL_VFREEBUSY_COMPONENT:
+ type = CAL_COMPONENT_FREEBUSY;
+ break;
+
+ case ICAL_VTIMEZONE_COMPONENT:
+ type = CAL_COMPONENT_TIMEZONE;
+ break;
+
+ default:
+ g_message ("cal_component_new_from_icalcomponent(): Unsupported component type %d",
+ kind);
+ return NULL;
+ }
+
+ comp = cal_component_new ();
+ cal_component_set_vtype (comp, type);
+
+ for (prop = icalcomponent_get_first_property (ical, ICAL_ANY_PROPERTY);
+ prop;
+ prop = icalcomponent_get_next_property (ical, ICAL_ANY_PROPERTY))
+ load_property (comp, prop);
+
+ /* FIXME: parse ALARM subcomponents */
+
+ return comp;
+}
+
+/**
+ * cal_component_get_vtype:
+ * @comp: A calendar component object.
+ *
+ * Queries the type of a calendar component object.
+ *
+ * Return value: The type of the component, as defined by RFC 2445.
+ **/
+CalComponentVType
+cal_component_get_vtype (CalComponent *comp)
+{
+ CalComponentPrivate *priv;
+
+ g_return_val_if_fail (comp != NULL, CAL_COMPONENT_NO_TYPE);
+ g_return_val_if_fail (IS_CAL_COMPONENT (comp), CAL_COMPONENT_NO_TYPE);
+
+ priv = comp->priv;
+ return priv->type;
+}
+
+/**
+ * cal_component_set_vtype:
+ * @comp: A calendar component object.
+ * @type: Type of the component, as defined by RFC 2445.
+ *
+ * Sets the type of a calendar component object. This function should be used
+ * as soon as possible after creating a new calendar component so that its type
+ * can be known to the rest of the program.
+ **/
+void
+cal_component_set_vtype (CalComponent *comp, CalComponentVType type)
+{
+ CalComponentPrivate *priv;
+
+ g_return_if_fail (comp != NULL);
+ g_return_if_fail (IS_CAL_COMPONENT (comp));
+ g_return_if_fail (type != CAL_COMPONENT_NO_TYPE);
+
+ priv = comp->priv;
+ priv->type = type;
+}
+
+/**
+ * cal_component_get_uid:
+ * @comp: A calendar component object.
+ *
+ * Queries the unique identifier of a calendar component object.
+ *
+ * Return value: The unique identifier string.
+ **/
+const char *
+cal_component_get_uid (CalComponent *comp)
+{
+ CalComponentPrivate *priv;
+
+ g_return_val_if_fail (comp != NULL, NULL);
+ g_return_val_if_fail (IS_CAL_COMPONENT (comp), NULL);
+
+ priv = comp->priv;
+ return priv->uid;
+}
+
+/**
+ * cal_component_set_uid:
+ * @comp: A calendar component object.
+ * @uid: Unique identifier.
+ *
+ * Sets the unique identifier string of a calendar component object.
+ **/
+void
+cal_component_set_uid (CalComponent *comp, const char *uid)
+{
+ CalComponentPrivate *priv;
+
+ g_return_if_fail (comp != NULL);
+ g_return_if_fail (IS_CAL_COMPONENT (comp));
+ g_return_if_fail (uid != NULL);
+
+ priv = comp->priv;
+ g_assert (priv->uid != NULL);
+
+ g_free (priv->uid);
+ priv->uid = g_strdup (uid);
+}
+
+/**
+ * cal_component_get_summary:
+ * @comp: A calendar component object.
+ *
+ * Queries the summary of a calendar component object.
+ *
+ * Return value: Summary string.
+ **/
+const char *
+cal_component_get_summary (CalComponent *comp)
+{
+ CalComponentPrivate *priv;
+
+ g_return_val_if_fail (comp != NULL, NULL);
+ g_return_val_if_fail (IS_CAL_COMPONENT (comp), NULL);
+
+ priv = comp->priv;
+ return priv->summary;
+}
+
+/**
+ * cal_component_set_summary:
+ * @comp: A calendar component object.
+ * @summary: Summary string.
+ *
+ * Sets the summary of a calendar component object.
+ **/
+void
+cal_component_set_summary (CalComponent *comp, const char *summary)
+{
+ CalComponentPrivate *priv;
+
+ g_return_if_fail (comp != NULL);
+ g_return_if_fail (IS_CAL_COMPONENT (comp));
+
+ priv = comp->priv;
+
+ if (priv->summary)
+ g_free (priv->summary);
+
+ priv->summary = g_strdup (summary);
+}