Calendar objects as defined by the iCalendar IETF draft. Calendar holder

Calendar objects as defined by the iCalendar IETF draft.
Calendar holder for Calendar Objects.

-mig&fed

svn path=/trunk/; revision=79
This commit is contained in:
Arturo Espinosa
1998-04-01 00:30:46 +00:00
parent 0d8c9252ca
commit 65e2dca7eb
12 changed files with 804 additions and 0 deletions

View File

@ -0,0 +1,48 @@
/*
* Calendar objects implementations.
* Copyright (C) 1998 the Free Software Foundation
*
* Authors:
* Miguel de Icaza (miguel@gnu.org)
* Federico Mena (federico@gimp.org)
*/
#include "calobj.h"
iCalObject *
ical_object_new (void)
{
iCalObject *ico;
ico = g_new0 (iCalObject);
ico->seq = -1;
ico->dtstamp = time (NULL);
return ico;
}
iCalObject *
ical_new (char *comment, char *organizer, char *summary)
{
iCalObject *ico;
ico = ical_object_new ();
ico->comment = g_strdup (comment);
ico->organizer = g_strdup (organizer);
ico->summary = g_strdup (summary);
return ico;
}
#define free_if_defined(x) if (x){ g_free (x); x = 0; }
void
ical_object_destroy (iCalObject *ico)
{
free_if_defined (ico->comment);
free_if_defined (ico->organizer);
free_if_defined (ico->summary);
g_free (ico);
}

100
calendar/cal-util/calobj.h Normal file
View File

@ -0,0 +1,100 @@
/*
* Internal representation of a Calendar object. This is modeled after the
* iCalendar/vCalendar specificiation
*
* Authors: Miguel de Icaza (miguel@gnu.org), Federico Mena (federico@gimp.org).
*/
#ifndef CALOBJ_H
#define CALOBJ_H
BEGIN_GNOME_DECLS
typedef struct {
char *alarm_audio_file;
char *alarm_script;
char *alarm_email;
char *alarm_text; /* Text to be displayed */
} CalendarAlarm;
/* Calendar object type */
typedef enum {
ICAL_EVENT,
ICAL_TODO,
ICAL_JOURNAL,
ICAL_FBREQUEST,
ICAL_FBREPLY,
ICAL_BUSYTIME,
ICAL_TIMEZONE
} iCalType;
/* For keys that might contain binary or text/binary */
typedef struct {
char *data;
int len;
} iCalValue;
typedef struct {
int valid; /* true if the Geography was specified */
double latitude;
double longitude;
} iCalGeo;
typedef enum {
ICAL_OPAQUE,
ICAL_TRANSPARENT
};
typedef char NotYet;
/*
* This describes an iCalendar object, note that we never store durations, instead we
* always compute the end time computed from the start + duration.
*/
typedef struct {
iCalType type;
GList *attach; /* type: one or more URIs or binary data */
GList *attendee; /* type: CAL-ADDRESS */
GList *categories; /* type: one or more TEXT */
char *class;
char *comment; /* we collapse one or more TEXTs into one */
time_t completed;
time_t created;
GList *contact; /* type: one or more TEXT */
char *description;
time_t dtstamp;
time_t dtstart;
time_t dtend;
GList *exdate; /* type: one or more time_t's */
GList *exrule; /* type: one or more RECUR */
iCalGeo geo;
time_t last_mod;
char *location;
char *organizer;
int percent;
int priority;
char *rstatus; /* request status for freebusy */
GList *related; /* type: one or more TEXT */
GList *resources; /* type: one or more TEXT */
GList *rdate; /* type: one or more recurrence date */
GList *rrule; /* type: one or more recurrence rules */
int seq;
char *status;
char *summary;
iCalTransp transp;
char *uid;
char *url;
time_t recurid;
/* VALARM objects are always inside another object, never alone */
CalendarAlarm *alarm;
} iCalObject;
iCalObject *ical_new (char *comment, char *organizer, char *summary);
iCalObject *ical_object_new (void);
END_GNOME_DECLS
#endif

116
calendar/calendar.c Normal file
View File

