aboutsummaryrefslogtreecommitdiffstats
path: root/calendar
diff options
context:
space:
mode:
Diffstat (limited to 'calendar')
-rw-r--r--calendar/ChangeLog11
-rw-r--r--calendar/cal-backend.c88
-rw-r--r--calendar/cal.c2
-rw-r--r--calendar/pcs/cal-backend.c88
-rw-r--r--calendar/pcs/cal.c2
5 files changed, 141 insertions, 50 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index e49b508a1a..fdf45f6f6b 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,14 @@
+2000-02-04 Federico Mena Quintero <federico@helixcode.com>
+
+ * cal-backend.c (CalBackendPrivate): Renamed the event_hash field
+ to object_hash. Now we hash all the calendar's objects here based
+ on their UIDs.
+ (ensure_uid): New function to create UIDs for calendar objects
+ that don't have them.
+ (add_object): Ensure the object has an UID before inserting it in
+ the calendar.
+ (cal_backend_get_object): New function.
+
2000-02-03 Federico Mena Quintero <federico@helixcode.com>
* evolution-calendar.idl (Cal): Added the get_object() method.
diff --git a/calendar/cal-backend.c b/calendar/cal-backend.c
index 91ffd8dc1d..ffbbdab472 100644
--- a/calendar/cal-backend.c
+++ b/calendar/cal-backend.c
@@ -34,14 +34,15 @@ typedef struct {
/* List of Cal client interface objects, each with its listener */
GList *clients;
- /* All events in the calendar and uri->event hash */
- GList *events;
- GHashTable *event_hash;
+ /* All the iCalObject structures in the calendar, hashed by UID. The
+ * hash key *is* icalobj->uid; it is not copied, so don't free it when
+ * you remove an object from the hash table.
+ */
+ GHashTable *object_hash;
- /* All TODOs in the calendar */
+ /* All events, TODOs, and journals in the calendar */
+ GList *events;
GList *todos;
-
- /* All journals in the calendar */
GList *journals;
/* Whether a calendar has been loaded */
@@ -136,29 +137,65 @@ cal_backend_destroy (GtkObject *object)
-/* Adds an object to the calendar backend */
+/* iCalObject manipulation functions */
+
+/* Ensures that an iCalObject has a unique identifier. If it doesn't have one,
+ * it will create one for it. Returns whether an UID was created or not.
+ */
+static gboolean
+ensure_uid (iCalObject *ico)
+{
+ char *buf;
+ gulong str_time;
+ static guint seqno = 0;
+
+ if (ico->uid)
+ return FALSE;
+
+ str_time = (gulong) time (NULL);
+
+ /* Is this good enough? */
+
+ buf = g_strdup_printf ("Evolution-Tlacuache-%d-%ld-%u", (int) getpid(), str_time, seqno++);
+ ico->uid = buf;
+
+ return TRUE;
+}
+
+/* Adds an object to the calendar backend. Does *not* perform notification to
+ * calendar clients.
+ */
static void
add_object (CalBackend *backend, iCalObject *ico)
{
CalBackendPrivate *priv;
g_assert (ico != NULL);
- g_assert (ico->uid != NULL);
-
priv = backend->priv;
+#if 0
+ /* FIXME: gnomecal old code */
ico->new = 0;
+#endif
+
+ if (ensure_uid (ico))
+ /* FIXME: mark the calendar as dirty so that we can re-save it
+ * with the object's new UID.
+ */
+ ;
+
+ g_hash_table_insert (priv->object_hash, ico->uid, ico);
+
switch (ico->type) {
case ICAL_EVENT:
- g_hash_table_insert (priv->event_hash, ico->uid, ico);
priv->events = g_list_prepend (priv->events, ico);
#if 0
/* FIXME: gnomecal old code */
ical_object_try_alarms (ico);
-#ifdef DEBUGGING_MAIL_ALARM
+# ifdef DEBUGGING_MAIL_ALARM
ico->malarm.trigger = 0;
calendar_notify (0, ico);
-#endif
+# endif
#endif
break;
@@ -174,14 +211,6 @@ add_object (CalBackend *backend, iCalObject *ico)
g_assert_not_reached ();
}
- /* FIXME: things must come with an UID! */
-
- if (!ico->uid) {
- char buffer [80];
-
- snprintf (buffer, sizeof (buffer), "GnomeCalendar-%ld\n", time (NULL));
- ico->uid = g_strdup (buffer);
- }
#if 0
/* FIXME: gnomecal old code */
ico->last_mod = time (NULL);
@@ -197,8 +226,9 @@ load_from_vobject (CalBackend *backend, VObject *vobject)
priv = backend->priv;
- g_assert (priv->event_hash == NULL);
- priv->event_hash = g_hash_table_new (g_str_hash, g_str_equal);
+ g_assert (!priv->loaded);
+ g_assert (priv->object_hash == NULL);
+ priv->object_hash = g_hash_table_new (g_str_hash, g_str_equal);
initPropIterator (&i, vobject);
@@ -394,13 +424,16 @@ cal_backend_load (CalBackend *backend, GnomeVFSURI *uri)
* Queries a calendar backend for a calendar object based on its unique
* identifier.
*
- * Return value: The string representation of the sought object, or NULL if no
- * object had the specified UID.
+ * Return value: The string representation of a complete calendar wrapping the
+ * the sought object, or NULL if no object had the specified UID. A complete
+ * calendar is returned because you also need the timezone data.
**/
char *
cal_backend_get_object (CalBackend *backend, const char *uid)
{
CalBackendPrivate *priv;
+ iCalObject *ico;
+ char *buf;
g_return_val_if_fail (backend != NULL, NULL);
g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL);
@@ -410,5 +443,12 @@ cal_backend_get_object (CalBackend *backend, const char *uid)
g_return_val_if_fail (uid != NULL, NULL);
+ g_assert (priv->object_hash != NULL);
+
+ ico = g_hash_table_lookup (priv->objec_hash, uid);
+
+ if (!ico)
+ return NULL;
+
/* FIXME */
}
diff --git a/calendar/cal.c b/calendar/cal.c
index 1403c2c028..1ce1d91716 100644
--- a/calendar/cal.c
+++ b/calendar/cal.c
@@ -182,7 +182,7 @@ Cal_get_object (PortableServer_Servant servant,
calobj = cal_backend_get_object (priv->backend, uid);
- if (uid) {
+ if (calobj) {
CORBA_char *calobj_copy;
calobj_copy = CORBA_string_dup (calobj);
diff --git a/calendar/pcs/cal-backend.c b/calendar/pcs/cal-backend.c
index 91ffd8dc1d..ffbbdab472 100644
--- a/calendar/pcs/cal-backend.c
+++ b/calendar/pcs/cal-backend.c
@@ -34,14 +34,15 @@ typedef struct {
/* List of Cal client interface objects, each with its listener */
GList *clients;
- /* All events in the calendar and uri->event hash */
- GList *events;
- GHashTable *event_hash;
+ /* All the iCalObject structures in the calendar, hashed by UID. The
+ * hash key *is* icalobj->uid; it is not copied, so don't free it when
+ * you remove an object from the hash table.
+ */
+ GHashTable *object_hash;
- /* All TODOs in the calendar */
+ /* All events, TODOs, and journals in the calendar */
+ GList *events;
GList *todos;
-
- /* All journals in the calendar */
GList *journals;
/* Whether a calendar has been loaded */
@@ -136,29 +137,65 @@ cal_backend_destroy (GtkObject *object)
-/* Adds an object to the calendar backend */
+/* iCalObject manipulation functions */
+
+/* Ensures that an iCalObject has a unique identifier. If it doesn't have one,
+ * it will create one for it. Returns whether an UID was created or not.
+ */
+static gboolean
+ensure_uid (iCalObject *ico)
+{
+ char *buf;
+ gulong str_time;
+ static guint seqno = 0;
+
+ if (ico->uid)
+ return FALSE;
+
+ str_time = (gulong) time (NULL);
+
+ /* Is this good enough? */
+
+ buf = g_strdup_printf ("Evolution-Tlacuache-%d-%ld-%u", (int) getpid(), str_time, seqno++);
+ ico->uid = buf;
+
+ return TRUE;
+}
+
+/* Adds an object to the calendar backend. Does *not* perform notification to
+ * calendar clients.
+ */
static void
add_object (CalBackend *backend, iCalObject *ico)
{
CalBackendPrivate *priv;
g_assert (ico != NULL);
- g_assert (ico->uid != NULL);
-
priv = backend->priv;
+#if 0
+ /* FIXME: gnomecal old code */
ico->new = 0;
+#endif
+
+ if (ensure_uid (ico))
+ /* FIXME: mark the calendar as dirty so that we can re-save it
+ * with the object's new UID.
+ */
+ ;
+
+ g_hash_table_insert (priv->object_hash, ico->uid, ico);
+
switch (ico->type) {
case ICAL_EVENT:
- g_hash_table_insert (priv->event_hash, ico->uid, ico);
priv->events = g_list_prepend (priv->events, ico);
#if 0
/* FIXME: gnomecal old code */
ical_object_try_alarms (ico);
-#ifdef DEBUGGING_MAIL_ALARM
+# ifdef DEBUGGING_MAIL_ALARM
ico->malarm.trigger = 0;
calendar_notify (0, ico);
-#endif
+# endif
#endif
break;
@@ -174,14 +211,6 @@ add_object (CalBackend *backend, iCalObject *ico)
g_assert_not_reached ();
}
- /* FIXME: things must come with an UID! */
-
- if (!ico->uid) {
- char buffer [80];
-
- snprintf (buffer, sizeof (buffer), "GnomeCalendar-%ld\n", time (NULL));
- ico->uid = g_strdup (buffer);
- }
#if 0
/* FIXME: gnomecal old code */
ico->last_mod = time (NULL);
@@ -197,8 +226,9 @@ load_from_vobject (CalBackend *backend, VObject *vobject)
priv = backend->priv;
- g_assert (priv->event_hash == NULL);
- priv->event_hash = g_hash_table_new (g_str_hash, g_str_equal);
+ g_assert (!priv->loaded);
+ g_assert (priv->object_hash == NULL);
+ priv->object_hash = g_hash_table_new (g_str_hash, g_str_equal);
initPropIterator (&i, vobject);
@@ -394,13 +424,16 @@ cal_backend_load (CalBackend *backend, GnomeVFSURI *uri)
* Queries a calendar backend for a calendar object based on its unique
* identifier.
*
- * Return value: The string representation of the sought object, or NULL if no
- * object had the specified UID.
+ * Return value: The string representation of a complete calendar wrapping the
+ * the sought object, or NULL if no object had the specified UID. A complete
+ * calendar is returned because you also need the timezone data.
**/
char *
cal_backend_get_object (CalBackend *backend, const char *uid)
{
CalBackendPrivate *priv;
+ iCalObject *ico;
+ char *buf;
g_return_val_if_fail (backend != NULL, NULL);
g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL);
@@ -410,5 +443,12 @@ cal_backend_get_object (CalBackend *backend, const char *uid)
g_return_val_if_fail (uid != NULL, NULL);
+ g_assert (priv->object_hash != NULL);
+
+ ico = g_hash_table_lookup (priv->objec_hash, uid);
+
+ if (!ico)
+ return NULL;
+
/* FIXME */
}
diff --git a/calendar/pcs/cal.c b/calendar/pcs/cal.c
index 1403c2c028..1ce1d91716 100644
--- a/calendar/pcs/cal.c
+++ b/calendar/pcs/cal.c
@@ -182,7 +182,7 @@ Cal_get_object (PortableServer_Servant servant,
calobj = cal_backend_get_object (priv->backend, uid);
- if (uid) {
+ if (calobj) {
CORBA_char *calobj_copy;
calobj_copy = CORBA_string_dup (calobj);