diff options
Diffstat (limited to 'calendar/gui')
-rw-r--r-- | calendar/gui/e-cal-event.c | 159 | ||||
-rw-r--r-- | calendar/gui/e-cal-event.h | 87 | ||||
-rw-r--r-- | calendar/gui/migration.c | 18 |
3 files changed, 264 insertions, 0 deletions
diff --git a/calendar/gui/e-cal-event.c b/calendar/gui/e-cal-event.c new file mode 100644 index 0000000000..f359f471fd --- /dev/null +++ b/calendar/gui/e-cal-event.c @@ -0,0 +1,159 @@ +/* + * Authors: David Trowbridge <trowbrds@cs.colorado.edu> + * + * Copyright (C) 2005 Novell, Inc. (www.novell.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. + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "e-cal-event.h" + +static GObjectClass *ece_parent; + +static void +ece_init (GObject *o) +{ +} + +static void +ece_finalize (GObject *o) +{ + ((GObjectClass *) ece_parent)->finalize (o); +} + +static void +ece_target_free (EEvent *ev, EEventTarget *t) +{ + switch (t->type) { + case E_CAL_EVENT_TARGET_COMPONENT: { + ECalEventTargetComponent *s = (ECalEventTargetComponent *) t; + if (s->component) + g_object_unref (s->component); + break; } + } + + ((EEventClass *)ece_parent)->target_free (ev, t); +} + +static void +ece_class_init (GObjectClass *klass) +{ + klass->finalize = ece_finalize; + ((EEventClass *)klass)->target_free = ece_target_free; +} + +GType +e_cal_event_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (ECalEventClass), + NULL, NULL, + (GClassInitFunc) ece_class_init, + NULL, NULL, + sizeof (ECalEvent), 0, + (GInstanceInitFunc) ece_init + }; + ece_parent = g_type_class_ref (e_event_get_type ()); + type = g_type_register_static (e_event_get_type (), "ECalEvent", &info, 0); + } + + return type; +} + +ECalEvent * +e_cal_event_peek (void) +{ + static ECalEvent *e_cal_event = NULL; + if (!e_cal_event) { + e_cal_event = g_object_new (e_cal_event_get_type (), 0); + e_event_construct (&e_cal_event->event, "org.gnome.evolution.calendar.events"); + } + return e_cal_event; +} + +ECalEventTargetComponent * +e_cal_event_target_new_component (ECalEvent *ece, struct _CalendarComponent *component, guint32 flags) +{ + ECalEventTargetComponent *t = e_event_target_new (&ece->event, E_CAL_EVENT_TARGET_COMPONENT, sizeof (*t)); + + t->component = g_object_ref (component); + t->target.mask = ~flags; + + return t; +} + +/* ********************************************************************** */ + +static void *eceh_parent_class; + +static const EEventHookTargetMask eceh_component_masks[] = { + { "migration", E_CAL_EVENT_COMPONENT_MIGRATION }, + { 0 }, +}; + +static const EEventHookTargetMap eceh_targets[] = { + { "component", E_CAL_EVENT_TARGET_COMPONENT, eceh_component_masks }, + { 0 }, +}; + +static void +eceh_finalize (GObject *o) +{ + ((GObjectClass *) eceh_parent_class)->finalize (o); +} + +static void +eceh_class_init (EPluginHookClass *klass) +{ + int i; + + ((GObjectClass *)klass)->finalize = eceh_finalize; + ((EPluginHookClass *)klass)->id = "org.gnome.evolution.calendar.events:1.0"; + + for (i = 0; eceh_targets[i].type; i++) + e_event_hook_class_add_target_map ((EEventHookClass *)klass, &eceh_targets[i]); + + ((EEventHookClass *)klass)->event = (EEvent *) e_cal_event_peek (); +} + +GType +e_cal_event_hook_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (ECalEventHookClass), + NULL, NULL, + (GClassInitFunc) eceh_class_init, + NULL, NULL, + sizeof (ECalEventHook), 0, + (GInstanceInitFunc) NULL, + }; + + eceh_parent_class = g_type_class_ref (e_event_hook_get_type ()); + type = g_type_register_static (e_event_hook_get_type (), "ECalEventHook", &info, 0); + } + + return type; +} diff --git a/calendar/gui/e-cal-event.h b/calendar/gui/e-cal-event.h new file mode 100644 index 0000000000..0a07288973 --- /dev/null +++ b/calendar/gui/e-cal-event.h @@ -0,0 +1,87 @@ +/* + * Authors: David Trowbridge <trowbrds@cs.colorado.edu> + * + * Copyright (C) 2005 Novell, Inc. (www.novell.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. + * + */ + +#ifndef __E_CAL_EVENT_H__ +#define __E_CAL_EVENT_H__ + +#include <glib-object.h> + +#include "e-util/e-event.h" + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif + +typedef struct _ECalEvent ECalEvent; +typedef struct _ECalEventClass ECalEventClass; + +enum _e_cal_event_target_t { + E_CAL_EVENT_TARGET_COMPONENT, +}; + +/* Flags that describe TARGET_COMPONENT */ +enum { + E_CAL_EVENT_COMPONENT_MIGRATION = 1 << 0, +}; + +typedef struct _ECalEventTargetComponent ECalEventTargetComponent; + +struct _ECalEventTargetComponent { + EEventTarget target; + + struct _CalendarComponent *component; +}; + +struct _ECalEvent { + EEvent event; + + struct _ECalEventPrivate *priv; +}; + +struct _ECalEventClass { + EEventClass event_class; +}; + +GType e_cal_event_get_type (void); +ECalEvent* e_cal_event_peek (void); +ECalEventTargetComponent* e_cal_event_target_new_component (ECalEvent *ece, struct _CalendarComponent *component, guint32 flags); + +/* ********************************************************************** */ + +typedef struct _ECalEventHook ECalEventHook; +typedef struct _ECalEventHookClass ECalEventHookClass; + +struct _ECalEventHook { + EEventHook hook; +}; + +struct _ECalEventHookClass { + EEventHookClass hook_class; +}; + +GType e_cal_event_hook_get_type (void); + +#ifdef __cplusplus +} +#endif + +#endif /* __E_CAL_EVENT_H__ */ diff --git a/calendar/gui/migration.c b/calendar/gui/migration.c index de43d4bb5f..76b8a52a16 100644 --- a/calendar/gui/migration.c +++ b/calendar/gui/migration.c @@ -47,6 +47,7 @@ #include <libedataserver/e-xml-hash-utils.h> #include "calendar-config.h" #include "calendar-config-keys.h" +#include "e-cal-event.h" #include "migration.h" static e_gconf_map_t calendar_display_map[] = { @@ -700,6 +701,8 @@ migrate_calendars (CalendarComponent *component, int major, int minor, int revis { ESourceGroup *on_this_computer = NULL, *on_the_web = NULL, *contacts = NULL; ESource *personal_source = NULL; + ECalEvent *ece; + ECalEventTargetComponent *target; gboolean retval = FALSE; /* we call this unconditionally now - create_groups either @@ -833,6 +836,21 @@ migrate_calendars (CalendarComponent *component, int major, int minor, int revis } e_source_list_sync (calendar_component_peek_source_list (component), NULL); + + /** @Event: component.migration + * @Title: Migration step in component initialization + * @Target: ECalEventTargetComponent + * + * component.migration is emitted during the calendar component + * initialization process. This allows new calendar backend types + * to be distributed as an e-d-s backend and a plugin without + * reaching their grubby little fingers into migration.c + */ + /* Fire off migration event */ + ece = e_cal_event_peek (); + target = e_cal_event_target_new_component (ece, calendar_component_peek (), 0); + e_event_emit ((EEvent *) ece, "component.migration", (EEventTarget *) target); + retval = TRUE; fail: if (on_this_computer) |