@ -0,0 +1,116 @@
/*
* Calendar manager object
*
* This keeps track of a given calendar. Eventually this will abtract everything
* related to getting calendars/saving calendars locally or to a remote Calendar Service
*
* Copyright (C) 1998 the Free Software Foundation
*
* Authors:
* Miguel de Icaza (miguel@gnu.org)
* Federico Mena (federico@gimp.org)
*
*/
#include "calobj.h"
#include "calendar.h"
Calendar *
calendar_new (char *title)
{
Calendar *cal;
cal = g_new0 (Calendar, 1);
cal->title = g_strdup (title);
return cal;
}
void
calendar_add_object (Calendar *cal, iCalObject *obj)
{
switch (obj->type){
case ICAL_EVENT:
cal->events = g_list_prepend (cal->events, obj);
break;
case ICAL_TODO:
cal->todo = g_list_prepend (cal->todo, obj);
break;
case ICAL_JOURNAL:
cal->journal = g_list_prepend (cal->journal, obj);
break;
default:
g_assert_not_reached ();
}
}
void
calendar_remove_object (Calendar *cal, iCalObject *obj)
{
switch (obj->type){
case ICAL_EVENT:
cal->events = g_list_remove (cal->events, obj);
break;
case ICAL_TODO:
cal->todo = g_list_remove (cal->todo, obj);
break;
case ICAL_JOURNAL:
cal->journal = g_list_remove (cal->journal, obj);
break;
default:
g_assert_not_reached ();
}
}
void
calendar_destroy (Calendar *cal)
{
g_list_foreach (cal->events, ical_object_destroy, NULL);
g_list_free (cal->events);
g_list_foreach (cal->todo, ical_object_destroy, NULL);
g_list_free (cal->todo);
g_list_foreach (cal->journal, ical_object_destroy, NULL);
g_list_free (cal->journal);
if (cal->title)
g_free (cal->title);
if (cal->filename)
g_free (cal->filename);
g_free (cal);
}
static GList *
calendar_get_objects_in_range (GList *objects, time_t start, time_t end)
{
GList *new_events = 0;
for (; objects; objects = objects->next){
iCalObject *object = objects->data;
if ((start <= object->dtstart) && (end >= object->dtend))
new_events = g_list_prepend (new_events, object);
}
}
GList *
calendar_get_events_in_range (Calendar *cal, time_t start, time_t end)
{
calendar_get_objects_in_range (cal->events, start, end);
}
GList *
calendar_get_todo_in_range (Calendar *cal, time_t start, time_t end)
{
calendar_get_objects_in_range (cal->todo, start, end);
}
GList *
calendar_get_journal_in_range (Calendar *cal, time_t start, time_t end)
{
calendar_get_objects_in_range (cal->journal, start, end);
}

25
calendar/calendar.h Normal file
View File

@ -0,0 +1,25 @@
#ifndef CALOBJ_H
#define CALOBJ_H
BEGIN_GNOME_DECLS
typedef struct {
char *title;
char *filename;
GList *events;
GList *todo;
GList *journal;
} Calendar;
Calendar *calendar_new (char *title);
void calendar_add_object (Calendar *cal, iCalObject *obj);
void calendar_remove_object (Calendar *cal, iCalObject *obj);
void calendar_destroy (Calendar *cal);
GList *calendar_get_events_in_range (Calendar *cal, time_t start, time_t end);
GList *calendar_get_todo_in_range (Calendar *cal, time_t start, time_t end);
GList *calendar_get_journal_in_range (Calendar *cal, time_t start, time_t end);
END_GNOME_DECLS
#endif

48
calendar/calobj.c Normal file
View File

@ -0,0 +1,48 @@
/*
* Calendar objects implementations.
* Copyright (C) 1998 the Free Software Foundation
*
* Authors:
* Miguel de Icaza (miguel@gnu.org)
* Federico Mena (federico@gimp.org)
*/
#include "calobj.h"
iCalObject *
ical_object_new (void)
{
iCalObject *ico;
ico = g_new0 (iCalObject);
ico->seq = -1;
ico->dtstamp = time (NULL);
return ico;
}
iCalObject *
ical_new (char *comment, char *organizer, char *summary)
{
iCalObject *ico;
ico = ical_object_new ();
ico->comment = g_strdup (comment);
ico->organizer = g_strdup (organizer);
ico->summary = g_strdup (summary);
return ico;
}
#define free_if_defined(x) if (x){ g_free (x); x = 0; }
void
ical_object_destroy (iCalObject *ico)
{
free_if_defined (ico->comment);
free_if_defined (ico->organizer);
free_if_defined (ico->summary);
g_free (ico);
}

100
calendar/calobj.h Normal file
View File

@ -0,0 +1,100 @@
/*
* Internal representation of a Calendar object. This is modeled after the
* iCalendar/vCalendar specificiation
*
* Authors: Miguel de Icaza (miguel@gnu.org), Federico Mena (federico@gimp.org).
*/
#ifndef CALOBJ_H
#define CALOBJ_H
BEGIN_GNOME_DECLS
typedef struct {
char *alarm_audio_file;
char *alarm_script;
char *alarm_email;
char *alarm_text; /* Text to be displayed */
} CalendarAlarm;
/* Calendar object type */
typedef enum {
ICAL_EVENT,
ICAL_TODO,
ICAL_JOURNAL,
ICAL_FBREQUEST,
ICAL_FBREPLY,
ICAL_BUSYTIME,
ICAL_TIMEZONE
} iCalType;
/* For keys that might contain binary or text/binary */
typedef struct {
char *data;
int len;
} iCalValue;
typedef struct {
int valid; /* true if the Geography was specified */
double latitude;
double longitude;
} iCalGeo;
typedef enum {
ICAL_OPAQUE,
ICAL_TRANSPARENT
};
typedef char NotYet;
/*
* This describes an iCalendar object, note that we never store durations, instead we
* always compute the end time computed from the start + duration.
*/
typedef struct {
iCalType type;
GList *attach; /* type: one or more URIs or binary data */
GList *attendee; /* type: CAL-ADDRESS */
GList *categories; /* type: one or more TEXT */
char *class;
char *comment; /* we collapse one or more TEXTs into one */
time_t completed;
time_t created;
GList *contact; /* type: one or more TEXT */
char *description;
time_t dtstamp;
time_t dtstart;
time_t dtend;
GList *exdate; /* type: one or more time_t's */
GList *exrule; /* type: one or more RECUR */
iCalGeo geo;
time_t last_mod;
char *location;
char *organizer;
int percent;
int priority;
char *rstatus; /* request status for freebusy */
GList *related; /* type: one or more TEXT */
GList *resources; /* type: one or more TEXT */
GList *rdate; /* type: one or more recurrence date */
GList *rrule; /* type: one or more recurrence rules */
int seq;
char *status;
char *summary;
iCalTransp transp;
char *uid;
char *url;
time_t recurid;
/* VALARM objects are always inside another object, never alone */
CalendarAlarm *alarm;
} iCalObject;
iCalObject *ical_new (char *comment, char *organizer, char *summary);
iCalObject *ical_object_new (void);
END_GNOME_DECLS
#endif

116
calendar/gui/calendar.c Normal file
View File

@ -0,0 +1,116 @@
/*
* Calendar manager object
*
* This keeps track of a given calendar. Eventually this will abtract everything
* related to getting calendars/saving calendars locally or to a remote Calendar Service
*
* Copyright (C) 1998 the Free Software Foundation
*
* Authors:
* Miguel de Icaza (miguel@gnu.org)
* Federico Mena (federico@gimp.org)
*
*/
#include "calobj.h"
#include "calendar.h"
Calendar *
calendar_new (char *title)
{
Calendar *cal;
cal = g_new0 (Calendar, 1);
cal->title = g_strdup (title);
return cal;
}
void
calendar_add_object (Calendar *cal, iCalObject *obj)
{
switch (obj->type){
case ICAL_EVENT:
cal->events = g_list_prepend (cal->events, obj);
break;
case ICAL_TODO:
cal->todo = g_list_prepend (cal->todo, obj);
break;
case ICAL_JOURNAL:
cal->journal = g_list_prepend (cal->journal, obj);
break;
default:
g_assert_not_reached ();
}
}
void
calendar_remove_object (Calendar *cal, iCalObject *obj)
{
switch (obj->type){
case ICAL_EVENT:
cal->events = g_list_remove (cal->events, obj);
break;
case ICAL_TODO:
cal->todo = g_list_remove (cal->todo, obj);
break;
case ICAL_JOURNAL:
cal->journal = g_list_remove (cal->journal, obj);
break;
default:
g_assert_not_reached ();
}
}
void
calendar_destroy (Calendar *cal)
{
g_list_foreach (cal->events, ical_object_destroy, NULL);
g_list_free (cal->events);
g_list_foreach (cal->todo, ical_object_destroy, NULL);
g_list_free (cal->todo);
g_list_foreach (cal->journal, ical_object_destroy, NULL);
g_list_free (cal->journal);
if (cal->title)
g_free (cal->title);
if (cal->filename)
g_free (cal->filename);
g_free (cal);
}
static GList *
calendar_get_objects_in_range (GList *objects, time_t start, time_t end)
{
GList *new_events = 0;
for (; objects; objects = objects->next){
iCalObject *object = objects->data;
if ((start <= object->dtstart) && (end >= object->dtend))
new_events = g_list_prepend (new_events, object);
}
}
GList *
calendar_get_events_in_range (Calendar *cal, time_t start, time_t end)
{
calendar_get_objects_in_range (cal->events, start, end);
}
GList *
calendar_get_todo_in_range (Calendar *cal, time_t start, time_t end)
{
calendar_get_objects_in_range (cal->todo, start, end);
}
GList *
calendar_get_journal_in_range (Calendar *cal, time_t start, time_t end)
{
calendar_get_objects_in_range (cal->journal, start, end);
}

25
calendar/gui/calendar.h Normal file
View File

@ -0,0 +1,25 @@
#ifndef CALOBJ_H
#define CALOBJ_H
BEGIN_GNOME_DECLS
typedef struct {
char *title;
char *filename;
GList *events;
GList *todo;
GList *journal;
} Calendar;
Calendar *calendar_new (char *title);
void calendar_add_object (Calendar *cal, iCalObject *obj);
void calendar_remove_object (Calendar *cal, iCalObject *obj);
void calendar_destroy (Calendar *cal);
GList *calendar_get_events_in_range (Calendar *cal, time_t start, time_t end);
GList *calendar_get_todo_in_range (Calendar *cal, time_t start, time_t end);
GList *calendar_get_journal_in_range (Calendar *cal, time_t start, time_t end);
END_GNOME_DECLS
#endif

View File

@ -0,0 +1,39 @@
evento todo journal fbrequest fbreply busytime timezone
attach attach attach
attendee attendee attendee attendee attendee attendee
categories categories categories
class class class
comment comment comment comment comment comment comment
completed
contact contact contact
created created created created
description description description
dtstamp dtstamp
dtend/duration due->dtend dtend [duration] dtend dtend
dtstart dtstart dtstart dtstart dtstart dtstart dtstart
exdate exdate exdate
exrule exrule exrule
geo geo
last-mod last-mod last-mod last-mod last-mod
location location
organizer organizer organizer
percent
priority priority
rstatus rstatus rstatus rstatus
related related related
resources resources
rdate rdate rdate [rdate/rrule]
rrule rrule rrule
dtstamp dtstamp dtstamp dtstamp
seq seq seq seq seq
status status
summary summary summary
transp
uid uid uid uid uid
url url url url url
recurid recurid recurid
freebusy freebusy
tzname
tzoffset-to
tzoffset-from

39
calendar/icalendar-types Normal file
View File

@ -0,0 +1,39 @@
evento todo journal fbrequest fbreply busytime timezone
attach attach attach
attendee attendee attendee attendee attendee attendee
categories categories categories
class class class
comment comment comment comment comment comment comment
completed
contact contact contact
created created created created
description description description
dtstamp dtstamp
dtend/duration due->dtend dtend [duration] dtend dtend
dtstart dtstart dtstart dtstart dtstart dtstart dtstart
exdate exdate exdate
exrule exrule exrule
geo geo
last-mod last-mod last-mod last-mod last-mod
location location
organizer organizer organizer
percent
priority priority
rstatus rstatus rstatus rstatus
related related related
resources resources
rdate rdate rdate [rdate/rrule]
rrule rrule rrule
dtstamp dtstamp dtstamp dtstamp
seq seq seq seq seq
status status
summary summary summary
transp
uid uid uid uid uid
url url url url url
recurid recurid recurid
freebusy freebusy
tzname
tzoffset-to
tzoffset-from

48
calendar/pcs/calobj.c Normal file
View File

@ -0,0 +1,48 @@
/*
* Calendar objects implementations.
* Copyright (C) 1998 the Free Software Foundation
*
* Authors:
* Miguel de Icaza (miguel@gnu.org)
* Federico Mena (federico@gimp.org)
*/
#include "calobj.h"
iCalObject *
ical_object_new (void)
{
iCalObject *ico;
ico = g_new0 (iCalObject);
ico->seq = -1;
ico->dtstamp = time (NULL);
return ico;
}
iCalObject *
ical_new (char *comment, char *organizer, char *summary)
{
iCalObject *ico;
ico = ical_object_new ();
ico->comment = g_strdup (comment);
ico->organizer = g_strdup (organizer);
ico->summary = g_strdup (summary);
return ico;
}
#define free_if_defined(x) if (x){ g_free (x); x = 0; }
void
ical_object_destroy (iCalObject *ico)
{
free_if_defined (ico->comment);
free_if_defined (ico->organizer);
free_if_defined (ico->summary);
g_free (ico);
}

100
calendar/pcs/calobj.h Normal file
View File

@ -0,0 +1,100 @@
/*
* Internal representation of a Calendar object. This is modeled after the
* iCalendar/vCalendar specificiation
*
* Authors: Miguel de Icaza (miguel@gnu.org), Federico Mena (federico@gimp.org).
*/
#ifndef CALOBJ_H
#define CALOBJ_H
BEGIN_GNOME_DECLS
typedef struct {
char *alarm_audio_file;
char *alarm_script;
char *alarm_email;
char *alarm_text; /* Text to be displayed */
} CalendarAlarm;
/* Calendar object type */
typedef enum {
ICAL_EVENT,
ICAL_TODO,
ICAL_JOURNAL,
ICAL_FBREQUEST,
ICAL_FBREPLY,
ICAL_BUSYTIME,
ICAL_TIMEZONE
} iCalType;
/* For keys that might contain binary or text/binary */
typedef struct {
char *data;
int len;
} iCalValue;
typedef struct {
int valid; /* true if the Geography was specified */
double latitude;
double longitude;
} iCalGeo;
typedef enum {
ICAL_OPAQUE,
ICAL_TRANSPARENT
};
typedef char NotYet;
/*
* This describes an iCalendar object, note that we never store durations, instead we
* always compute the end time computed from the start + duration.
*/
typedef struct {
iCalType type;
GList *attach; /* type: one or more URIs or binary data */
GList *attendee; /* type: CAL-ADDRESS */
GList *categories; /* type: one or more TEXT */
char *class;
char *comment; /* we collapse one or more TEXTs into one */
time_t completed;
time_t created;
GList *contact; /* type: one or more TEXT */
char *description;
time_t dtstamp;
time_t dtstart;
time_t dtend;
GList *exdate; /* type: one or more time_t's */
GList *exrule; /* type: one or more RECUR */
iCalGeo geo;
time_t last_mod;
char *location;
char *organizer;
int percent;
int priority;
char *rstatus; /* request status for freebusy */
GList *related; /* type: one or more TEXT */
GList *resources; /* type: one or more TEXT */
GList *rdate; /* type: one or more recurrence date */
GList *rrule; /* type: one or more recurrence rules */
int seq;
char *status;
char *summary;
iCalTransp transp;
char *uid;
char *url;
time_t recurid;
/* VALARM objects are always inside another object, never alone */
CalendarAlarm *alarm;
} iCalObject;
iCalObject *ical_new (char *comment, char *organizer, char *summary);
iCalObject *ical_object_new (void);
END_GNOME_DECLS
#endif