diff options
author | JP Rosevear <jpr@src.gnome.org> | 2003-11-07 13:52:24 +0800 |
---|---|---|
committer | JP Rosevear <jpr@src.gnome.org> | 2003-11-07 13:52:24 +0800 |
commit | 200606f92810d3de322e5ee96f8326e1a656f8bb (patch) | |
tree | da0dc27f5311128dcb6e7eb6400931e45743372e /calendar/cal-client | |
parent | e5472b4cc9a4bb80b89437a16f8b77943ea35555 (diff) | |
download | gsoc2013-evolution-200606f92810d3de322e5ee96f8326e1a656f8bb.tar gsoc2013-evolution-200606f92810d3de322e5ee96f8326e1a656f8bb.tar.gz gsoc2013-evolution-200606f92810d3de322e5ee96f8326e1a656f8bb.tar.bz2 gsoc2013-evolution-200606f92810d3de322e5ee96f8326e1a656f8bb.tar.lz gsoc2013-evolution-200606f92810d3de322e5ee96f8326e1a656f8bb.tar.xz gsoc2013-evolution-200606f92810d3de322e5ee96f8326e1a656f8bb.tar.zst gsoc2013-evolution-200606f92810d3de322e5ee96f8326e1a656f8bb.zip |
Various changes to merge in evolution-data-server reliance.
svn path=/trunk/; revision=23206
Diffstat (limited to 'calendar/cal-client')
-rw-r--r-- | calendar/cal-client/.cvsignore | 17 | ||||
-rw-r--r-- | calendar/cal-client/Makefile.am | 86 | ||||
-rw-r--r-- | calendar/cal-client/cal-client-types.c | 52 | ||||
-rw-r--r-- | calendar/cal-client/cal-client-types.h | 75 | ||||
-rw-r--r-- | calendar/cal-client/cal-client.c | 3823 | ||||
-rw-r--r-- | calendar/cal-client/cal-client.h | 212 | ||||
-rw-r--r-- | calendar/cal-client/cal-listener.c | 1025 | ||||
-rw-r--r-- | calendar/cal-client/cal-listener.h | 120 | ||||
-rw-r--r-- | calendar/cal-client/cal-marshal.list | 6 | ||||
-rw-r--r-- | calendar/cal-client/cal-query.c | 374 | ||||
-rw-r--r-- | calendar/cal-client/cal-query.h | 69 | ||||
-rw-r--r-- | calendar/cal-client/client-test.c | 218 | ||||
-rw-r--r-- | calendar/cal-client/query-listener.c | 304 | ||||
-rw-r--r-- | calendar/cal-client/query-listener.h | 69 | ||||
-rw-r--r-- | calendar/cal-client/test.ics | 318 |
15 files changed, 0 insertions, 6768 deletions
diff --git a/calendar/cal-client/.cvsignore b/calendar/cal-client/.cvsignore deleted file mode 100644 index f2aa4f92ae..0000000000 --- a/calendar/cal-client/.cvsignore +++ /dev/null @@ -1,17 +0,0 @@ -Makefile.in -.deps -.libs -.pure -Makefile -evolution-calendar-stubs.c -evolution-calendar-skels.c -evolution-calendar-common.c -evolution-calendar.h -evolution-calendar-common.lo -evolution-calendar-skels.lo -evolution-calendar-stubs.lo -cal-marshal.c -cal-marshal.h -*.lo -*.la -client-test diff --git a/calendar/cal-client/Makefile.am b/calendar/cal-client/Makefile.am deleted file mode 100644 index 9008c05940..0000000000 --- a/calendar/cal-client/Makefile.am +++ /dev/null @@ -1,86 +0,0 @@ -INCLUDES = \ - -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \ - -DG_LOG_DOMAIN=\"cal-client\" \ - -I$(top_srcdir)/calendar \ - -I$(srcdir) -I$(top_srcdir) \ - -I. \ - -I.. \ - -I$(top_builddir) \ - -I$(top_srcdir)/libical/src \ - $(EVOLUTION_CALENDAR_CFLAGS) - -AM_CFLAGS = \ - -DGTK_DISABLE_DEPRECATED=1 \ - -DGDK_DISABLE_DEPRECATED=1 \ - -DG_DISABLE_DEPRECATED=1 \ - -DGNOME_DISABLE_DEPRECATED=1 - -CORBA_GENERATED_C = \ - evolution-calendar-common.c \ - evolution-calendar-skels.c \ - evolution-calendar-stubs.c -CORBA_GENERATED_H = \ - evolution-calendar.h - -CORBA_GENERATED = $(CORBA_GENERATED_C) $(CORBA_GENERATED_H) - -idls = \ - $(srcdir)/../idl/evolution-calendar.idl - -idl_flags = $(IDL_INCLUDES) - -$(CORBA_GENERATED_H): $(idls) - $(ORBIT_IDL) $(idl_flags) $(srcdir)/../idl/evolution-calendar.idl -$(CORBA_GENERATED_C): $(CORBA_GENERATED_H) - -privlib_LTLIBRARIES = libcal-client.la - -libcal_clientincludedir = $(privincludedir)/cal-client - -libcal_client_la_SOURCES = \ - $(CORBA_GENERATED_C) \ - cal-client-types.c \ - cal-marshal.c \ - cal-marshal.h \ - cal-client.c \ - cal-listener.c \ - cal-listener.h \ - cal-query.c \ - query-listener.c \ - query-listener.h - -libcal_client_la_LIBADD = \ - $(top_builddir)/calendar/cal-util/libcal-util.la \ - $(top_builddir)/e-util/libeutil.la - -libcal_clientinclude_HEADERS = \ - $(CORBA_GENERATED_H) \ - cal-client-types.h \ - cal-client.h \ - cal-query.h - -# -# client-test program -# - -noinst_PROGRAMS = client-test - -client_test_SOURCES = \ - client-test.c - -client_test_INCLUDES = \ - $(INCLUDES) \ - -DG_LOG_DOMAIN=\"client-test\" - -client_test_LDADD = \ - libcal-client.la \ - $(EVOLUTION_CALENDAR_LIBS) - -MARSHAL_GENERATED = cal-marshal.c cal-marshal.h -@EVO_MARSHAL_RULE@ - -BUILT_SOURCES = $(CORBA_GENERATED) $(MARSHAL_GENERATED) -CLEANFILES = $(BUILT_SOURCES) - -dist-hook: - cd $(distdir); rm -f $(BUILT_SOURCES) diff --git a/calendar/cal-client/cal-client-types.c b/calendar/cal-client/cal-client-types.c deleted file mode 100644 index 36a524ec99..0000000000 --- a/calendar/cal-client/cal-client-types.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Evolution calendar utilities and types - * - * Copyright (C) 2000 Ximian, Inc. - * Copyright (C) 2000 Ximian, Inc. - * - * Authors: Federico Mena-Quintero <federico@ximian.com> - * JP Rosevear <jpr@ximian.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 <config.h> -#include <stdlib.h> -#include "cal-client-types.h" - - - -/** - * cal_client_change_list_free: - * @list: List of #CalClientChange structures. - * - * Frees a list of #CalClientChange structures. - **/ -void -cal_client_change_list_free (GList *list) -{ - CalClientChange *c; - GList *l; - - for (l = list; l; l = l->next) { - c = l->data; - - g_assert (c != NULL); - g_assert (c->comp != NULL); - - g_object_unref (G_OBJECT (c->comp)); - g_free (c); - } - - g_list_free (list); -} diff --git a/calendar/cal-client/cal-client-types.h b/calendar/cal-client/cal-client-types.h deleted file mode 100644 index 925628337b..0000000000 --- a/calendar/cal-client/cal-client-types.h +++ /dev/null @@ -1,75 +0,0 @@ -/* Evolution calendar utilities and types - * - * Copyright (C) 2000 Ximian, Inc. - * Copyright (C) 2000 Ximian, Inc. - * - * Authors: Federico Mena-Quintero <federico@ximian.com> - * JP Rosevear <jpr@ximian.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. - */ - -#ifndef CAL_CLIENT_TYPES_H -#define CAL_CLIENT_TYPES_H - -#include <cal-util/cal-component.h> - -G_BEGIN_DECLS - - - -#define E_CALENDAR_ERROR e_calendar_error_quark() - -GQuark e_calendar_error_quark (void) G_GNUC_CONST; - -typedef enum { - CAL_CLIENT_CHANGE_ADDED = 1 << 0, - CAL_CLIENT_CHANGE_MODIFIED = 1 << 1, - CAL_CLIENT_CHANGE_DELETED = 1 << 2 -} CalClientChangeType; - -typedef struct -{ - CalComponent *comp; - CalClientChangeType type; -} CalClientChange; - -typedef enum { - E_CALENDAR_STATUS_OK, - E_CALENDAR_STATUS_INVALID_ARG, - E_CALENDAR_STATUS_BUSY, - E_CALENDAR_STATUS_REPOSITORY_OFFLINE, - E_CALENDAR_STATUS_NO_SUCH_CALENDAR, - E_CALENDAR_STATUS_OBJECT_NOT_FOUND, - E_CALENDAR_STATUS_INVALID_OBJECT, - E_CALENDAR_STATUS_URI_NOT_LOADED, - E_CALENDAR_STATUS_URI_ALREADY_LOADED, - E_CALENDAR_STATUS_PERMISSION_DENIED, - E_CALENDAR_STATUS_CARD_NOT_FOUND, - E_CALENDAR_STATUS_CARD_ID_ALREADY_EXISTS, - E_CALENDAR_STATUS_PROTOCOL_NOT_SUPPORTED, - E_CALENDAR_STATUS_CANCELLED, - E_CALENDAR_STATUS_COULD_NOT_CANCEL, - E_CALENDAR_STATUS_AUTHENTICATION_FAILED, - E_CALENDAR_STATUS_AUTHENTICATION_REQUIRED, - E_CALENDAR_STATUS_CORBA_EXCEPTION, - E_CALENDAR_STATUS_OTHER_ERROR -} ECalendarStatus; - -void cal_client_change_list_free (GList *list); - -G_END_DECLS - -#endif - diff --git a/calendar/cal-client/cal-client.c b/calendar/cal-client/cal-client.c deleted file mode 100644 index f69567b90e..0000000000 --- a/calendar/cal-client/cal-client.c +++ /dev/null @@ -1,3823 +0,0 @@ -/* Evolution calendar client - * - * Copyright (C) 2001 Ximian, Inc. - * - * Author: Federico Mena-Quintero <federico@ximian.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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <pthread.h> -#include <string.h> -#include <bonobo-activation/bonobo-activation.h> -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-i18n.h> -#include <libgnome/gnome-util.h> - -#include "e-util/e-component-listener.h" -#include "e-util/e-config-listener.h" -#include "e-util/e-url.h" -#include "e-util/e-msgport.h" -#include "cal-util/cal-util-marshal.h" -#include "cal-util/timeutil.h" -#include "cal-client.h" -#include "cal-listener.h" -#include "query-listener.h" - - - -typedef struct { - EMutex *mutex; - pthread_cond_t cond; - ECalendarStatus status; - - char *uid; - GList *list; - gboolean bool; - char *string; - - CalQuery *query; - QueryListener *listener; -} ECalendarOp; - -/* Private part of the CalClient structure */ -struct _CalClientPrivate { - /* Load state to avoid multiple loads */ - CalClientLoadState load_state; - - /* URI of the calendar that is being loaded or is already loaded, or - * NULL if we are not loaded. - */ - char *uri; - CalObjType type; - - ECalendarOp *current_op; - - EMutex *mutex; - - /* Email address associated with this calendar, or NULL */ - char *cal_address; - char *alarm_email_address; - char *ldap_attribute; - - /* Scheduling info */ - char *capabilities; - - /* The calendar factories we are contacting */ - GList *factories; - - /* Our calendar listener implementation */ - CalListener *listener; - - /* The calendar client interface object we are contacting */ - GNOME_Evolution_Calendar_Cal cal; - - /* The authentication function */ - CalClientAuthFunc auth_func; - gpointer auth_user_data; - - /* A cache of timezones retrieved from the server, to avoid getting - them repeatedly for each get_object() call. */ - GHashTable *timezones; - - /* The default timezone to use to resolve DATE and floating DATE-TIME - values. */ - icaltimezone *default_zone; - - /* The component listener to keep track of the lifetime of backends */ - EComponentListener *comp_listener; -}; - - - -/* Signal IDs */ -enum { - CAL_OPENED, - CAL_SET_MODE, - BACKEND_ERROR, - CATEGORIES_CHANGED, - FORGET_PASSWORD, - BACKEND_DIED, - LAST_SIGNAL -}; - -static void cal_client_get_object_timezones_cb (icalparameter *param, - void *data); - -static guint cal_client_signals[LAST_SIGNAL]; - -static GObjectClass *parent_class; - -#define E_CALENDAR_CHECK_STATUS(status,error) G_STMT_START{ \ - if ((status) == E_CALENDAR_STATUS_OK) { \ - return TRUE; \ - } \ - else { \ - const char *msg; \ - msg = cal_client_get_error_message ((status)); \ - g_set_error ((error), E_CALENDAR_ERROR, (status), msg, (status)); \ - return FALSE; \ - } }G_STMT_END - - - -/* Error quark */ -GQuark -e_calendar_error_quark (void) -{ - static GQuark q = 0; - if (q == 0) - q = g_quark_from_static_string ("e-calendar-error-quark"); - - return q; -} - -GType -cal_client_open_status_enum_get_type (void) -{ - static GType cal_client_open_status_enum_type = 0; - - if (!cal_client_open_status_enum_type) { - static GEnumValue values [] = { - { CAL_CLIENT_OPEN_SUCCESS, "CalClientOpenSuccess", "success" }, - { CAL_CLIENT_OPEN_ERROR, "CalClientOpenError", "error" }, - { CAL_CLIENT_OPEN_NOT_FOUND, "CalClientOpenNotFound", "not-found" }, - { CAL_CLIENT_OPEN_PERMISSION_DENIED, "CalClientOpenPermissionDenied", "denied" }, - { CAL_CLIENT_OPEN_METHOD_NOT_SUPPORTED, "CalClientOpenMethodNotSupported", "unsupported" }, - { -1, NULL, NULL } - }; - - cal_client_open_status_enum_type = g_enum_register_static ("CalClientOpenStatusEnum", values); - } - - return cal_client_open_status_enum_type; -} - -GType -cal_client_set_mode_status_enum_get_type (void) -{ - static GType cal_client_set_mode_status_enum_type = 0; - - if (!cal_client_set_mode_status_enum_type) { - static GEnumValue values [] = { - { CAL_CLIENT_SET_MODE_SUCCESS, "CalClientSetModeSuccess", "success" }, - { CAL_CLIENT_SET_MODE_ERROR, "CalClientSetModeError", "error" }, - { CAL_CLIENT_SET_MODE_NOT_SUPPORTED, "CalClientSetModeNotSupported", "unsupported" }, - { -1, NULL, NULL } - }; - - cal_client_set_mode_status_enum_type = - g_enum_register_static ("CalClientSetModeStatusEnum", values); - } - - return cal_client_set_mode_status_enum_type; -} - -GType -cal_mode_enum_get_type (void) -{ - static GType cal_mode_enum_type = 0; - - if (!cal_mode_enum_type) { - static GEnumValue values [] = { - { CAL_MODE_INVALID, "CalModeInvalid", "invalid" }, - { CAL_MODE_LOCAL, "CalModeLocal", "local" }, - { CAL_MODE_REMOTE, "CalModeRemote", "remote" }, - { CAL_MODE_ANY, "CalModeAny", "any" }, - { -1, NULL, NULL } - }; - - cal_mode_enum_type = g_enum_register_static ("CalModeEnum", values); - } - - return cal_mode_enum_type; -} - -/* EBookOp calls */ - -static ECalendarOp* -e_calendar_new_op (CalClient *client) -{ - ECalendarOp *op = g_new0 (ECalendarOp, 1); - - op->mutex = e_mutex_new (E_MUTEX_SIMPLE); - pthread_cond_init (&op->cond, 0); - - client->priv->current_op = op; - - return op; -} - -static ECalendarOp* -e_calendar_get_op (CalClient *client) -{ - if (!client->priv->current_op) { - g_warning (G_STRLOC ": Unexpected response"); - return NULL; - } - - return client->priv->current_op; -} - -static void -e_calendar_free_op (ECalendarOp *op) -{ - /* XXX more stuff here */ - pthread_cond_destroy (&op->cond); - e_mutex_destroy (op->mutex); - g_free (op); -} - -static void -e_calendar_remove_op (CalClient *client, ECalendarOp *op) -{ - if (client->priv->current_op != op) - g_warning (G_STRLOC ": Cannot remove op, it's not current"); - - client->priv->current_op = NULL; -} - -/* Gets rid of the factories that a client knows about */ -static void -destroy_factories (CalClient *client) -{ - CalClientPrivate *priv; - CORBA_Object factory; - CORBA_Environment ev; - int result; - GList *f; - - priv = client->priv; - - CORBA_exception_init (&ev); - - for (f = priv->factories; f; f = f->next) { - factory = f->data; - - result = CORBA_Object_is_nil (factory, &ev); - if (BONOBO_EX (&ev)) { - g_message ("destroy_factories(): could not see if a factory was nil"); - CORBA_exception_free (&ev); - - continue; - } - - if (result) - continue; - - CORBA_Object_release (factory, &ev); - if (BONOBO_EX (&ev)) { - g_message ("destroy_factories(): could not release a factory"); - CORBA_exception_free (&ev); - } - } - - g_list_free (priv->factories); - priv->factories = NULL; -} - -/* Gets rid of the calendar client interface object that a client knows about */ -static void -destroy_cal (CalClient *client) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - int result; - - priv = client->priv; - - CORBA_exception_init (&ev); - result = CORBA_Object_is_nil (priv->cal, &ev); - if (BONOBO_EX (&ev)) { - g_message (G_STRLOC ": could not see if the " - "calendar client interface object was nil"); - priv->cal = CORBA_OBJECT_NIL; - CORBA_exception_free (&ev); - return; - } - CORBA_exception_free (&ev); - - if (result) - return; - - bonobo_object_release_unref (priv->cal, NULL); - priv->cal = CORBA_OBJECT_NIL; - -} - -static void -free_timezone (gpointer key, gpointer value, gpointer data) -{ - /* Note that the key comes from within the icaltimezone value, so we - don't free that. */ - icaltimezone_free (value, TRUE); -} - - - -static void -backend_died_cb (EComponentListener *cl, gpointer user_data) -{ - CalClientPrivate *priv; - CalClient *client = (CalClient *) user_data; - - g_return_if_fail (IS_CAL_CLIENT (client)); - - priv = client->priv; - priv->load_state = CAL_CLIENT_LOAD_NOT_LOADED; - g_signal_emit (G_OBJECT (client), cal_client_signals[BACKEND_DIED], 0); -} - -/* Signal handlers for the listener's signals */ -/* Handle the cal_opened notification from the listener */ - -static void -cal_read_only_cb (CalListener *listener, ECalendarStatus status, gboolean read_only, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - op->bool = read_only; - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_cal_address_cb (CalListener *listener, ECalendarStatus status, const char *address, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - op->string = g_strdup (address); - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_alarm_address_cb (CalListener *listener, ECalendarStatus status, const char *address, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - op->string = g_strdup (address); - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_ldap_attribute_cb (CalListener *listener, ECalendarStatus status, const char *attribute, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - op->string = g_strdup (attribute); - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_static_capabilities_cb (CalListener *listener, ECalendarStatus status, const char *capabilities, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - op->string = g_strdup (capabilities); - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_opened_cb (CalListener *listener, ECalendarStatus status, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_removed_cb (CalListener *listener, ECalendarStatus status, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_object_created_cb (CalListener *listener, ECalendarStatus status, const char *uid, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - op->uid = g_strdup (uid); - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_object_modified_cb (CalListener *listener, ECalendarStatus status, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_object_removed_cb (CalListener *listener, ECalendarStatus status, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_alarm_discarded_cb (CalListener *listener, ECalendarStatus status, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_objects_received_cb (CalListener *listener, ECalendarStatus status, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_objects_sent_cb (CalListener *listener, ECalendarStatus status, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_default_object_requested_cb (CalListener *listener, ECalendarStatus status, const char *object, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - op->string = g_strdup (object); - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_object_requested_cb (CalListener *listener, ECalendarStatus status, const char *object, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - op->string = g_strdup (object); - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_object_list_cb (CalListener *listener, ECalendarStatus status, GList *objects, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - GList *l; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - op->list = g_list_copy (objects); - - for (l = op->list; l; l = l->next) - l->data = icalcomponent_new_clone (l->data); - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_get_timezone_cb (CalListener *listener, ECalendarStatus status, const char *object, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - op->string = g_strdup (object); - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); - -} - -static void -cal_add_timezone_cb (CalListener *listener, ECalendarStatus status, const char *tzid, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - op->uid = g_strdup (tzid); - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); - -} - -static void -cal_set_default_timezone_cb (CalListener *listener, ECalendarStatus status, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_get_changes_cb (CalListener *listener, ECalendarStatus status, GList *changes, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - GList *l; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - op->list = g_list_copy (changes); - - for (l = op->list; l; l = l->next) { - CalClientChange *ccc = l->data, *new_ccc; - - new_ccc = g_new (CalClientChange, 1); - new_ccc->comp = cal_component_clone (ccc->comp); - new_ccc->type = ccc->type; - - l->data = new_ccc; - } - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_get_free_busy_cb (CalListener *listener, ECalendarStatus status, GList *freebusy, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - GList *l; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - op->list = g_list_copy (freebusy); - - for (l = op->list; l; l = l->next) - l->data = cal_component_clone (l->data); - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -static void -cal_query_cb (CalListener *listener, ECalendarStatus status, GNOME_Evolution_Calendar_Query query, gpointer data) -{ - CalClient *client = data; - ECalendarOp *op; - - op = e_calendar_get_op (client); - - if (op == NULL) { - g_warning (G_STRLOC ": Cannot find operation "); - return; - } - - e_mutex_lock (op->mutex); - - op->status = status; - op->query = cal_query_new (query, op->listener, client); - - pthread_cond_signal (&op->cond); - - e_mutex_unlock (op->mutex); -} - -/* Handle the cal_set_mode notification from the listener */ -static void -cal_set_mode_cb (CalListener *listener, - GNOME_Evolution_Calendar_Listener_SetModeStatus status, - GNOME_Evolution_Calendar_CalMode mode, - gpointer data) -{ - CalClient *client; - CalClientPrivate *priv; - CalClientSetModeStatus client_status; - - client = CAL_CLIENT (data); - priv = client->priv; - - client_status = CAL_CLIENT_OPEN_ERROR; - - switch (status) { - case GNOME_Evolution_Calendar_Listener_MODE_SET: - client_status = CAL_CLIENT_SET_MODE_SUCCESS; - break; - case GNOME_Evolution_Calendar_Listener_MODE_NOT_SET: - client_status = CAL_CLIENT_SET_MODE_ERROR; - break; - case GNOME_Evolution_Calendar_Listener_MODE_NOT_SUPPORTED: - client_status = CAL_CLIENT_SET_MODE_NOT_SUPPORTED; - break; - default: - g_assert_not_reached (); - } - - /* We are *not* inside a signal handler (this is just a simple callback - * called from the listener), so there is not a temporary reference to - * the client object. We ref() so that we can safely emit our own - * signal and clean up. - */ - - g_object_ref (G_OBJECT (client)); - - g_signal_emit (G_OBJECT (client), cal_client_signals[CAL_SET_MODE], - 0, client_status, mode); - - g_object_unref (G_OBJECT (client)); -} - -/* Handle the error_occurred signal from the listener */ -static void -backend_error_cb (CalListener *listener, const char *message, gpointer data) -{ - CalClient *client; - - client = CAL_CLIENT (data); - g_signal_emit (G_OBJECT (client), cal_client_signals[BACKEND_ERROR], 0, message); -} - -/* Handle the categories_changed signal from the listener */ -static void -categories_changed_cb (CalListener *listener, const GNOME_Evolution_Calendar_StringSeq *categories, - gpointer data) -{ - CalClient *client; - GPtrArray *cats; - int i; - - client = CAL_CLIENT (data); - - cats = g_ptr_array_new (); - g_ptr_array_set_size (cats, categories->_length); - - for (i = 0; i < categories->_length; i++) - cats->pdata[i] = categories->_buffer[i]; - - g_signal_emit (G_OBJECT (client), cal_client_signals[CATEGORIES_CHANGED], 0, cats); - - g_ptr_array_free (cats, TRUE); -} - - - -static gboolean -get_factories (const char *str_uri, GList **factories) -{ - GNOME_Evolution_Calendar_CalFactory factory; - Bonobo_ServerInfoList *servers; - EUri *uri; - char *query; - int i; - - - /* Determine the protocol and query for factory supporting that */ - uri = e_uri_new (str_uri); - if (!uri) { - g_warning (G_STRLOC ": Invalid uri string"); - - return FALSE; - } - - query = g_strdup_printf ("repo_ids.has ('IDL:GNOME/Evolution/Calendar/CalFactory:1.0')" - " AND calendar:supported_protocols.has ('%s')", uri->protocol); - - - servers = bonobo_activation_query (query, NULL, NULL); - - g_free (query); - e_uri_free (uri); - - if (!servers) { - g_warning (G_STRLOC ": Unable to query for calendar factories"); - - return FALSE; - } - - /* Try to activate the servers for the protocol */ - for (i = 0; i < servers->_length; i++) { - const Bonobo_ServerInfo *info; - - info = servers->_buffer + i; - - g_message (G_STRLOC ": Activating calendar factory (%s)", info->iid); - factory = bonobo_activation_activate_from_id (info->iid, 0, NULL, NULL); - - if (factory == CORBA_OBJECT_NIL) - g_warning (G_STRLOC ": Could not activate calendar factory (%s)", info->iid); - else - *factories = g_list_append (*factories, factory); - } - - CORBA_free (servers); - - return TRUE; -} - -/* Object initialization function for the calendar client */ -static void -cal_client_init (CalClient *client, CalClientClass *klass) -{ - CalClientPrivate *priv; - - priv = g_new0 (CalClientPrivate, 1); - client->priv = priv; - - priv->load_state = CAL_CLIENT_LOAD_NOT_LOADED; - priv->uri = NULL; - priv->mutex = e_mutex_new (E_MUTEX_REC); - priv->listener = cal_listener_new (cal_set_mode_cb, - backend_error_cb, - categories_changed_cb, - client); - - priv->cal_address = NULL; - priv->alarm_email_address = NULL; - priv->ldap_attribute = NULL; - priv->capabilities = FALSE; - priv->factories = NULL; - priv->timezones = g_hash_table_new (g_str_hash, g_str_equal); - priv->default_zone = icaltimezone_get_utc_timezone (); - priv->comp_listener = NULL; - - g_signal_connect (G_OBJECT (priv->listener), "read_only", G_CALLBACK (cal_read_only_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "cal_address", G_CALLBACK (cal_cal_address_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "alarm_address", G_CALLBACK (cal_alarm_address_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "ldap_attribute", G_CALLBACK (cal_ldap_attribute_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "static_capabilities", G_CALLBACK (cal_static_capabilities_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "open", G_CALLBACK (cal_opened_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "remove", G_CALLBACK (cal_removed_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "create_object", G_CALLBACK (cal_object_created_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "modify_object", G_CALLBACK (cal_object_modified_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "remove_object", G_CALLBACK (cal_object_removed_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "discard_alarm", G_CALLBACK (cal_alarm_discarded_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "receive_objects", G_CALLBACK (cal_objects_received_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "send_objects", G_CALLBACK (cal_objects_sent_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "default_object", G_CALLBACK (cal_default_object_requested_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "object", G_CALLBACK (cal_object_requested_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "object_list", G_CALLBACK (cal_object_list_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "get_timezone", G_CALLBACK (cal_get_timezone_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "add_timezone", G_CALLBACK (cal_add_timezone_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "set_default_timezone", G_CALLBACK (cal_set_default_timezone_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "get_changes", G_CALLBACK (cal_get_changes_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "get_free_busy", G_CALLBACK (cal_get_free_busy_cb), client); - g_signal_connect (G_OBJECT (priv->listener), "query", G_CALLBACK (cal_query_cb), client); -} - -/* Finalize handler for the calendar client */ -static void -cal_client_finalize (GObject *object) -{ - CalClient *client; - CalClientPrivate *priv; - - g_return_if_fail (object != NULL); - g_return_if_fail (IS_CAL_CLIENT (object)); - - client = CAL_CLIENT (object); - priv = client->priv; - - if (priv->listener) { - cal_listener_stop_notification (priv->listener); - bonobo_object_unref (priv->listener); - priv->listener = NULL; - } - - if (priv->comp_listener) { - g_signal_handlers_disconnect_matched (G_OBJECT (priv->comp_listener), - G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, - client); - g_object_unref (G_OBJECT (priv->comp_listener)); - priv->comp_listener = NULL; - } - - destroy_factories (client); - destroy_cal (client); - - priv->load_state = CAL_CLIENT_LOAD_NOT_LOADED; - - if (priv->uri) { - g_free (priv->uri); - priv->uri = NULL; - } - - if (priv->mutex) { - e_mutex_destroy (priv->mutex); - priv->mutex = NULL; - } - - if (priv->cal_address) { - g_free (priv->cal_address); - priv->cal_address = NULL; - } - if (priv->alarm_email_address) { - g_free (priv->alarm_email_address); - priv->alarm_email_address = NULL; - } - if (priv->ldap_attribute) { - g_free (priv->ldap_attribute); - priv->ldap_attribute = NULL; - } - if (priv->capabilities) { - g_free (priv->capabilities); - priv->capabilities = NULL; - } - - g_hash_table_foreach (priv->timezones, free_timezone, NULL); - g_hash_table_destroy (priv->timezones); - priv->timezones = NULL; - - g_free (priv); - client->priv = NULL; - - if (G_OBJECT_CLASS (parent_class)->finalize) - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - -/* Class initialization function for the calendar client */ -static void -cal_client_class_init (CalClientClass *klass) -{ - GObjectClass *object_class; - - object_class = (GObjectClass *) klass; - - parent_class = g_type_class_peek_parent (klass); - - cal_client_signals[CAL_OPENED] = - g_signal_new ("cal_opened", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (CalClientClass, cal_opened), - NULL, NULL, - g_cclosure_marshal_VOID__ENUM, - G_TYPE_NONE, 1, - CAL_CLIENT_OPEN_STATUS_ENUM_TYPE); - cal_client_signals[CAL_SET_MODE] = - g_signal_new ("cal_set_mode", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (CalClientClass, cal_set_mode), - NULL, NULL, - cal_util_marshal_VOID__ENUM_ENUM, - G_TYPE_NONE, 2, - CAL_CLIENT_SET_MODE_STATUS_ENUM_TYPE, - CAL_MODE_ENUM_TYPE); - cal_client_signals[BACKEND_ERROR] = - g_signal_new ("backend_error", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (CalClientClass, backend_error), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - cal_client_signals[CATEGORIES_CHANGED] = - g_signal_new ("categories_changed", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (CalClientClass, categories_changed), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - cal_client_signals[FORGET_PASSWORD] = - g_signal_new ("forget_password", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (CalClientClass, forget_password), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - cal_client_signals[BACKEND_DIED] = - g_signal_new ("backend_died", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (CalClientClass, backend_died), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - klass->cal_opened = NULL; - klass->categories_changed = NULL; - klass->forget_password = NULL; - klass->backend_died = NULL; - - object_class->finalize = cal_client_finalize; -} - -/** - * cal_client_get_type: - * - * Registers the #CalClient class if necessary, and returns the type ID assigned - * to it. - * - * Return value: The type ID of the #CalClient class. - **/ -GType -cal_client_get_type (void) -{ - static GType cal_client_type = 0; - - if (!cal_client_type) { - static GTypeInfo info = { - sizeof (CalClientClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) cal_client_class_init, - NULL, NULL, - sizeof (CalClient), - 0, - (GInstanceInitFunc) cal_client_init - }; - cal_client_type = g_type_register_static (G_TYPE_OBJECT, "CalClient", &info, 0); - } - - return cal_client_type; -} - - -static gboolean -fetch_corba_cal (CalClient *client, const char *str_uri, CalObjType type) -{ - CalClientPrivate *priv; - GList *f; - CORBA_Environment ev; - - priv = client->priv; - g_return_val_if_fail (priv->load_state == CAL_CLIENT_LOAD_NOT_LOADED, FALSE); - g_assert (priv->uri == NULL); - - g_return_val_if_fail (str_uri != NULL, FALSE); - - if (!get_factories (str_uri, &priv->factories)) - return FALSE; - - priv->uri = g_strdup (str_uri); - priv->type = type; - - for (f = priv->factories; f; f = f->next) { - GNOME_Evolution_Calendar_Cal cal; - - CORBA_exception_init (&ev); - - cal = GNOME_Evolution_Calendar_CalFactory_getCal (f->data, priv->uri, priv->type, - BONOBO_OBJREF (priv->listener), &ev); - if (BONOBO_EX (&ev)) - continue; - - priv->cal = cal; - - return TRUE; - } - - return FALSE; -} - -/** - * cal_client_new: - * - * Creates a new calendar client. It should be initialized by calling - * cal_client_open(). - * - * Return value: A newly-created calendar client, or NULL if the client could - * not be constructed because it could not contact the calendar server. - **/ -CalClient * -cal_client_new (const char *uri, CalObjType type) -{ - CalClient *client; - - client = g_object_new (CAL_CLIENT_TYPE, NULL); - - if (!fetch_corba_cal (client, uri, type)) { - g_object_unref (client); - - return NULL; - } - - return client; -} - -/** - * cal_client_set_auth_func - * @client: A calendar client. - * @func: The authentication function - * @data: User data to be used when calling the authentication function - * - * Associates the given authentication function with a calendar client. This - * function will be called any time the calendar server needs a password - * from the client. So, calendar clients should provide such authentication - * function, which, when called, should act accordingly (by showing a dialog - * box, for example, to ask the user for the password). - * - * The authentication function must have the following form: - * char * auth_func (CalClient *client, - * const gchar *prompt, - * const gchar *key, - * gpointer user_data) - */ -void -cal_client_set_auth_func (CalClient *client, CalClientAuthFunc func, gpointer data) -{ - g_return_if_fail (client != NULL); - g_return_if_fail (IS_CAL_CLIENT (client)); - - client->priv->auth_func = func; - client->priv->auth_user_data = data; -} - -/** - * cal_client_open - * @client: A calendar client. - * @str_uri: URI of calendar to open. - * @only_if_exists: FALSE if the calendar should be opened even if there - * was no storage for it, i.e. to create a new calendar or load an existing - * one if it already exists. TRUE if it should only try to load calendars - * that already exist. - * - * Makes a calendar client initiate a request to open a calendar. The calendar - * client will emit the "cal_opened" signal when the response from the server is - * received. - * - * Return value: TRUE on success, FALSE on failure to issue the open request. - **/ -gboolean -cal_client_open (CalClient *client, gboolean only_if_exists, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - - e_mutex_lock (client->priv->mutex); - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - CORBA_exception_init (&ev); - - priv->load_state = CAL_CLIENT_LOAD_LOADING; - - GNOME_Evolution_Calendar_Cal_open (priv->cal, only_if_exists, &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - g_signal_emit (G_OBJECT (client), cal_client_signals[CAL_OPENED], 0, - E_CALENDAR_STATUS_CORBA_EXCEPTION); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - if (status == E_CALENDAR_STATUS_OK) - priv->load_state = CAL_CLIENT_LOAD_LOADED; - else - priv->load_state = CAL_CLIENT_LOAD_NOT_LOADED; - - g_signal_emit (G_OBJECT (client), cal_client_signals[CAL_OPENED], 0, status); - E_CALENDAR_CHECK_STATUS (status, error); -} - -typedef struct { - CalClient *client; - - gboolean exists; -} CalClientAsyncData; - -static gboolean -open_async (gpointer data) -{ - CalClientAsyncData *ccad = data; - GError *error = NULL; - - cal_client_open (ccad->client, ccad->exists, &error); - - g_clear_error (&error); - - g_object_unref (ccad); - g_free (ccad); - - return FALSE; -} - -void -cal_client_open_async (CalClient *client, gboolean only_if_exists) -{ - CalClientAsyncData *ccad; - - g_return_if_fail (client != NULL); - g_return_if_fail (IS_CAL_CLIENT (client)); - - ccad = g_new0 (CalClientAsyncData, 1); - ccad->client = g_object_ref (client); - ccad->exists = only_if_exists; - - /* FIXME This should really spawn a new thread */ - g_idle_add (open_async, ccad); -} - -gboolean -cal_client_remove_calendar (CalClient *client, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - - e_mutex_lock (client->priv->mutex); - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_remove (priv->cal, &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -#if 0 -/* Builds an URI list out of a CORBA string sequence */ -static GList * -build_uri_list (GNOME_Evolution_Calendar_StringSeq *seq) -{ - GList *uris = NULL; - int i; - - for (i = 0; i < seq->_length; i++) - uris = g_list_prepend (uris, g_strdup (seq->_buffer[i])); - - return uris; -} -#endif - -/** - * cal_client_uri_list: - * @client: A calendar client - * @type: type of uri's to get - * - * - * Return value: A list of URI's open on the wombat - **/ -GList * -cal_client_uri_list (CalClient *client, CalMode mode) -{ -#if 0 - CalClientPrivate *priv; - GNOME_Evolution_Calendar_StringSeq *uri_seq; - GList *uris = NULL; - CORBA_Environment ev; - GList *f; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - - for (f = priv->factories; f; f = f->next) { - CORBA_exception_init (&ev); - uri_seq = GNOME_Evolution_Calendar_CalFactory_uriList (f->data, mode, &ev); - - if (BONOBO_EX (&ev)) { - g_message ("cal_client_uri_list(): request failed"); - - /* free memory and return */ - g_list_foreach (uris, (GFunc) g_free, NULL); - g_list_free (uris); - uris = NULL; - break; - } - else { - uris = g_list_concat (uris, build_uri_list (uri_seq)); - CORBA_free (uri_seq); - } - - CORBA_exception_free (&ev); - } - - return uris; -#endif - - return NULL; -} - - -/** - * cal_client_get_load_state: - * @client: A calendar client. - * - * Queries the state of loading of a calendar client. - * - * Return value: A #CalClientLoadState value indicating whether the client has - * not been loaded with cal_client_open_calendar() yet, whether it is being - * loaded, or whether it is already loaded. - **/ -CalClientLoadState -cal_client_get_load_state (CalClient *client) -{ - CalClientPrivate *priv; - - g_return_val_if_fail (client != NULL, CAL_CLIENT_LOAD_NOT_LOADED); - g_return_val_if_fail (IS_CAL_CLIENT (client), CAL_CLIENT_LOAD_NOT_LOADED); - - priv = client->priv; - return priv->load_state; -} - -/** - * cal_client_get_uri: - * @client: A calendar client. - * - * Queries the URI that is open in a calendar client. - * - * Return value: The URI of the calendar that is already loaded or is being - * loaded, or NULL if the client has not started a load request yet. - **/ -const char * -cal_client_get_uri (CalClient *client) -{ - CalClientPrivate *priv; - - g_return_val_if_fail (client != NULL, NULL); - g_return_val_if_fail (IS_CAL_CLIENT (client), NULL); - - priv = client->priv; - return priv->uri; -} - -/** - * cal_client_is_read_only: - * @client: A calendar client. - * - * Queries whether the calendar client can perform modifications - * on the calendar or not. Whether the backend is read only or not - * is specified, on exit, in the @read_only argument. - * - * Return value: TRUE if the call was successful, FALSE if there was an error. - */ -gboolean -cal_client_is_read_only (CalClient *client, gboolean *read_only, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_isReadOnly (priv->cal, &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - *read_only = our_op->bool; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - return status; -} - -/** - * cal_client_get_cal_address: - * @client: A calendar client. - * - * Queries the calendar address associated with a calendar client. - * - * Return value: The calendar address associated with the calendar that - * is loaded or being loaded, or %NULL if the client has not started a - * load request yet or the calendar has no associated email address. - **/ -gboolean -cal_client_get_cal_address (CalClient *client, char **cal_address, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_getCalAddress (priv->cal, &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - *cal_address = our_op->string; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -gboolean -cal_client_get_alarm_email_address (CalClient *client, char **alarm_address, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_getAlarmEmailAddress (priv->cal, &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - *alarm_address = our_op->string; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -gboolean -cal_client_get_ldap_attribute (CalClient *client, char **ldap_attribute, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_getLdapAttribute (priv->cal, &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - *ldap_attribute = our_op->string; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -static gboolean -load_static_capabilities (CalClient *client, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - char *cap; - - priv = client->priv; - - if (priv->capabilities) - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_OK, error); - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_getStaticCapabilities (priv->cal, &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - cap = our_op->string; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -static gboolean -check_capability (CalClient *client, const char *cap) -{ - CalClientPrivate *priv; - - priv = client->priv; - - /* FIXME Check result */ - load_static_capabilities (client, NULL); - if (priv->capabilities && strstr (priv->capabilities, cap)) - return TRUE; - - return FALSE; -} - -gboolean -cal_client_get_one_alarm_only (CalClient *client) -{ - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - return check_capability (client, CAL_STATIC_CAPABILITY_ONE_ALARM_ONLY); -} - -gboolean -cal_client_get_organizer_must_attend (CalClient *client) -{ - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - return check_capability (client, CAL_STATIC_CAPABILITY_ORGANIZER_MUST_ATTEND); -} - -gboolean -cal_client_get_static_capability (CalClient *client, const char *cap) -{ - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - return check_capability (client, cap); -} - -gboolean -cal_client_get_save_schedules (CalClient *client) -{ - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - return check_capability (client, CAL_STATIC_CAPABILITY_SAVE_SCHEDULES); -} - -gboolean -cal_client_set_mode (CalClient *client, CalMode mode) -{ - CalClientPrivate *priv; - gboolean retval = TRUE; - CORBA_Environment ev; - - g_return_val_if_fail (client != NULL, -1); - g_return_val_if_fail (IS_CAL_CLIENT (client), -1); - - priv = client->priv; - g_return_val_if_fail (priv->load_state == CAL_CLIENT_LOAD_LOADED, -1); - - CORBA_exception_init (&ev); - GNOME_Evolution_Calendar_Cal_setMode (priv->cal, mode, &ev); - - if (BONOBO_EX (&ev)) - retval = FALSE; - - CORBA_exception_free (&ev); - - return retval; -} - - -/* This is used in the callback which fetches all the timezones needed for an - object. */ -typedef struct _CalClientGetTimezonesData CalClientGetTimezonesData; -struct _CalClientGetTimezonesData { - CalClient *client; - - /* This starts out at E_CALENDAR_STATUS_OK. If an error occurs this - contains the last error. */ - ECalendarStatus status; -}; - -gboolean -cal_client_get_default_object (CalClient *client, icalcomponent **icalcomp, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_getDefaultObject (priv->cal, &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - *icalcomp = icalparser_parse_string (our_op->string); - g_free (our_op->string); - - if (!*icalcomp) { - status = E_CALENDAR_STATUS_INVALID_OBJECT; - } else { - CalClientGetTimezonesData cb_data; - - /* Now make sure we have all timezones needed for this object. - We do this to try to avoid any problems caused by getting a timezone - in the middle of other code. Any calls to ORBit result in a - recursive call of the GTK+ main loop, which can cause problems for - code that doesn't expect it. Currently GnomeCanvas has problems if - we try to get a timezone in the middle of a redraw, and there is a - resize pending, which leads to an assert failure and an abort. */ - cb_data.client = client; - cb_data.status = E_CALENDAR_STATUS_OK; - icalcomponent_foreach_tzid (*icalcomp, - cal_client_get_object_timezones_cb, - &cb_data); - - status = cb_data.status; - } - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -/** - * cal_client_get_object: - * @client: A calendar client. - * @uid: Unique identifier for a calendar component. - * @icalcomp: Return value for the calendar component object. - * - * Queries a calendar for a calendar component object based on its unique - * identifier. - * - * Return value: Result code based on the status of the operation. - **/ -gboolean -cal_client_get_object (CalClient *client, const char *uid, const char *rid, icalcomponent **icalcomp, GError **error) -{ - - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_getObject (priv->cal, uid, rid ? rid : "", &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - *icalcomp = icalparser_parse_string (our_op->string); - g_free (our_op->string); - - if (status == E_CALENDAR_STATUS_OK && !*icalcomp) { - status = E_CALENDAR_STATUS_INVALID_OBJECT; - } else if (status == E_CALENDAR_STATUS_OK){ - CalClientGetTimezonesData cb_data; - - /* Now make sure we have all timezones needed for this object. - We do this to try to avoid any problems caused by getting a timezone - in the middle of other code. Any calls to ORBit result in a - recursive call of the GTK+ main loop, which can cause problems for - code that doesn't expect it. Currently GnomeCanvas has problems if - we try to get a timezone in the middle of a redraw, and there is a - resize pending, which leads to an assert failure and an abort. */ - cb_data.client = client; - cb_data.status = E_CALENDAR_STATUS_OK; - icalcomponent_foreach_tzid (*icalcomp, - cal_client_get_object_timezones_cb, - &cb_data); - - status = cb_data.status; - } - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - - -static void -cal_client_get_object_timezones_cb (icalparameter *param, - void *data) -{ - CalClientGetTimezonesData *cb_data = data; - const char *tzid; - icaltimezone *zone; - GError *error = NULL; - - tzid = icalparameter_get_tzid (param); - if (!tzid) { - cb_data->status = E_CALENDAR_STATUS_INVALID_OBJECT; - return; - } - - if (!cal_client_get_timezone (cb_data->client, tzid, &zone, &error)) - cb_data->status = error->code; - - g_clear_error (&error); -} - -/* Resolves TZIDs for the recurrence generator. */ -icaltimezone* -cal_client_resolve_tzid_cb (const char *tzid, gpointer data) -{ - CalClient *client; - icaltimezone *zone = NULL; - - g_return_val_if_fail (data != NULL, NULL); - g_return_val_if_fail (IS_CAL_CLIENT (data), NULL); - - client = CAL_CLIENT (data); - - /* FIXME: Handle errors. */ - cal_client_get_timezone (client, tzid, &zone, NULL); - - return zone; -} - -gboolean -cal_client_get_changes (CalClient *client, const char *change_id, GList **changes, GError **error) -{ - CORBA_Environment ev; - ECalendarOp *our_op; - ECalendarStatus status; - - g_return_val_if_fail (client != NULL, E_CALENDAR_STATUS_INVALID_ARG); - g_return_val_if_fail (IS_CAL_CLIENT (client), E_CALENDAR_STATUS_INVALID_ARG); - g_return_val_if_fail (change_id != NULL, E_CALENDAR_STATUS_INVALID_ARG); - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_getChanges (client->priv->cal, change_id, &ev); - - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - *changes = our_op->list; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - - -/** - * cal_client_get_object_list: - * @client: - * @query: - * - * - * - * Return value: - **/ -gboolean -cal_client_get_object_list (CalClient *client, const char *query, GList **objects, GError **error) -{ - CORBA_Environment ev; - ECalendarOp *our_op; - ECalendarStatus status; - - g_return_val_if_fail (client != NULL, E_CALENDAR_STATUS_INVALID_ARG); - g_return_val_if_fail (IS_CAL_CLIENT (client), E_CALENDAR_STATUS_INVALID_ARG); - g_return_val_if_fail (query != NULL, E_CALENDAR_STATUS_INVALID_ARG); - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_getObjectList (client->priv->cal, query, &ev); - - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - *objects = our_op->list; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -gboolean -cal_client_get_object_list_as_comp (CalClient *client, const char *query, GList **objects, GError **error) -{ - GList *ical_objects = NULL; - GList *l; - - g_return_val_if_fail (client != NULL, E_CALENDAR_STATUS_INVALID_ARG); - g_return_val_if_fail (IS_CAL_CLIENT (client), E_CALENDAR_STATUS_INVALID_ARG); - g_return_val_if_fail (query != NULL, E_CALENDAR_STATUS_INVALID_ARG); - g_return_val_if_fail (objects != NULL, E_CALENDAR_STATUS_INVALID_ARG); - - if (!cal_client_get_object_list (client, query, &ical_objects, error)) - return FALSE; - - *objects = NULL; - for (l = ical_objects; l; l = l->next) { - CalComponent *comp; - - comp = cal_component_new (); - cal_component_set_icalcomponent (comp, l->data); - *objects = g_list_prepend (*objects, comp); - } - - g_list_free (ical_objects); - - return TRUE; -} - -void -cal_client_free_object_list (GList *objects) -{ - GList *l; - - for (l = objects; l; l = l->next) - icalcomponent_free (l->data); - - g_list_free (objects); -} - -/** - * cal_client_get_free_busy - * @client:: A calendar client. - * @users: List of users to retrieve free/busy information for. - * @start: Start time for query. - * @end: End time for query. - * - * Gets free/busy information from the calendar server. - * - * Returns: a GList of VFREEBUSY CalComponents - */ -gboolean -cal_client_get_free_busy (CalClient *client, GList *users, time_t start, time_t end, - GList **freebusy, GError **error) -{ - CORBA_Environment ev; - ECalendarOp *our_op; - ECalendarStatus status; - GNOME_Evolution_Calendar_UserList corba_users; - GList *l; - int i, len; - - g_return_val_if_fail (client != NULL, E_CALENDAR_STATUS_INVALID_ARG); - g_return_val_if_fail (IS_CAL_CLIENT (client), E_CALENDAR_STATUS_INVALID_ARG); - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - /* create the CORBA user list to be passed to the backend */ - len = g_list_length (users); - - corba_users._length = len; - corba_users._buffer = CORBA_sequence_GNOME_Evolution_Calendar_User_allocbuf (len); - - for (l = users, i = 0; l; l = l->next, i++) - corba_users._buffer[i] = CORBA_string_dup (l->data); - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_getFreeBusy (client->priv->cal, &corba_users, start, end, &ev); - - CORBA_free (corba_users._buffer); - - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - - *freebusy = NULL; - for (l = our_op->list; l; l = l->next) { - CalComponent *comp; - - icalcomponent *icalcomp; - icalcomponent_kind kind; - - icalcomp = icalparser_parse_string (l->data); - if (!icalcomp) - continue; - - kind = icalcomponent_isa (icalcomp); - if (kind == ICAL_VFREEBUSY_COMPONENT) { - comp = cal_component_new (); - if (!cal_component_set_icalcomponent (comp, icalcomp)) { - icalcomponent_free (icalcomp); - g_object_unref (G_OBJECT (comp)); - continue; - } - - *freebusy = g_list_append (*freebusy, comp); - } - else - icalcomponent_free (icalcomp); - } - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -struct comp_instance { - CalComponent *comp; - time_t start; - time_t end; -}; - -/* Called from cal_recur_generate_instances(); adds an instance to the list */ -static gboolean -add_instance (CalComponent *comp, time_t start, time_t end, gpointer data) -{ - GList **list; - struct comp_instance *ci; - - list = data; - - ci = g_new (struct comp_instance, 1); - - ci->comp = comp; - g_object_ref (G_OBJECT (ci->comp)); - - ci->start = start; - ci->end = end; - - *list = g_list_prepend (*list, ci); - - return TRUE; -} - -/* Used from g_list_sort(); compares two struct comp_instance structures */ -static gint -compare_comp_instance (gconstpointer a, gconstpointer b) -{ - const struct comp_instance *cia, *cib; - time_t diff; - - cia = a; - cib = b; - - diff = cia->start - cib->start; - return (diff < 0) ? -1 : (diff > 0) ? 1 : 0; -} - -/** - * cal_client_generate_instances: - * @client: A calendar client. - * @type: Bitmask with types of objects to return. - * @start: Start time for query. - * @end: End time for query. - * @cb: Callback for each generated instance. - * @cb_data: Closure data for the callback. - * - * Does a combination of cal_client_get_object_list () and - * cal_recur_generate_instances(). - * - * The callback function should do a g_object_ref() of the calendar component - * it gets passed if it intends to keep it around. - **/ -void -cal_client_generate_instances (CalClient *client, CalObjType type, - time_t start, time_t end, - CalRecurInstanceFn cb, gpointer cb_data) -{ - CalClientPrivate *priv; - GList *objects; - GList *instances; - GList *l; - char *query; - - g_return_if_fail (client != NULL); - g_return_if_fail (IS_CAL_CLIENT (client)); - - priv = client->priv; - g_return_if_fail (priv->load_state == CAL_CLIENT_LOAD_LOADED); - - g_return_if_fail (start != -1 && end != -1); - g_return_if_fail (start <= end); - g_return_if_fail (cb != NULL); - - /* Generate objects */ - query = g_strdup_printf ("(occur-in-time-range? (%lu) (%lu))", start, end); - if (!cal_client_get_object_list (client, query, &objects, NULL)) { - g_free (query); - return; - } - g_free (query); - - instances = NULL; - - for (l = objects; l; l = l->next) { - CalComponent *comp; - - comp = l->data; - cal_recur_generate_instances (comp, start, end, add_instance, &instances, - cal_client_resolve_tzid_cb, client, - priv->default_zone); - g_object_unref (G_OBJECT (comp)); - } - - g_list_free (objects); - - /* Generate instances and spew them out */ - - instances = g_list_sort (instances, compare_comp_instance); - - for (l = instances; l; l = l->next) { - struct comp_instance *ci; - gboolean result; - - ci = l->data; - - result = (* cb) (ci->comp, ci->start, ci->end, cb_data); - - if (!result) - break; - } - - /* Clean up */ - - for (l = instances; l; l = l->next) { - struct comp_instance *ci; - - ci = l->data; - g_object_unref (G_OBJECT (ci->comp)); - g_free (ci); - } - - g_list_free (instances); -} - -/* Builds a list of CalComponentAlarms structures */ -static GSList * -build_component_alarms_list (CalClient *client, GList *object_list, time_t start, time_t end) -{ - GSList *comp_alarms; - GList *l; - - comp_alarms = NULL; - - for (l = object_list; l != NULL; l = l->next) { - CalComponent *comp; - CalComponentAlarms *alarms; - icalcomponent *icalcomp; - CalAlarmAction omit[] = {-1}; - - icalcomp = icalparser_parse_string (l->data); - if (!icalcomp) - continue; - - comp = cal_component_new (); - if (!cal_component_set_icalcomponent (comp, icalcomp)) { - icalcomponent_free (icalcomp); - g_object_unref (G_OBJECT (comp)); - continue; - } - - alarms = cal_util_generate_alarms_for_comp (comp, start, end, omit, cal_client_resolve_tzid_cb, - icalcomp, client->priv->default_zone); - if (alarms) - comp_alarms = g_slist_prepend (comp_alarms, alarms); - } - - return comp_alarms; -} - -/** - * cal_client_get_alarms_in_range: - * @client: A calendar client. - * @start: Start time for query. - * @end: End time for query. - * - * Queries a calendar for the alarms that trigger in the specified range of - * time. - * - * Return value: A list of #CalComponentAlarms structures. This should be freed - * using the cal_client_free_alarms() function, or by freeing each element - * separately with cal_component_alarms_free() and then freeing the list with - * g_slist_free(). - **/ -GSList * -cal_client_get_alarms_in_range (CalClient *client, time_t start, time_t end) -{ - CalClientPrivate *priv; - GSList *alarms; - char *sexp; - GList *object_list = NULL; - - g_return_val_if_fail (client != NULL, NULL); - g_return_val_if_fail (IS_CAL_CLIENT (client), NULL); - - priv = client->priv; - g_return_val_if_fail (priv->load_state == CAL_CLIENT_LOAD_LOADED, NULL); - - g_return_val_if_fail (start != -1 && end != -1, NULL); - g_return_val_if_fail (start <= end, NULL); - - /* build the query string */ - sexp = g_strdup ("(and (has-alarms? #t))"); - - /* execute the query on the server */ - if (!cal_client_get_object_list (client, sexp, &object_list, NULL)) { - g_free (sexp); - return NULL; - } - - alarms = build_component_alarms_list (client, object_list, start, end); - - g_list_foreach (object_list, (GFunc) g_free, NULL); - g_list_free (object_list); - g_free (sexp); - - return alarms; -} - -/** - * cal_client_free_alarms: - * @comp_alarms: A list of #CalComponentAlarms structures. - * - * Frees a list of #CalComponentAlarms structures as returned by - * cal_client_get_alarms_in_range(). - **/ -void -cal_client_free_alarms (GSList *comp_alarms) -{ - GSList *l; - - for (l = comp_alarms; l; l = l->next) { - CalComponentAlarms *alarms; - - alarms = l->data; - g_assert (alarms != NULL); - - cal_component_alarms_free (alarms); - } - - g_slist_free (comp_alarms); -} - -/** - * cal_client_get_alarms_for_object: - * @client: A calendar client. - * @uid: Unique identifier for a calendar component. - * @start: Start time for query. - * @end: End time for query. - * @alarms: Return value for the component's alarm instances. Will return NULL - * if no instances occur within the specified time range. This should be freed - * using the cal_component_alarms_free() function. - * - * Queries a calendar for the alarms of a particular object that trigger in the - * specified range of time. - * - * Return value: TRUE on success, FALSE if the object was not found. - **/ -gboolean -cal_client_get_alarms_for_object (CalClient *client, const char *uid, - time_t start, time_t end, - CalComponentAlarms **alarms) -{ - CalClientPrivate *priv; - icalcomponent *icalcomp; - CalComponent *comp; - CalAlarmAction omit[] = {-1}; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - g_return_val_if_fail (priv->load_state == CAL_CLIENT_LOAD_LOADED, FALSE); - - g_return_val_if_fail (uid != NULL, FALSE); - g_return_val_if_fail (start != -1 && end != -1, FALSE); - g_return_val_if_fail (start <= end, FALSE); - g_return_val_if_fail (alarms != NULL, FALSE); - - *alarms = NULL; - - if (!cal_client_get_object (client, uid, NULL, &icalcomp, NULL)) - return FALSE; - if (!icalcomp) - return FALSE; - - comp = cal_component_new (); - if (!cal_component_set_icalcomponent (comp, icalcomp)) { - icalcomponent_free (icalcomp); - g_object_unref (G_OBJECT (comp)); - return FALSE; - } - - *alarms = cal_util_generate_alarms_for_comp (comp, start, end, omit, cal_client_resolve_tzid_cb, - icalcomp, priv->default_zone); - - return TRUE; -} - -/** - * cal_client_discard_alarm - * @client: A calendar client. - * @comp: The component to discard the alarm from. - * @auid: Unique identifier of the alarm to be discarded. - * - * Tells the calendar backend to get rid of the alarm identified by the - * @auid argument in @comp. Some backends might remove the alarm or - * update internal information about the alarm be discarded, or, like - * the file backend does, ignore the operation. - * - * Return value: a #CalClientResult value indicating the result of the - * operation. - */ -gboolean -cal_client_discard_alarm (CalClient *client, CalComponent *comp, const char *auid, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - const char *uid; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - cal_component_get_uid (comp, &uid); - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_discardAlarm (priv->cal, uid, auid, &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -typedef struct _ForeachTZIDCallbackData ForeachTZIDCallbackData; -struct _ForeachTZIDCallbackData { - CalClient *client; - GHashTable *timezone_hash; - gboolean include_all_timezones; - gboolean success; -}; - -/* This adds the VTIMEZONE given by the TZID parameter to the GHashTable in - data. */ -static void -foreach_tzid_callback (icalparameter *param, void *cbdata) -{ - ForeachTZIDCallbackData *data = cbdata; - CalClientPrivate *priv; - const char *tzid; - icaltimezone *zone; - icalcomponent *vtimezone_comp; - char *vtimezone_as_string; - - priv = data->client->priv; - - /* Get the TZID string from the parameter. */ - tzid = icalparameter_get_tzid (param); - if (!tzid) - return; - - /* Check if we've already added it to the GHashTable. */ - if (g_hash_table_lookup (data->timezone_hash, tzid)) - return; - - if (data->include_all_timezones) { - if (!cal_client_get_timezone (data->client, tzid, &zone, NULL)) { - data->success = FALSE; - return; - } - } else { - /* Check if it is in our cache. If it is, it must already be - on the server so return. */ - if (g_hash_table_lookup (priv->timezones, tzid)) - return; - - /* Check if it is a builtin timezone. If it isn't, return. */ - zone = icaltimezone_get_builtin_timezone_from_tzid (tzid); - if (!zone) - return; - } - - /* Convert it to a string and add it to the hash. */ - vtimezone_comp = icaltimezone_get_component (zone); - if (!vtimezone_comp) - return; - - vtimezone_as_string = icalcomponent_as_ical_string (vtimezone_comp); - - g_hash_table_insert (data->timezone_hash, (char*) tzid, - g_strdup (vtimezone_as_string)); -} - -/* This appends the value string to the GString given in data. */ -static void -append_timezone_string (gpointer key, gpointer value, gpointer data) -{ - GString *vcal_string = data; - - g_string_append (vcal_string, value); - g_free (value); -} - - -/* This simply frees the hash values. */ -static void -free_timezone_string (gpointer key, gpointer value, gpointer data) -{ - g_free (value); -} - - -/* This converts the VEVENT/VTODO to a string. If include_all_timezones is - TRUE, it includes all the VTIMEZONE components needed for the VEVENT/VTODO. - If not, it only includes builtin timezones that may not be on the server. - - To do that we check every TZID in the component to see if it is a builtin - timezone. If it is, we see if it it in our cache. If it is in our cache, - then we know the server already has it and we don't need to send it. - If it isn't in our cache, then we need to send it to the server. - If we need to send any timezones to the server, then we have to create a - complete VCALENDAR object, otherwise we can just send a single VEVENT/VTODO - as before. */ -static char* -cal_client_get_component_as_string_internal (CalClient *client, - icalcomponent *icalcomp, - gboolean include_all_timezones) -{ - GHashTable *timezone_hash; - GString *vcal_string; - int initial_vcal_string_len; - ForeachTZIDCallbackData cbdata; - char *obj_string; - CalClientPrivate *priv; - - priv = client->priv; - - timezone_hash = g_hash_table_new (g_str_hash, g_str_equal); - - /* Add any timezones needed to the hash. We use a hash since we only - want to add each timezone once at most. */ - cbdata.client = client; - cbdata.timezone_hash = timezone_hash; - cbdata.include_all_timezones = include_all_timezones; - cbdata.success = TRUE; - icalcomponent_foreach_tzid (icalcomp, foreach_tzid_callback, &cbdata); - if (!cbdata.success) { - g_hash_table_foreach (timezone_hash, free_timezone_string, - NULL); - return NULL; - } - - /* Create the start of a VCALENDAR, to add the VTIMEZONES to, - and remember its length so we know if any VTIMEZONEs get added. */ - vcal_string = g_string_new (NULL); - g_string_append (vcal_string, - "BEGIN:VCALENDAR\n" - "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" - "VERSION:2.0\n" - "METHOD:PUBLISH\n"); - initial_vcal_string_len = vcal_string->len; - - /* Now concatenate all the timezone strings. This also frees the - timezone strings as it goes. */ - g_hash_table_foreach (timezone_hash, append_timezone_string, - vcal_string); - - /* Get the string for the VEVENT/VTODO. */ - obj_string = g_strdup (icalcomponent_as_ical_string (icalcomp)); - - /* If there were any timezones to send, create a complete VCALENDAR, - else just send the VEVENT/VTODO string. */ - if (!include_all_timezones - && vcal_string->len == initial_vcal_string_len) { - g_string_free (vcal_string, TRUE); - } else { - g_string_append (vcal_string, obj_string); - g_string_append (vcal_string, "END:VCALENDAR\n"); - g_free (obj_string); - obj_string = vcal_string->str; - g_string_free (vcal_string, FALSE); - } - - g_hash_table_destroy (timezone_hash); - - return obj_string; -} - -/** - * cal_client_get_component_as_string: - * @client: A calendar client. - * @icalcomp: A calendar component object. - * - * Gets a calendar component as an iCalendar string, with a toplevel - * VCALENDAR component and all VTIMEZONEs needed for the component. - * - * Return value: the component as a complete iCalendar string, or NULL on - * failure. The string should be freed after use. - **/ -char* -cal_client_get_component_as_string (CalClient *client, icalcomponent *icalcomp) -{ - return cal_client_get_component_as_string_internal (client, icalcomp, TRUE); -} - -gboolean -cal_client_create_object (CalClient *client, icalcomponent *icalcomp, char **uid, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_createObject (priv->cal, icalcomponent_as_ical_string (icalcomp), &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - if (uid) - *uid = our_op->uid; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -gboolean -cal_client_modify_object (CalClient *client, icalcomponent *icalcomp, CalObjModType mod, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - g_return_val_if_fail (icalcomp != NULL, FALSE); - - priv = client->priv; - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_modifyObject (priv->cal, icalcomponent_as_ical_string (icalcomp), mod, &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -gboolean -cal_client_remove_object_with_mod (CalClient *client, const char *uid, - const char *rid, CalObjModType mod, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_removeObject (priv->cal, uid, rid ? rid : "", mod, &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -/** - * cal_client_remove_object: - * @client: A calendar client. - * @uid: Unique identifier of the calendar component to remove. - * - * Asks a calendar to remove a component. If the server is able to remove the - * component, all clients will be notified and they will emit the "obj_removed" - * signal. - * - * Return value: a #CalClientResult value indicating the result of the - * operation. - **/ -gboolean -cal_client_remove_object (CalClient *client, const char *uid, GError **error) -{ - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - return cal_client_remove_object_with_mod (client, uid, NULL, CALOBJ_MOD_ALL, error); -} - -gboolean -cal_client_receive_objects (CalClient *client, icalcomponent *icalcomp, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_receiveObjects (priv->cal, icalcomponent_as_ical_string (icalcomp), &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -gboolean -cal_client_send_objects (CalClient *client, icalcomponent *icalcomp, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - - priv = client->priv; - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_sendObjects (priv->cal, icalcomponent_as_ical_string (icalcomp), &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -gboolean -cal_client_get_timezone (CalClient *client, const char *tzid, icaltimezone **zone, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - icalcomponent *icalcomp; - - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - g_return_val_if_fail (tzid != NULL, FALSE); - - priv = client->priv; - - e_mutex_lock (priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (priv->mutex); - - /* Check for well known zones and in the cache */ - *zone = NULL; - - /* If tzid is NULL or "" we return NULL, since it is a 'local time'. */ - if (!tzid || !tzid[0]) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_OK, error); - } - - /* If it is UTC, we return the special UTC timezone. */ - if (!strcmp (tzid, "UTC")) { - *zone = icaltimezone_get_utc_timezone (); - } else { - /* See if we already have it in the cache. */ - *zone = g_hash_table_lookup (priv->timezones, tzid); - } - - if (*zone) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_OK, error); - } - - /* call the backend */ - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_getTimezone (priv->cal, tzid, &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - - icalcomp = icalparser_parse_string (our_op->string); - g_free (our_op->string); - - /* FIXME Invalid object status? */ - if (!icalcomp) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_OBJECT_NOT_FOUND, error); - } - - *zone = icaltimezone_new (); - if (!icaltimezone_set_component (*zone, icalcomp)) { - icaltimezone_free (*zone, 1); - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_OBJECT_NOT_FOUND, error); - } - - /* Now add it to the cache, to avoid the server call in future. */ - g_hash_table_insert (priv->timezones, icaltimezone_get_tzid (*zone), *zone); - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -/** - * cal_client_add_timezone - * @client: A calendar client. - * @izone: The timezone to add. - * @error: Placeholder for error information. - * - * Add a VTIMEZONE object to the given calendar. - * - * Returns: TRUE if successful, FALSE otherwise. - */ -gboolean -cal_client_add_timezone (CalClient *client, icaltimezone *izone, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - const char *tzobj; - - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - g_return_val_if_fail (izone != NULL, FALSE); - - priv = client->priv; - - e_mutex_lock (priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (priv->mutex); - - /* convert icaltimezone into a string */ - tzobj = icalcomponent_as_ical_string (icaltimezone_get_component (izone)); - - /* call the backend */ - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_addTimezone (priv->cal, tzobj, &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -/** - * cal_client_get_query: - * @client: A calendar client. - * @sexp: S-expression representing the query. - * - * Creates a live query object from a loaded calendar. - * - * Return value: A query object that will emit notification signals as calendar - * components are added and removed from the query in the server. - **/ -gboolean -cal_client_get_query (CalClient *client, const char *sexp, CalQuery **query, GError **error) -{ - CORBA_Environment ev; - ECalendarOp *our_op; - ECalendarStatus status; - - g_return_val_if_fail (client != NULL, E_CALENDAR_STATUS_INVALID_ARG); - g_return_val_if_fail (IS_CAL_CLIENT (client), E_CALENDAR_STATUS_INVALID_ARG); - g_return_val_if_fail (query != NULL, E_CALENDAR_STATUS_INVALID_ARG); - - e_mutex_lock (client->priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (client->priv->mutex); - - CORBA_exception_init (&ev); - - our_op->listener = query_listener_new (); - GNOME_Evolution_Calendar_Cal_getQuery (client->priv->cal, sexp, BONOBO_OBJREF (our_op->listener), &ev); - - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - *query = our_op->query; - - bonobo_object_unref (BONOBO_OBJECT (our_op->listener)); - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - - -/* This ensures that the given timezone is on the server. We use this to pass - the default timezone to the server, so it can resolve DATE and floating - DATE-TIME values into specific times. (Most of our IDL interface uses - time_t values to pass specific times from the server to the client.) */ -static gboolean -cal_client_ensure_timezone_on_server (CalClient *client, icaltimezone *zone, GError **error) -{ - CalClientPrivate *priv; - char *tzid; - icaltimezone *tmp_zone; - - priv = client->priv; - - /* FIXME This is highly broken since there is no locking */ - - /* If the zone is NULL or UTC we don't need to do anything. */ - if (!zone) - return TRUE; - - tzid = icaltimezone_get_tzid (zone); - - if (!strcmp (tzid, "UTC")) - return TRUE; - - /* See if we already have it in the cache. If we do, it must be on - the server already. */ - tmp_zone = g_hash_table_lookup (priv->timezones, tzid); - if (tmp_zone) - return TRUE; - - /* Now we have to send it to the server, in case it doesn't already - have it. */ - return cal_client_add_timezone (client, zone, error); -} - -gboolean -cal_client_set_default_timezone (CalClient *client, icaltimezone *zone, GError **error) -{ - CalClientPrivate *priv; - CORBA_Environment ev; - ECalendarStatus status; - ECalendarOp *our_op; - const char *tzid; - - g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE); - g_return_val_if_fail (zone != NULL, FALSE); - - priv = client->priv; - - /* Make sure the server has the VTIMEZONE data. */ - if (!cal_client_ensure_timezone_on_server (client, zone, error)) - return FALSE; - - e_mutex_lock (priv->mutex); - - if (client->priv->load_state != CAL_CLIENT_LOAD_LOADED) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_URI_NOT_LOADED, error); - } - - if (client->priv->current_op != NULL) { - e_mutex_unlock (client->priv->mutex); - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_BUSY, error); - } - - our_op = e_calendar_new_op (client); - - e_mutex_lock (our_op->mutex); - - e_mutex_unlock (priv->mutex); - - /* FIXME Adding it to the server to change the tzid */ - tzid = icaltimezone_get_tzid (zone); - - /* call the backend */ - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Cal_setDefaultTimezone (priv->cal, tzid, &ev); - if (BONOBO_EX (&ev)) { - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - CORBA_exception_free (&ev); - - g_warning (G_STRLOC ": Unable to contact backend"); - - E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_CORBA_EXCEPTION, error); - } - - CORBA_exception_free (&ev); - - /* wait for something to happen (both cancellation and a - successful response will notity us via our cv */ - e_mutex_cond_wait (&our_op->cond, our_op->mutex); - - status = our_op->status; - - e_calendar_remove_op (client, our_op); - e_mutex_unlock (our_op->mutex); - e_calendar_free_op (our_op); - - E_CALENDAR_CHECK_STATUS (status, error); -} - -/** - * cal_client_get_error_message - * @status: A status code. - * - * Get an error message for the given status code. - * - * Returns: the error message. - */ -const char * -cal_client_get_error_message (ECalendarStatus status) -{ - switch (status) { - case E_CALENDAR_STATUS_INVALID_ARG : - return _("Invalid argument"); - case E_CALENDAR_STATUS_BUSY : - return _("Backend is busy"); - case E_CALENDAR_STATUS_REPOSITORY_OFFLINE : - return _("Repository is offline"); - case E_CALENDAR_STATUS_NO_SUCH_CALENDAR : - return _("No such calendar"); - case E_CALENDAR_STATUS_OBJECT_NOT_FOUND : - return _("Object not found"); - case E_CALENDAR_STATUS_INVALID_OBJECT : - return _("Invalid object"); - case E_CALENDAR_STATUS_URI_NOT_LOADED : - return _("URI not loaded"); - case E_CALENDAR_STATUS_URI_ALREADY_LOADED : - return _("URI already loaded"); - case E_CALENDAR_STATUS_PERMISSION_DENIED : - return _("Permission denied"); - case E_CALENDAR_STATUS_CARD_NOT_FOUND : - return _("Object not found"); - case E_CALENDAR_STATUS_CARD_ID_ALREADY_EXISTS : - return _("Object ID already exists"); - case E_CALENDAR_STATUS_PROTOCOL_NOT_SUPPORTED : - return _("Protocol not supported"); - case E_CALENDAR_STATUS_CANCELLED : - return _("Operation has been cancelled"); - case E_CALENDAR_STATUS_COULD_NOT_CANCEL : - return _("Could not cancel operation"); - case E_CALENDAR_STATUS_AUTHENTICATION_FAILED : - return _("Authentication failed"); - case E_CALENDAR_STATUS_AUTHENTICATION_REQUIRED : - return _("Authentication required"); - case E_CALENDAR_STATUS_CORBA_EXCEPTION : - return _("A CORBA esception has occurred"); - case E_CALENDAR_STATUS_OTHER_ERROR : - return _("Unknown error"); - case E_CALENDAR_STATUS_OK : - return _("No error"); - } - - return NULL; -} diff --git a/calendar/cal-client/cal-client.h b/calendar/cal-client/cal-client.h deleted file mode 100644 index 9491c73fa3..0000000000 --- a/calendar/cal-client/cal-client.h +++ /dev/null @@ -1,212 +0,0 @@ -/* Evolution calendar client - * - * Copyright (C) 2001 Ximian, Inc. - * - * Author: Federico Mena-Quintero <federico@ximian.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. - */ - -#ifndef CAL_CLIENT_H -#define CAL_CLIENT_H - -#include <glib-object.h> -#include <cal-util/cal-recur.h> -#include <cal-util/cal-util.h> -#include <cal-client/cal-query.h> -#include "cal-client-types.h" - -G_BEGIN_DECLS - - - -#define CAL_CLIENT_TYPE (cal_client_get_type ()) -#define CAL_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CAL_CLIENT_TYPE, CalClient)) -#define CAL_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CAL_CLIENT_TYPE, CalClientClass)) -#define IS_CAL_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CAL_CLIENT_TYPE)) -#define IS_CAL_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CAL_CLIENT_TYPE)) - -#define CAL_CLIENT_OPEN_STATUS_ENUM_TYPE (cal_client_open_status_enum_get_type ()) -#define CAL_CLIENT_REMOVE_STATUS_ENUM_TYPE (cal_client_remove_status_enum_get_type ()) -#define CAL_CLIENT_SET_MODE_STATUS_ENUM_TYPE (cal_client_set_mode_status_enum_get_type ()) -#define CAL_MODE_ENUM_TYPE (cal_mode_enum_get_type ()) - -typedef struct _CalClientClass CalClientClass; - -typedef struct _CalClientPrivate CalClientPrivate; - -/* Open status for the cal_opened signal */ -typedef enum { - CAL_CLIENT_OPEN_SUCCESS, - CAL_CLIENT_OPEN_ERROR, - CAL_CLIENT_OPEN_NOT_FOUND, - CAL_CLIENT_OPEN_PERMISSION_DENIED, - CAL_CLIENT_OPEN_METHOD_NOT_SUPPORTED -} CalClientOpenStatus; - -/* Set mode status for the cal_client_set_mode function */ -typedef enum { - CAL_CLIENT_SET_MODE_SUCCESS, - CAL_CLIENT_SET_MODE_ERROR, - CAL_CLIENT_SET_MODE_NOT_SUPPORTED -} CalClientSetModeStatus; - -/* Get status for the cal_client_get_object() function */ -typedef enum { - CAL_CLIENT_GET_SUCCESS, - CAL_CLIENT_GET_NOT_FOUND, - CAL_CLIENT_GET_SYNTAX_ERROR -} CalClientGetStatus; - -/* Status for update_object(s) and remove_object */ -typedef enum { - CAL_CLIENT_RESULT_SUCCESS, - CAL_CLIENT_RESULT_CORBA_ERROR, - CAL_CLIENT_RESULT_INVALID_OBJECT, - CAL_CLIENT_RESULT_NOT_FOUND, - CAL_CLIENT_RESULT_PERMISSION_DENIED -} CalClientResult; - -/* Whether the client is not loaded, is being loaded, or is already loaded */ -typedef enum { - CAL_CLIENT_LOAD_NOT_LOADED, - CAL_CLIENT_LOAD_LOADING, - CAL_CLIENT_LOAD_LOADED -} CalClientLoadState; - -struct _CalClient { - GObject object; - - /* Private data */ - CalClientPrivate *priv; -}; - -struct _CalClientClass { - GObjectClass parent_class; - - /* Notification signals */ - - void (* cal_opened) (CalClient *client, CalClientOpenStatus status); - void (* cal_set_mode) (CalClient *client, CalClientSetModeStatus status, CalMode mode); - - void (* backend_error) (CalClient *client, const char *message); - - void (* categories_changed) (CalClient *client, GPtrArray *categories); - - void (* forget_password) (CalClient *client, const char *key); - - void (* backend_died) (CalClient *client); -}; - -typedef gchar * (* CalClientAuthFunc) (CalClient *client, - const gchar *prompt, - const gchar *key, - gpointer user_data); - -GType cal_client_get_type (void); - -GType cal_client_open_status_enum_get_type (void); -GType cal_client_set_mode_status_enum_get_type (void); -GType cal_mode_enum_get_type (void); - -CalClient *cal_client_new (const char *uri, CalObjType type); - -void cal_client_set_auth_func (CalClient *client, CalClientAuthFunc func, gpointer data); - -gboolean cal_client_open (CalClient *client, gboolean only_if_exists, GError **error); -void cal_client_open_async (CalClient *client, gboolean only_if_exists); -gboolean cal_client_remove_calendar (CalClient *client, GError **error); - -GList *cal_client_uri_list (CalClient *client, CalMode mode); - -CalClientLoadState cal_client_get_load_state (CalClient *client); - -const char *cal_client_get_uri (CalClient *client); - -gboolean cal_client_is_read_only (CalClient *client, gboolean *read_only, GError **error); -gboolean cal_client_get_cal_address (CalClient *client, char **cal_address, GError **error); -gboolean cal_client_get_alarm_email_address (CalClient *client, char **alarm_address, GError **error); -gboolean cal_client_get_ldap_attribute (CalClient *client, char **ldap_attribute, GError **error); - -gboolean cal_client_get_one_alarm_only (CalClient *client); -gboolean cal_client_get_organizer_must_attend (CalClient *client); -gboolean cal_client_get_save_schedules (CalClient *client); -gboolean cal_client_get_static_capability (CalClient *client, const char *cap); - -gboolean cal_client_set_mode (CalClient *client, CalMode mode); - -gboolean cal_client_get_default_object (CalClient *client, - icalcomponent **icalcomp, GError **error); - -gboolean cal_client_get_object (CalClient *client, - const char *uid, - const char *rid, - icalcomponent **icalcomp, - GError **error); - -gboolean cal_client_get_changes (CalClient *client, const char *change_id, GList **changes, GError **error); - -gboolean cal_client_get_object_list (CalClient *client, const char *query, GList **objects, GError **error); -gboolean cal_client_get_object_list_as_comp (CalClient *client, const char *query, GList **objects, GError **error); -void cal_client_free_object_list (GList *objects); - -gboolean cal_client_get_free_busy (CalClient *client, GList *users, time_t start, time_t end, - GList **freebusy, GError **error); - -void cal_client_generate_instances (CalClient *client, CalObjType type, - time_t start, time_t end, - CalRecurInstanceFn cb, gpointer cb_data); - -GSList *cal_client_get_alarms_in_range (CalClient *client, time_t start, time_t end); - -void cal_client_free_alarms (GSList *comp_alarms); - -gboolean cal_client_get_alarms_for_object (CalClient *client, const char *uid, - time_t start, time_t end, - CalComponentAlarms **alarms); - -gboolean cal_client_create_object (CalClient *client, icalcomponent *icalcomp, char **uid, GError **error); -gboolean cal_client_modify_object (CalClient *client, icalcomponent *icalcomp, CalObjModType mod, GError **error); -gboolean cal_client_remove_object (CalClient *client, const char *uid, GError **error); -gboolean cal_client_remove_object_with_mod (CalClient *client, const char *uid, const char *rid, CalObjModType mod, GError **error); - -gboolean cal_client_discard_alarm (CalClient *client, CalComponent *comp, const char *auid, GError **error); - -gboolean cal_client_receive_objects (CalClient *client, icalcomponent *icalcomp, GError **error); -gboolean cal_client_send_objects (CalClient *client, icalcomponent *icalcomp, GError **error); - -gboolean cal_client_get_timezone (CalClient *client, const char *tzid, icaltimezone **zone, GError **error); -gboolean cal_client_add_timezone (CalClient *client, icaltimezone *izone, GError **error); -/* Sets the default timezone to use to resolve DATE and floating DATE-TIME - values. This will typically be from the user's timezone setting. Call this - before using any other functions. It will pass the default timezone on to - the server. Returns TRUE on success. */ -gboolean cal_client_set_default_timezone (CalClient *client, icaltimezone *zone, GError **error); - -gboolean cal_client_get_query (CalClient *client, const char *sexp, CalQuery **query, GError **error); - -/* Resolves TZIDs for the recurrence generator. */ -icaltimezone *cal_client_resolve_tzid_cb (const char *tzid, gpointer data); - -/* Returns a complete VCALENDAR for a VEVENT/VTODO including all VTIMEZONEs - used by the component. It also includes a 'METHOD:PUBLISH' property. */ -char* cal_client_get_component_as_string (CalClient *client, icalcomponent *icalcomp); - -const char * cal_client_get_error_message (ECalendarStatus status); - - - -G_END_DECLS - -#endif diff --git a/calendar/cal-client/cal-listener.c b/calendar/cal-client/cal-listener.c deleted file mode 100644 index ac04be7c07..0000000000 --- a/calendar/cal-client/cal-listener.c +++ /dev/null @@ -1,1025 +0,0 @@ -/* Evolution calendar listener - * - * Copyright (C) 2001 Ximian, Inc. - * - * Author: Federico Mena-Quintero <federico@ximian.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 <config.h> - -#include <bonobo/bonobo-main.h> -#include "cal-marshal.h" -#include "cal-listener.h" - - - -/* Private part of the CalListener structure */ -struct CalListenerPrivate { - /* Notification functions and their closure data */ - CalListenerCalSetModeFn cal_set_mode_fn; - CalListenerErrorOccurredFn error_occurred_fn; - CalListenerCategoriesChangedFn categories_changed_fn; - gpointer fn_data; - - /* Whether notification is desired */ - gboolean notify : 1; -}; - -/* Signal IDs */ -enum { - READ_ONLY, - CAL_ADDRESS, - ALARM_ADDRESS, - LDAP_ATTRIBUTE, - STATIC_CAPABILITIES, - OPEN, - REMOVE, - CREATE_OBJECT, - MODIFY_OBJECT, - REMOVE_OBJECT, - DISCARD_ALARM, - RECEIVE_OBJECTS, - SEND_OBJECTS, - DEFAULT_OBJECT, - OBJECT, - OBJECT_LIST, - GET_TIMEZONE, - ADD_TIMEZONE, - SET_DEFAULT_TIMEZONE, - GET_CHANGES, - GET_FREE_BUSY, - QUERY, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -static BonoboObjectClass *parent_class; - -static ECalendarStatus -convert_status (const GNOME_Evolution_Calendar_CallStatus status) -{ - switch (status) { - case GNOME_Evolution_Calendar_Success: - return E_CALENDAR_STATUS_OK; - case GNOME_Evolution_Calendar_RepositoryOffline: - return E_CALENDAR_STATUS_REPOSITORY_OFFLINE; - case GNOME_Evolution_Calendar_PermissionDenied: - return E_CALENDAR_STATUS_PERMISSION_DENIED; - case GNOME_Evolution_Calendar_ObjectNotFound: - return E_CALENDAR_STATUS_OBJECT_NOT_FOUND; - case GNOME_Evolution_Calendar_InvalidObject: - return E_CALENDAR_STATUS_INVALID_OBJECT; - case GNOME_Evolution_Calendar_CardIdAlreadyExists: - return E_CALENDAR_STATUS_CARD_ID_ALREADY_EXISTS; - case GNOME_Evolution_Calendar_AuthenticationFailed: - return E_CALENDAR_STATUS_AUTHENTICATION_FAILED; - case GNOME_Evolution_Calendar_AuthenticationRequired: - return E_CALENDAR_STATUS_AUTHENTICATION_REQUIRED; - case GNOME_Evolution_Calendar_OtherError: - default: - return E_CALENDAR_STATUS_OTHER_ERROR; - } -} - -static void -impl_notifyReadOnly (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CallStatus status, - const CORBA_boolean read_only, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[READ_ONLY], 0, convert_status (status), read_only); -} - -static void -impl_notifyCalAddress (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CallStatus status, - const CORBA_char *address, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[CAL_ADDRESS], 0, convert_status (status), address); -} - -static void -impl_notifyAlarmEmailAddress (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CallStatus status, - const CORBA_char *address, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[ALARM_ADDRESS], 0, convert_status (status), address); -} - -static void -impl_notifyLDAPAttribute (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CallStatus status, - const CORBA_char *ldap_attribute, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[LDAP_ATTRIBUTE], 0, convert_status (status), ldap_attribute); -} - -static void -impl_notifyStaticCapabilities (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CallStatus status, - const CORBA_char *capabilities, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[STATIC_CAPABILITIES], 0, convert_status (status)); -} - -/* ::notifyCalOpened method */ -static void -impl_notifyCalOpened (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CallStatus status, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[OPEN], 0, convert_status (status)); -} - -static void -impl_notifyCalRemoved (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CallStatus status, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[REMOVE], 0, convert_status (status)); -} - -static void -impl_notifyObjectCreated (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CallStatus status, - const CORBA_char *uid, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[CREATE_OBJECT], 0, convert_status (status), uid); -} - -static void -impl_notifyObjectModified (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CallStatus status, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[MODIFY_OBJECT], 0, convert_status (status)); -} - -static void -impl_notifyObjectRemoved (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CallStatus status, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[REMOVE_OBJECT], 0, convert_status (status)); -} - -static void -impl_notifyAlarmDiscarded (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CallStatus status, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[DISCARD_ALARM], 0, convert_status (status)); -} - -static void -impl_notifyObjectsReceived (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CallStatus status, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[RECEIVE_OBJECTS], 0, convert_status (status)); -} - -static void -impl_notifyObjectsSent (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CallStatus status, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[SEND_OBJECTS], 0, convert_status (status)); -} - -static void -impl_notifyDefaultObjectRequested (PortableServer_Servant servant, - const GNOME_Evolution_Calendar_CallStatus status, - const CORBA_char *object, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[DEFAULT_OBJECT], 0, convert_status (status), object); -} - -static void -impl_notifyObjectRequested (PortableServer_Servant servant, - const GNOME_Evolution_Calendar_CallStatus status, - const CORBA_char *object, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[OBJECT], 0, convert_status (status), object); -} - -static GList * -build_object_list (const GNOME_Evolution_Calendar_stringlist *seq) -{ - GList *list; - int i; - - list = NULL; - for (i = 0; i < seq->_length; i++) { - icalcomponent *comp; - - comp = icalcomponent_new_from_string (seq->_buffer[i]); - if (!comp) - continue; - - list = g_list_prepend (list, comp); - } - - return list; -} - -static void -impl_notifyObjectListRequested (PortableServer_Servant servant, - const GNOME_Evolution_Calendar_CallStatus status, - const GNOME_Evolution_Calendar_stringlist *objects, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - GList *object_list, *l; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - object_list = build_object_list (objects); - - g_signal_emit (G_OBJECT (listener), signals[OBJECT_LIST], 0, convert_status (status), object_list); - - for (l = object_list; l; l = l->next) - icalcomponent_free (l->data); - g_list_free (object_list); -} - -static void -impl_notifyTimezoneRequested (PortableServer_Servant servant, - const GNOME_Evolution_Calendar_CallStatus status, - const CORBA_char *object, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[GET_TIMEZONE], 0, convert_status (status), object); -} - -static void -impl_notifyTimezoneAdded (PortableServer_Servant servant, - const GNOME_Evolution_Calendar_CallStatus status, - const CORBA_char *tzid, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[ADD_TIMEZONE], 0, convert_status (status), tzid); -} - -static void -impl_notifyDefaultTimezoneSet (PortableServer_Servant servant, - const GNOME_Evolution_Calendar_CallStatus status, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[SET_DEFAULT_TIMEZONE], 0, convert_status (status)); -} - -static GList * -build_change_list (const GNOME_Evolution_Calendar_CalObjChangeSeq *seq) -{ - GList *list = NULL; - icalcomponent *icalcomp; - int i; - - /* Create the list in reverse order */ - for (i = 0; i < seq->_length; i++) { - GNOME_Evolution_Calendar_CalObjChange *corba_coc; - CalClientChange *ccc; - - corba_coc = &seq->_buffer[i]; - ccc = g_new (CalClientChange, 1); - - icalcomp = icalparser_parse_string (corba_coc->calobj); - if (!icalcomp) - continue; - - ccc->comp = cal_component_new (); - if (!cal_component_set_icalcomponent (ccc->comp, icalcomp)) { - icalcomponent_free (icalcomp); - g_object_unref (G_OBJECT (ccc->comp)); - continue; - } - ccc->type = corba_coc->type; - - list = g_list_prepend (list, ccc); - } - - list = g_list_reverse (list); - - return list; -} - -static void -impl_notifyChanges (PortableServer_Servant servant, - const GNOME_Evolution_Calendar_CallStatus status, - const GNOME_Evolution_Calendar_CalObjChangeSeq *seq, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - GList *changes, *l; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - changes = build_change_list (seq); - - g_signal_emit (G_OBJECT (listener), signals[GET_CHANGES], 0, convert_status (status), changes); - - for (l = changes; l; l = l->next) - g_free (l->data); - g_list_free (changes); -} - -static GList * -build_free_busy_list (const GNOME_Evolution_Calendar_CalObjSeq *seq) -{ - GList *list = NULL; - int i; - - /* Create the list in reverse order */ - for (i = 0; i < seq->_length; i++) { - CalComponent *comp; - icalcomponent *icalcomp; - icalcomponent_kind kind; - - icalcomp = icalcomponent_new_from_string (seq->_buffer[i]); - if (!icalcomp) - continue; - - kind = icalcomponent_isa (icalcomp); - if (kind == ICAL_VFREEBUSY_COMPONENT) { - comp = cal_component_new (); - if (!cal_component_set_icalcomponent (comp, icalcomp)) { - icalcomponent_free (icalcomp); - g_object_unref (G_OBJECT (comp)); - continue; - } - - list = g_list_append (list, comp); - } else { - icalcomponent_free (icalcomp); - } - } - - return list; -} - -static void -impl_notifyFreeBusy (PortableServer_Servant servant, - const GNOME_Evolution_Calendar_CallStatus status, - const GNOME_Evolution_Calendar_CalObjSeq *seq, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - GList *freebusy, *l; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - freebusy = build_free_busy_list (seq); - - g_signal_emit (G_OBJECT (listener), signals[GET_FREE_BUSY], 0, convert_status (status), freebusy); - - for (l = freebusy; l; l = l->next) - g_free (l->data); - g_list_free (freebusy); -} - -static void -impl_notifyQuery (PortableServer_Servant servant, - const GNOME_Evolution_Calendar_CallStatus status, - const GNOME_Evolution_Calendar_Query query, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_signal_emit (G_OBJECT (listener), signals[QUERY], 0, convert_status (status), query); -} - -/* ::notifyCalSetMode method */ -static void -impl_notifyCalSetMode (PortableServer_Servant servant, - GNOME_Evolution_Calendar_Listener_SetModeStatus status, - GNOME_Evolution_Calendar_CalMode mode, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_message ("notify_set_mode"); - - g_assert (priv->cal_set_mode_fn != NULL); - (* priv->cal_set_mode_fn) (listener, status, mode, priv->fn_data); -} - - -/* ::notifyErrorOccurred method */ -static void -impl_notifyErrorOccurred (PortableServer_Servant servant, - const CORBA_char *message, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_message ("notify_error"); - - g_assert (priv->error_occurred_fn != NULL); - (* priv->error_occurred_fn) (listener, message, priv->fn_data); -} - -/* ::notifyCategoriesChanged method */ -static void -impl_notifyCategoriesChanged (PortableServer_Servant servant, - const GNOME_Evolution_Calendar_StringSeq *categories, - CORBA_Environment *ev) -{ - CalListener *listener; - CalListenerPrivate *priv; - - listener = CAL_LISTENER (bonobo_object_from_servant (servant)); - priv = listener->priv; - - if (!priv->notify) - return; - - g_message ("notify_categories"); - - g_assert (priv->categories_changed_fn != NULL); - (* priv->categories_changed_fn) (listener, categories, priv->fn_data); -} - - - -/* Object initialization function for the calendar listener */ -static void -cal_listener_init (CalListener *listener, CalListenerClass *klass) -{ - CalListenerPrivate *priv; - - priv = g_new0 (CalListenerPrivate, 1); - listener->priv = priv; - - priv->error_occurred_fn = NULL; - priv->categories_changed_fn = NULL; - - priv->notify = TRUE; -} - -/* Finalize handler for the calendar listener */ -static void -cal_listener_finalize (GObject *object) -{ - CalListener *listener; - CalListenerPrivate *priv; - - g_return_if_fail (object != NULL); - g_return_if_fail (IS_CAL_LISTENER (object)); - - listener = CAL_LISTENER (object); - priv = listener->priv; - - priv->error_occurred_fn = NULL; - priv->categories_changed_fn = NULL; - priv->fn_data = NULL; - - priv->notify = FALSE; - - g_free (priv); - listener->priv = NULL; - - if (G_OBJECT_CLASS (parent_class)->finalize) - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - -/* Class initialization function for the calendar listener */ -static void -cal_listener_class_init (CalListenerClass *klass) -{ - GObjectClass *object_class; - - object_class = (GObjectClass *) klass; - - parent_class = g_type_class_peek_parent (klass); - - klass->epv.notifyReadOnly = impl_notifyReadOnly; - klass->epv.notifyCalAddress = impl_notifyCalAddress; - klass->epv.notifyAlarmEmailAddress = impl_notifyAlarmEmailAddress; - klass->epv.notifyLDAPAttribute = impl_notifyLDAPAttribute; - klass->epv.notifyStaticCapabilities = impl_notifyStaticCapabilities; - klass->epv.notifyCalOpened = impl_notifyCalOpened; - klass->epv.notifyCalRemoved = impl_notifyCalRemoved; - klass->epv.notifyObjectCreated = impl_notifyObjectCreated; - klass->epv.notifyObjectModified = impl_notifyObjectModified; - klass->epv.notifyObjectRemoved = impl_notifyObjectRemoved; - klass->epv.notifyAlarmDiscarded = impl_notifyAlarmDiscarded; - klass->epv.notifyObjectsReceived = impl_notifyObjectsReceived; - klass->epv.notifyObjectsSent = impl_notifyObjectsSent; - klass->epv.notifyDefaultObjectRequested = impl_notifyDefaultObjectRequested; - klass->epv.notifyObjectRequested = impl_notifyObjectRequested; - klass->epv.notifyObjectListRequested = impl_notifyObjectListRequested; - klass->epv.notifyTimezoneRequested = impl_notifyTimezoneRequested; - klass->epv.notifyTimezoneAdded = impl_notifyTimezoneAdded; - klass->epv.notifyDefaultTimezoneSet = impl_notifyDefaultTimezoneSet; - klass->epv.notifyChanges = impl_notifyChanges; - klass->epv.notifyFreeBusy = impl_notifyFreeBusy; - klass->epv.notifyQuery = impl_notifyQuery; - klass->epv.notifyCalSetMode = impl_notifyCalSetMode; - klass->epv.notifyErrorOccurred = impl_notifyErrorOccurred; - klass->epv.notifyCategoriesChanged = impl_notifyCategoriesChanged; - - object_class->finalize = cal_listener_finalize; - - signals[READ_ONLY] = - g_signal_new ("read_only", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, read_only), - NULL, NULL, - cal_marshal_VOID__INT_BOOLEAN, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_BOOLEAN); - signals[CAL_ADDRESS] = - g_signal_new ("cal_address", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, cal_address), - NULL, NULL, - cal_marshal_VOID__INT_STRING, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING); - signals[ALARM_ADDRESS] = - g_signal_new ("alarm_address", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, alarm_address), - NULL, NULL, - cal_marshal_VOID__INT_STRING, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING); - signals[LDAP_ATTRIBUTE] = - g_signal_new ("ldap_attribute", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, ldap_attribute), - NULL, NULL, - cal_marshal_VOID__INT_STRING, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING); - signals[STATIC_CAPABILITIES] = - g_signal_new ("static_capabilities", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, static_capabilities), - NULL, NULL, - cal_marshal_VOID__INT_STRING, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING); - signals[OPEN] = - g_signal_new ("open", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, open), - NULL, NULL, - cal_marshal_VOID__INT, - G_TYPE_NONE, 1, G_TYPE_INT); - signals[REMOVE] = - g_signal_new ("remove", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, remove), - NULL, NULL, - cal_marshal_VOID__INT, - G_TYPE_NONE, 1, G_TYPE_INT); - signals[CREATE_OBJECT] = - g_signal_new ("create_object", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, create_object), - NULL, NULL, - cal_marshal_VOID__INT_STRING, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING); - signals[MODIFY_OBJECT] = - g_signal_new ("modify_object", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, modify_object), - NULL, NULL, - cal_marshal_VOID__INT, - G_TYPE_NONE, 1, G_TYPE_INT); - signals[REMOVE_OBJECT] = - g_signal_new ("remove_object", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, remove_object), - NULL, NULL, - cal_marshal_VOID__INT, - G_TYPE_NONE, 1, G_TYPE_INT); - signals[DISCARD_ALARM] = - g_signal_new ("discard_alarm", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, discard_alarm), - NULL, NULL, - cal_marshal_VOID__INT, - G_TYPE_NONE, 1, G_TYPE_INT); - signals[RECEIVE_OBJECTS] = - g_signal_new ("receive_objects", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, receive_objects), - NULL, NULL, - cal_marshal_VOID__INT, - G_TYPE_NONE, 1, G_TYPE_INT); - signals[SEND_OBJECTS] = - g_signal_new ("send_objects", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, send_objects), - NULL, NULL, - cal_marshal_VOID__INT, - G_TYPE_NONE, 1, G_TYPE_INT); - signals[DEFAULT_OBJECT] = - g_signal_new ("default_object", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, default_object), - NULL, NULL, - cal_marshal_VOID__INT_STRING, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING); - signals[OBJECT] = - g_signal_new ("object", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, object), - NULL, NULL, - cal_marshal_VOID__INT_STRING, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING); - signals[OBJECT_LIST] = - g_signal_new ("object_list", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, object_list), - NULL, NULL, - cal_marshal_VOID__INT_POINTER, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_POINTER); - signals[GET_TIMEZONE] = - g_signal_new ("get_timezone", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, get_timezone), - NULL, NULL, - cal_marshal_VOID__INT_STRING, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING); - signals[ADD_TIMEZONE] = - g_signal_new ("add_timezone", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, add_timezone), - NULL, NULL, - cal_marshal_VOID__INT_STRING, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING); - signals[SET_DEFAULT_TIMEZONE] = - g_signal_new ("set_default_timezone", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, set_default_timezone), - NULL, NULL, - cal_marshal_VOID__INT, - G_TYPE_NONE, 1, G_TYPE_INT); - signals[GET_CHANGES] = - g_signal_new ("get_changes", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, get_changes), - NULL, NULL, - cal_marshal_VOID__INT_POINTER, - G_TYPE_NONE, 1, G_TYPE_INT, G_TYPE_POINTER); - signals[GET_FREE_BUSY] = - g_signal_new ("get_free_busy", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, get_free_busy), - NULL, NULL, - cal_marshal_VOID__INT_POINTER, - G_TYPE_NONE, 1, G_TYPE_INT, G_TYPE_POINTER); - signals[QUERY] = - g_signal_new ("query", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CalListenerClass, query), - NULL, NULL, - cal_marshal_VOID__INT_POINTER, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_POINTER); -} - -BONOBO_TYPE_FUNC_FULL (CalListener, - GNOME_Evolution_Calendar_Listener, - BONOBO_TYPE_OBJECT, - cal_listener); - -/** - * cal_listener_construct: - * @listener: A calendar listener. - * @cal_opened_fn: Function that will be called to notify that a calendar was - * opened. - * @cal_removed_fn: Function that will be called to notify that a calendar was - * removed - * @error_occurred_fn: Function that will be called to notify errors. - * @categories_changed_fn: Function that will be called to notify that the list - * of categories that are present in the calendar's objects has changed. - * @fn_data: Closure data pointer that will be passed to the notification - * functions. - * - * Constructs a calendar listener by setting the callbacks that it will use for - * notification from the calendar server. - * - * Return value: the same object as the @listener argument. - **/ -CalListener * -cal_listener_construct (CalListener *listener, - CalListenerCalSetModeFn cal_set_mode_fn, - CalListenerErrorOccurredFn error_occurred_fn, - CalListenerCategoriesChangedFn categories_changed_fn, - gpointer fn_data) -{ - CalListenerPrivate *priv; - - g_return_val_if_fail (listener != NULL, NULL); - g_return_val_if_fail (IS_CAL_LISTENER (listener), NULL); - g_return_val_if_fail (cal_set_mode_fn != NULL, NULL); - g_return_val_if_fail (error_occurred_fn != NULL, NULL); - g_return_val_if_fail (categories_changed_fn != NULL, NULL); - - priv = listener->priv; - - priv->cal_set_mode_fn = cal_set_mode_fn; - priv->error_occurred_fn = error_occurred_fn; - priv->categories_changed_fn = categories_changed_fn; - priv->fn_data = fn_data; - - return listener; -} - -/** - * cal_listener_new: - * @cal_opened_fn: Function that will be called to notify that a calendar was - * opened. - * @error_occurred_fn: Function that will be called to notify errors. - * @categories_changed_fn: Function that will be called to notify that the list - * of categories that are present in the calendar's objects has changed. - * @fn_data: Closure data pointer that will be passed to the notification - * functions. - * - * Creates a new #CalListener object. - * - * Return value: A newly-created #CalListener object. - **/ -CalListener * -cal_listener_new (CalListenerCalSetModeFn cal_set_mode_fn, - CalListenerErrorOccurredFn error_occurred_fn, - CalListenerCategoriesChangedFn categories_changed_fn, - gpointer fn_data) -{ - CalListener *listener; - - g_return_val_if_fail (error_occurred_fn != NULL, NULL); - g_return_val_if_fail (categories_changed_fn != NULL, NULL); - - listener = g_object_new (CAL_LISTENER_TYPE, - "poa", bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_REQUEST, NULL), - NULL); - - return cal_listener_construct (listener, - cal_set_mode_fn, - error_occurred_fn, - categories_changed_fn, - fn_data); -} - -/** - * cal_listener_stop_notification: - * @listener: A calendar listener. - * - * Informs a calendar listener that no further notification is desired. The - * callbacks specified when the listener was created will no longer be invoked - * after this function is called. - **/ -void -cal_listener_stop_notification (CalListener *listener) -{ - CalListenerPrivate *priv; - - g_return_if_fail (listener != NULL); - g_return_if_fail (IS_CAL_LISTENER (listener)); - - priv = listener->priv; - g_return_if_fail (priv->notify != FALSE); - - priv->notify = FALSE; -} diff --git a/calendar/cal-client/cal-listener.h b/calendar/cal-client/cal-listener.h deleted file mode 100644 index 1230104999..0000000000 --- a/calendar/cal-client/cal-listener.h +++ /dev/null @@ -1,120 +0,0 @@ -/* Evolution calendar listener - * - * Copyright (C) 2001 Ximian, Inc. - * - * Author: Federico Mena-Quintero <federico@ximian.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. - */ - -#ifndef CAL_LISTENER_H -#define CAL_LISTENER_H - -#include <bonobo/bonobo-object.h> -#include "evolution-calendar.h" -#include "cal-client-types.h" - -G_BEGIN_DECLS - - - -#define CAL_LISTENER_TYPE (cal_listener_get_type ()) -#define CAL_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CAL_LISTENER_TYPE, CalListener)) -#define CAL_LISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CAL_LISTENER_TYPE, \ - CalListenerClass)) -#define IS_CAL_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CAL_LISTENER_TYPE)) -#define IS_CAL_LISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CAL_LISTENER_TYPE)) - -typedef struct CalListenerPrivate CalListenerPrivate; - -typedef struct { - BonoboObject xobject; - - /* Private data */ - CalListenerPrivate *priv; -} CalListener; - -typedef struct { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_Calendar_Listener__epv epv; - - /* Signals */ - void (*read_only) (CalListener *listener, ECalendarStatus status, gboolean read_only); - void (*cal_address) (CalListener *listener, ECalendarStatus status, const char *address); - void (*alarm_address) (CalListener *listener, ECalendarStatus status, const char *address); - void (*ldap_attribute) (CalListener *listener, ECalendarStatus status, const char *ldap_attribute); - void (*static_capabilities) (CalListener *listener, ECalendarStatus status, const char *capabilities); - - void (*open) (CalListener *listener, ECalendarStatus status); - void (*remove) (CalListener *listener, ECalendarStatus status); - - void (*create_object) (CalListener *listener, ECalendarStatus status, const char *id); - void (*modify_object) (CalListener *listener, ECalendarStatus status); - void (*remove_object) (CalListener *listener, ECalendarStatus status); - - void (*discard_alarm) (CalListener *listener, ECalendarStatus status); - - void (*receive_objects) (CalListener *listener, ECalendarStatus status); - void (*send_objects) (CalListener *listener, ECalendarStatus status); - - void (*default_object) (CalListener *listener, ECalendarStatus status, const char *object); - void (*object) (CalListener *listener, ECalendarStatus status, const char *object); - void (*object_list) (CalListener *listener, ECalendarStatus status, GList **objects); - - void (*get_timezone) (CalListener *listener, ECalendarStatus status, const char *object); - void (*add_timezone) (CalListener *listener, ECalendarStatus status, const char *tzid); - void (*set_default_timezone) (CalListener *listener, ECalendarStatus status, const char *tzid); - - void (*get_changes) (CalListener *listener, ECalendarStatus status, GList *changes); - void (*get_free_busy) (CalListener *listener, ECalendarStatus status, GList *freebusy); - - void (*query) (CalListener *listener, ECalendarStatus status, GNOME_Evolution_Calendar_Query query); -} CalListenerClass; - -/* Notification functions */ -typedef void (* CalListenerCalSetModeFn) (CalListener *listener, - GNOME_Evolution_Calendar_Listener_SetModeStatus status, - GNOME_Evolution_Calendar_CalMode mode, - gpointer data); - -typedef void (* CalListenerErrorOccurredFn) (CalListener *listener, - const char *message, - gpointer data); - -typedef void (* CalListenerCategoriesChangedFn) (CalListener *listener, - const GNOME_Evolution_Calendar_StringSeq *categories, - gpointer data); - - -GType cal_listener_get_type (void); - -CalListener *cal_listener_construct (CalListener *listener, - CalListenerCalSetModeFn cal_set_mode_fn, - CalListenerErrorOccurredFn error_occurred_fn, - CalListenerCategoriesChangedFn categories_changed_fn, - gpointer fn_data); - -CalListener *cal_listener_new (CalListenerCalSetModeFn cal_set_mode_fn, - CalListenerErrorOccurredFn error_occurred_fn, - CalListenerCategoriesChangedFn categories_changed_fn, - gpointer fn_data); - -void cal_listener_stop_notification (CalListener *listener); - - - -G_END_DECLS - -#endif diff --git a/calendar/cal-client/cal-marshal.list b/calendar/cal-client/cal-marshal.list deleted file mode 100644 index e0ca019669..0000000000 --- a/calendar/cal-client/cal-marshal.list +++ /dev/null @@ -1,6 +0,0 @@ -NONE:INT -NONE:POINTER -NONE:INT,STRING -NONE:INT,BOOL -NONE:INT,POINTER -NONE:STRING,INT diff --git a/calendar/cal-client/cal-query.c b/calendar/cal-client/cal-query.c deleted file mode 100644 index e77f5ad3e9..0000000000 --- a/calendar/cal-client/cal-query.c +++ /dev/null @@ -1,374 +0,0 @@ -/* Evolution calendar - Live query client object - * - * Copyright (C) 2001 Ximian, Inc. - * - * Author: Federico Mena-Quintero <federico@ximian.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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string.h> -#include <bonobo/bonobo-exception.h> -#include "cal-marshal.h" -#include "cal-client.h" -#include "cal-query.h" -#include "query-listener.h" - - - -/* Private part of the CalQuery structure */ -struct _CalQueryPrivate { - /* Handle to the query in the server */ - GNOME_Evolution_Calendar_Query query; - - /* Our query listener implementation */ - QueryListener *listener; - - /* The CalClient associated with this query */ - CalClient *client; -}; - -/* Property IDs */ -enum props { - PROP_0, - PROP_QUERY, - PROP_LISTENER, - PROP_CLIENT -}; - -/* Signal IDs */ -enum { - OBJECTS_ADDED, - OBJECTS_MODIFIED, - OBJECTS_REMOVED, - QUERY_PROGRESS, - QUERY_DONE, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL]; - -static GObjectClass *parent_class; - - - -static void -objects_added_cb (QueryListener *listener, GList *objects, gpointer data) -{ - CalQuery *query; - - query = CAL_QUERY (data); - - g_signal_emit (G_OBJECT (query), signals[OBJECTS_ADDED], 0, objects); -} - -static void -objects_modified_cb (QueryListener *listener, GList *objects, gpointer data) -{ - CalQuery *query; - - query = CAL_QUERY (data); - - g_signal_emit (G_OBJECT (query), signals[OBJECTS_MODIFIED], 0, objects); -} - -static void -objects_removed_cb (QueryListener *listener, GList *uids, gpointer data) -{ - CalQuery *query; - - query = CAL_QUERY (data); - - g_signal_emit (G_OBJECT (query), signals[OBJECTS_REMOVED], 0, uids); -} - -static void -query_progress_cb (QueryListener *listener, const char *message, int percent, gpointer data) -{ - CalQuery *query; - - query = CAL_QUERY (data); - - g_signal_emit (G_OBJECT (query), signals[QUERY_PROGRESS], 0, message, percent); -} - -static void -query_done_cb (QueryListener *listener, ECalendarStatus status, gpointer data) -{ - CalQuery *query; - - query = CAL_QUERY (data); - - g_signal_emit (G_OBJECT (query), signals[QUERY_DONE], 0, status); -} - -/* Object initialization function for the calendar query */ -static void -cal_query_init (CalQuery *query, CalQueryClass *klass) -{ - CalQueryPrivate *priv; - - priv = g_new0 (CalQueryPrivate, 1); - query->priv = priv; - - priv->listener = NULL; - priv->query = CORBA_OBJECT_NIL; -} - -static void -cal_query_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) -{ - CalQuery *query; - CalQueryPrivate *priv; - - query = CAL_QUERY (object); - priv = query->priv; - - switch (property_id) { - case PROP_QUERY: - priv->query = bonobo_object_dup_ref (g_value_get_pointer (value), NULL); - break; - case PROP_LISTENER: - priv->listener = bonobo_object_ref (g_value_get_pointer (value)); - - g_signal_connect (G_OBJECT (priv->listener), "objects_added", - G_CALLBACK (objects_added_cb), query); - g_signal_connect (G_OBJECT (priv->listener), "objects_modified", - G_CALLBACK (objects_modified_cb), query); - g_signal_connect (G_OBJECT (priv->listener), "objects_removed", - G_CALLBACK (objects_removed_cb), query); - g_signal_connect (G_OBJECT (priv->listener), "query_progress", - G_CALLBACK (query_progress_cb), query); - g_signal_connect (G_OBJECT (priv->listener), "query_done", - G_CALLBACK (query_done_cb), query); - break; - case PROP_CLIENT: - priv->client = CAL_CLIENT (g_value_dup_object (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -cal_query_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) -{ - CalQuery *query; - CalQueryPrivate *priv; - - query = CAL_QUERY (object); - priv = query->priv; - - switch (property_id) { - case PROP_QUERY: - g_value_set_pointer (value, priv->query); - break; - case PROP_LISTENER: - g_value_set_pointer (value, priv->listener); - break; - case PROP_CLIENT: - g_value_set_object (value, priv->client); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - - -/* Finalize handler for the calendar query */ -static void -cal_query_finalize (GObject *object) -{ - CalQuery *query; - CalQueryPrivate *priv; - - g_return_if_fail (object != NULL); - g_return_if_fail (IS_CAL_QUERY (object)); - - query = CAL_QUERY (object); - priv = query->priv; - - /* The server keeps a copy of the query listener, so we must unref it */ - g_signal_handlers_disconnect_matched (priv->listener, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, query); - bonobo_object_unref (BONOBO_OBJECT (priv->listener)); - - if (priv->query != CORBA_OBJECT_NIL) - bonobo_object_release_unref (priv->query, NULL); - - g_free (priv); - - if (G_OBJECT_CLASS (parent_class)->finalize) - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - -/* Class initialization function for the calendar query */ -static void -cal_query_class_init (CalQueryClass *klass) -{ - GObjectClass *object_class; - GParamSpec *param; - - object_class = (GObjectClass *) klass; - - parent_class = g_type_class_peek_parent (klass); - - object_class->set_property = cal_query_set_property; - object_class->get_property = cal_query_get_property; - object_class->finalize = cal_query_finalize; - - param = g_param_spec_pointer ("query", NULL, NULL, - G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY); - g_object_class_install_property (object_class, PROP_QUERY, param); - param = g_param_spec_pointer ("listener", NULL, NULL, - G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY); - g_object_class_install_property (object_class, PROP_LISTENER, param); - param = g_param_spec_object ("client", NULL, NULL, CAL_CLIENT_TYPE, - G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY); - g_object_class_install_property (object_class, PROP_CLIENT, param); - - signals[OBJECTS_ADDED] = - g_signal_new ("objects_added", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (CalQueryClass, objects_added), - NULL, NULL, - cal_marshal_VOID__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); - signals[OBJECTS_MODIFIED] = - g_signal_new ("objects_modified", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (CalQueryClass, objects_modified), - NULL, NULL, - cal_marshal_VOID__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); - signals[OBJECTS_REMOVED] = - g_signal_new ("objects_removed", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (CalQueryClass, objects_removed), - NULL, NULL, - cal_marshal_VOID__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); - signals[QUERY_PROGRESS] = - g_signal_new ("query_progress", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (CalQueryClass, query_progress), - NULL, NULL, - cal_marshal_VOID__POINTER, - G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT); - signals[QUERY_DONE] = - g_signal_new ("query_done", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (CalQueryClass, query_done), - NULL, NULL, - cal_marshal_VOID__INT, - G_TYPE_NONE, 1, G_TYPE_INT); -} - -/** - * cal_query_get_type: - * - * Registers the #CalQuery class if necessary, and returns the type ID assigned - * to it. - * - * Return value: The type ID of the #CalQuery class. - **/ -GType -cal_query_get_type (void) -{ - static GType cal_query_type = 0; - - if (!cal_query_type) { - static GTypeInfo info = { - sizeof (CalQueryClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) cal_query_class_init, - NULL, NULL, - sizeof (CalQuery), - 0, - (GInstanceInitFunc) cal_query_init - }; - cal_query_type = g_type_register_static (G_TYPE_OBJECT, "CalQuery", &info, 0); - } - - return cal_query_type; -} - -/** - * cal_query_new: - * @client: Client from which the query is being created. - * @cal: Handle to an open calendar. - * @sexp: S-expression that defines the query. - * - * Creates a new query object by issuing the query creation request to the - * calendar server. - * - * Return value: A newly-created query object, or NULL if the request failed. - **/ -CalQuery * -cal_query_new (GNOME_Evolution_Calendar_Query corba_query, QueryListener *listener, CalClient *client) -{ - CalQuery *query; - - query = g_object_new (CAL_QUERY_TYPE, "query", corba_query, "listener", - listener, "client", client, NULL); - - return query; -} - -/** - * cal_query_get_client - * @query: A #CalQuery object. - * - * Get the #CalClient associated with this query. - * - * Returns: the associated client. - */ -CalClient * -cal_query_get_client (CalQuery *query) -{ - g_return_val_if_fail (IS_CAL_QUERY (query), NULL); - - return query->priv->client; -} - -void -cal_query_start (CalQuery *query) -{ - CalQueryPrivate *priv; - CORBA_Environment ev; - - g_return_if_fail (query != NULL); - g_return_if_fail (IS_CAL_QUERY (query)); - - priv = query->priv; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Calendar_Query_start (priv->query, &ev); - if (BONOBO_EX (&ev)) - g_warning (G_STRLOC ": Unable to start query"); - - CORBA_exception_free (&ev); -} diff --git a/calendar/cal-client/cal-query.h b/calendar/cal-client/cal-query.h deleted file mode 100644 index 05390dd12a..0000000000 --- a/calendar/cal-client/cal-query.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Evolution calendar - Live query client object - * - * Copyright (C) 2001 Ximian, Inc. - * - * Author: Federico Mena-Quintero <federico@ximian.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. - */ - -#ifndef CAL_QUERY_H -#define CAL_QUERY_H - -#include <glib-object.h> -#include "cal-client-types.h" -#include "query-listener.h" -#include "evolution-calendar.h" - -G_BEGIN_DECLS - -typedef struct _CalClient CalClient; - - - -#define CAL_QUERY_TYPE (cal_query_get_type ()) -#define CAL_QUERY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CAL_QUERY_TYPE, CalQuery)) -#define CAL_QUERY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CAL_QUERY_TYPE, CalQueryClass)) -#define IS_CAL_QUERY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CAL_QUERY_TYPE)) -#define IS_CAL_QUERY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CAL_QUERY_TYPE)) - -typedef struct _CalQueryPrivate CalQueryPrivate; - -typedef struct { - GObject object; - - /* Private data */ - CalQueryPrivate *priv; -} CalQuery; - -typedef struct { - GObjectClass parent_class; - - /* Notification signals */ - void (* objects_added) (CalQuery *query, GList *objects); - void (* objects_modified) (CalQuery *query, GList *objects); - void (* objects_removed) (CalQuery *query, GList *uids); - void (* query_progress) (CalQuery *query, char *message, int percent); - void (* query_done) (CalQuery *query, ECalendarStatus status); -} CalQueryClass; - -GType cal_query_get_type (void); - -CalQuery *cal_query_new (GNOME_Evolution_Calendar_Query corba_query, QueryListener *listener, CalClient *client); -CalClient *cal_query_get_client (CalQuery *query); -void cal_query_start (CalQuery *query); - -G_END_DECLS - -#endif diff --git a/calendar/cal-client/client-test.c b/calendar/cal-client/client-test.c deleted file mode 100644 index 48763be50a..0000000000 --- a/calendar/cal-client/client-test.c +++ /dev/null @@ -1,218 +0,0 @@ -/* Evolution calendar client - test program - * - * Copyright (C) 2000 Ximian, Inc. - * Copyright (C) 2000 Ximian, Inc. - * - * Author: Federico Mena-Quintero <federico@ximian.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 <config.h> -#include <stdlib.h> -#include <bonobo-activation/bonobo-activation.h> -#include <bonobo/bonobo-i18n.h> -#include <bonobo/bonobo-main.h> -#include "cal-client.h" -#include "cal-util/cal-component.h" - -static CalClient *client1; -static CalClient *client2; - -/* Prints a message with a client identifier */ -static void -cl_printf (CalClient *client, const char *format, ...) -{ - va_list args; - - va_start (args, format); - printf ("Client %s: ", - client == client1 ? "1" : - client == client2 ? "2" : - "UNKNOWN"); - vprintf (format, args); - va_end (args); -} - -static void -objects_added_cb (GObject *object, GList *objects, gpointer data) -{ - GList *l; - - for (l = objects; l; l = l->next) - cl_printf (data, "Object added %s\n", icalcomponent_get_uid (l->data)); -} - -static void -objects_modified_cb (GObject *object, GList *objects, gpointer data) -{ - GList *l; - - for (l = objects; l; l = l->next) - cl_printf (data, "Object modified %s\n", icalcomponent_get_uid (l->data)); -} - -static void -objects_removed_cb (GObject *object, GList *objects, gpointer data) -{ - GList *l; - - for (l = objects; l; l = l->next) - cl_printf (data, "Object removed %s\n", icalcomponent_get_uid (l->data)); -} - -static void -query_done_cb (GObject *object, ECalendarStatus status, gpointer data) -{ - cl_printf (data, "Query done\n"); -} - -/* Lists the UIDs of objects in a calendar, called as an idle handler */ -static gboolean -list_uids (gpointer data) -{ - CalClient *client; - GList *objects = NULL; - GList *l; - - client = CAL_CLIENT (data); - - g_message ("Blah"); - - if (!cal_client_get_object_list (client, "(contains? \"any\" \"Test4\")", &objects, NULL)) - return FALSE; - - cl_printf (client, "UIDS: "); - - if (!objects) - printf ("none\n"); - else { - for (l = objects; l; l = l->next) { - const char *uid; - - uid = icalcomponent_get_uid (l->data); - printf ("`%s' ", uid); - } - - printf ("\n"); - - for (l = objects; l; l = l->next) { - printf ("------------------------------\n"); - printf ("%s", icalcomponent_as_ical_string (l->data)); - printf ("------------------------------\n"); - } - } - - cal_client_free_object_list (objects); - - g_object_unref (client); - - return FALSE; -} - -/* Callback used when a calendar is opened */ -static void -cal_opened_cb (CalClient *client, CalClientOpenStatus status, gpointer data) -{ - CalQuery *query; - - cl_printf (client, "Load/create %s\n", - ((status == CAL_CLIENT_OPEN_SUCCESS) ? "success" : - (status == CAL_CLIENT_OPEN_ERROR) ? "error" : - (status == CAL_CLIENT_OPEN_NOT_FOUND) ? "not found" : - (status == CAL_CLIENT_OPEN_METHOD_NOT_SUPPORTED) ? "method not supported" : - "unknown status value")); - - if (status == CAL_CLIENT_OPEN_SUCCESS) { - if (!cal_client_get_query (client, "(contains? \"any\" \"Test4\")", &query, NULL)) - g_warning (G_STRLOC ": Unable to obtain query"); - - g_signal_connect (G_OBJECT (query), "objects_added", - G_CALLBACK (objects_added_cb), client); - g_signal_connect (G_OBJECT (query), "objects_modified", - G_CALLBACK (objects_modified_cb), client); - g_signal_connect (G_OBJECT (query), "objects_removed", - G_CALLBACK (objects_removed_cb), client); - g_signal_connect (G_OBJECT (query), "query_done", - G_CALLBACK (query_done_cb), client); - - cal_query_start (query); - - g_idle_add (list_uids, client); - } - else - g_object_unref (client); -} - -/* Callback used when a client is destroyed */ -static void -client_destroy_cb (gpointer data, GObject *object) -{ - if (CAL_CLIENT (object) == client1) - client1 = NULL; - else if (CAL_CLIENT (object) == client2) - client2 = NULL; - else - g_assert_not_reached (); - - if (!client1 && !client2) - bonobo_main_quit (); -} - -/* Creates a calendar client and tries to load the specified URI into it */ -static void -create_client (CalClient **client, const char *uri, CalObjType type, gboolean only_if_exists) -{ - *client = cal_client_new (uri, type); - if (!*client) { - g_message (G_STRLOC ": could not create the client"); - exit (1); - } - - g_object_weak_ref (G_OBJECT (*client), client_destroy_cb, NULL); - - g_signal_connect (*client, "cal_opened", - G_CALLBACK (cal_opened_cb), - NULL); - - printf ("Calendar loading `%s'...\n", uri); - - if (!cal_client_open (*client, only_if_exists, NULL)) { - g_message (G_STRLOC ": failure when issuing calendar open request `%s'", - uri); - exit (1); - } -} - -int -main (int argc, char **argv) -{ - bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR); - textdomain (GETTEXT_PACKAGE); - - g_type_init (); - bonobo_activation_init (argc, argv); - - if (!bonobo_init (&argc, argv)) { - g_message ("main(): could not initialize Bonobo"); - exit (1); - } - - create_client (&client1, "file:///home/gnome24-evolution-new-calendar/evolution/local/Calendar", - CALOBJ_TYPE_EVENT, FALSE); -// create_client (&client2, "file:///tmp/tasks", TRUE); - - bonobo_main (); - return 0; -} diff --git a/calendar/cal-client/query-listener.c b/calendar/cal-client/query-listener.c deleted file mode 100644 index 4c8cbb4fe5..0000000000 --- a/calendar/cal-client/query-listener.c +++ /dev/null @@ -1,304 +0,0 @@ -/* Evolution calendar - Live search query listener convenience object - * - * Copyright (C) 2001 Ximian, Inc. - * - * Author: Federico Mena-Quintero <federico@ximian.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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "cal-marshal.h" -#include "query-listener.h" - - - -/* Private part of the QueryListener structure */ - -struct _QueryListenerPrivate { - int dummy; -}; - -/* Signal IDs */ -enum { - OBJECTS_ADDED, - OBJECTS_MODIFIED, - OBJECTS_REMOVED, - QUERY_PROGRESS, - QUERY_DONE, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -static BonoboObjectClass *parent_class; - -/* CORBA method implementations */ -/* FIXME This is duplicated from cal-listener.c */ -static ECalendarStatus -convert_status (const GNOME_Evolution_Calendar_CallStatus status) -{ - switch (status) { - case GNOME_Evolution_Calendar_Success: - return E_CALENDAR_STATUS_OK; - case GNOME_Evolution_Calendar_RepositoryOffline: - return E_CALENDAR_STATUS_REPOSITORY_OFFLINE; - case GNOME_Evolution_Calendar_PermissionDenied: - return E_CALENDAR_STATUS_PERMISSION_DENIED; - case GNOME_Evolution_Calendar_ObjectNotFound: - return E_CALENDAR_STATUS_OBJECT_NOT_FOUND; - case GNOME_Evolution_Calendar_CardIdAlreadyExists: - return E_CALENDAR_STATUS_CARD_ID_ALREADY_EXISTS; - case GNOME_Evolution_Calendar_AuthenticationFailed: - return E_CALENDAR_STATUS_AUTHENTICATION_FAILED; - case GNOME_Evolution_Calendar_AuthenticationRequired: - return E_CALENDAR_STATUS_AUTHENTICATION_REQUIRED; - case GNOME_Evolution_Calendar_OtherError: - default: - return E_CALENDAR_STATUS_OTHER_ERROR; - } -} - -/* FIXME This is duplicated from cal-listener.c */ -static GList * -build_object_list (const GNOME_Evolution_Calendar_stringlist *seq) -{ - GList *list; - int i; - - list = NULL; - for (i = 0; i < seq->_length; i++) { - icalcomponent *comp; - - comp = icalcomponent_new_from_string (seq->_buffer[i]); - if (!comp) - continue; - - list = g_list_prepend (list, comp); - } - - return list; -} - -static GList * -build_uid_list (const GNOME_Evolution_Calendar_CalObjUIDSeq *seq) -{ - GList *list; - int i; - - list = NULL; - for (i = 0; i < seq->_length; i++) - list = g_list_prepend (list, g_strdup (seq->_buffer[i])); - - return list; -} - -static void -impl_notifyObjectsAdded (PortableServer_Servant servant, - const GNOME_Evolution_Calendar_stringlist *objects, - CORBA_Environment *ev) -{ - QueryListener *ql; - QueryListenerPrivate *priv; - GList *object_list, *l; - - ql = QUERY_LISTENER (bonobo_object_from_servant (servant)); - priv = ql->priv; - - object_list = build_object_list (objects); - - g_signal_emit (G_OBJECT (ql), signals[OBJECTS_ADDED], 0, object_list); - - for (l = object_list; l; l = l->next) - icalcomponent_free (l->data); - g_list_free (object_list); -} - -static void -impl_notifyObjectsModified (PortableServer_Servant servant, - const GNOME_Evolution_Calendar_stringlist *objects, - CORBA_Environment *ev) -{ - QueryListener *ql; - QueryListenerPrivate *priv; - GList *object_list, *l; - - ql = QUERY_LISTENER (bonobo_object_from_servant (servant)); - priv = ql->priv; - - object_list = build_object_list (objects); - - g_signal_emit (G_OBJECT (ql), signals[OBJECTS_MODIFIED], 0, object_list); - - for (l = object_list; l; l = l->next) - icalcomponent_free (l->data); - g_list_free (object_list); -} - -static void -impl_notifyObjectsRemoved (PortableServer_Servant servant, - const GNOME_Evolution_Calendar_CalObjUIDSeq *uids, - CORBA_Environment *ev) -{ - QueryListener *ql; - QueryListenerPrivate *priv; - GList *uid_list, *l; - - ql = QUERY_LISTENER (bonobo_object_from_servant (servant)); - priv = ql->priv; - - uid_list = build_uid_list (uids); - - g_signal_emit (G_OBJECT (ql), signals[OBJECTS_REMOVED], 0, uid_list); - - for (l = uid_list; l; l = l->next) - g_free (l->data); - g_list_free (uid_list); -} - -static void -impl_notifyQueryProgress (PortableServer_Servant servant, - const CORBA_char *message, - const CORBA_short percent, - CORBA_Environment *ev) -{ - QueryListener *ql; - QueryListenerPrivate *priv; - - ql = QUERY_LISTENER (bonobo_object_from_servant (servant)); - priv = ql->priv; - - g_signal_emit (G_OBJECT (ql), signals[QUERY_PROGRESS], 0, message, percent); -} - -static void -impl_notifyQueryDone (PortableServer_Servant servant, - const GNOME_Evolution_Calendar_CallStatus status, - CORBA_Environment *ev) -{ - QueryListener *ql; - QueryListenerPrivate *priv; - - ql = QUERY_LISTENER (bonobo_object_from_servant (servant)); - priv = ql->priv; - - g_signal_emit (G_OBJECT (ql), signals[QUERY_DONE], 0, convert_status (status)); -} - -/* Object initialization function for the live search query listener */ -static void -query_listener_init (QueryListener *ql, QueryListenerClass *class) -{ - QueryListenerPrivate *priv; - - priv = g_new0 (QueryListenerPrivate, 1); - ql->priv = priv; -} - -/* Finalize handler for the live search query listener */ -static void -query_listener_finalize (GObject *object) -{ - QueryListener *ql; - QueryListenerPrivate *priv; - - g_return_if_fail (object != NULL); - g_return_if_fail (IS_QUERY_LISTENER (object)); - - ql = QUERY_LISTENER (object); - priv = ql->priv; - - g_free (priv); - - if (G_OBJECT_CLASS (parent_class)->finalize) - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - -/* Class initialization function for the live search query listener */ -static void -query_listener_class_init (QueryListenerClass *klass) -{ - GObjectClass *object_class; - - object_class = (GObjectClass *) klass; - - parent_class = g_type_class_peek_parent (klass); - - object_class->finalize = query_listener_finalize; - - klass->epv.notifyObjectsAdded = impl_notifyObjectsAdded; - klass->epv.notifyObjectsModified = impl_notifyObjectsModified; - klass->epv.notifyObjectsRemoved = impl_notifyObjectsRemoved; - klass->epv.notifyQueryProgress = impl_notifyQueryProgress; - klass->epv.notifyQueryDone = impl_notifyQueryDone; - - signals[OBJECTS_ADDED] = - g_signal_new ("objects_added", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (QueryListenerClass, objects_added), - NULL, NULL, - cal_marshal_VOID__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); - signals[OBJECTS_MODIFIED] = - g_signal_new ("objects_modified", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (QueryListenerClass, objects_modified), - NULL, NULL, - cal_marshal_VOID__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); - signals[OBJECTS_REMOVED] = - g_signal_new ("objects_removed", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (QueryListenerClass, objects_removed), - NULL, NULL, - cal_marshal_VOID__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); - signals[QUERY_PROGRESS] = - g_signal_new ("query_progress", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (QueryListenerClass, query_progress), - NULL, NULL, - cal_marshal_VOID__POINTER, - G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT); - signals[QUERY_DONE] = - g_signal_new ("query_done", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (QueryListenerClass, query_done), - NULL, NULL, - cal_marshal_VOID__INT, - G_TYPE_NONE, 1, G_TYPE_INT); -} - -BONOBO_TYPE_FUNC_FULL (QueryListener, - GNOME_Evolution_Calendar_QueryListener, - BONOBO_TYPE_OBJECT, - query_listener); - -QueryListener * -query_listener_new (void) -{ - QueryListener *ql; - - ql = g_object_new (QUERY_LISTENER_TYPE, NULL); - - return ql; -} diff --git a/calendar/cal-client/query-listener.h b/calendar/cal-client/query-listener.h deleted file mode 100644 index 6a204bbf77..0000000000 --- a/calendar/cal-client/query-listener.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Evolution calendar - Live search query listener implementation - * - * Copyright (C) 2001 Ximian, Inc. - * - * Author: Federico Mena-Quintero <federico@ximian.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. - */ - -#ifndef QUERY_LISTENER_H -#define QUERY_LISTENER_H - -#include <bonobo/bonobo-object.h> -#include "cal-client-types.h" -#include "evolution-calendar.h" - -G_BEGIN_DECLS - - - -#define QUERY_LISTENER_TYPE (query_listener_get_type ()) -#define QUERY_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), QUERY_LISTENER_TYPE, QueryListener)) -#define QUERY_LISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), QUERY_LISTENER_TYPE, \ - QueryListenerClass)) -#define IS_QUERY_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), QUERY_LISTENER_TYPE)) -#define IS_QUERY_LISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), QUERY_LISTENER_TYPE)) - -typedef struct _QueryListenerPrivate QueryListenerPrivate; - -typedef struct { - BonoboObject xobject; - - /* Private data */ - QueryListenerPrivate *priv; -} QueryListener; - -typedef struct { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_Calendar_QueryListener__epv epv; - - void (*objects_added) (QueryListener *listener, GList *objects); - void (*objects_modified) (QueryListener *listener, GList *objects); - void (*objects_removed) (QueryListener *listener, GList *uids); - void (*query_progress) (QueryListener *listener, const char *message, int percent); - void (*query_done) (QueryListener *listener, ECalendarStatus status); -} QueryListenerClass; - -/* Notification functions */ - -GType query_listener_get_type (void); -QueryListener *query_listener_new (void); - - - -G_END_DECLS - -#endif diff --git a/calendar/cal-client/test.ics b/calendar/cal-client/test.ics deleted file mode 100644 index 128251ee11..0000000000 --- a/calendar/cal-client/test.ics +++ /dev/null @@ -1,318 +0,0 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//hacksw/handcal//NONSGML v1.0//EN - -BEGIN:VEVENT -DTSTART:19970714T170000Z -DTEND:19970715T035959Z -SUMMARY:Bastille Day Party -END:VEVENT - -BEGIN:VEVENT -UID:19970901T130000Z-123401@host.com -DTSTAMP:19970901T1300Z -DTSTART:19970903T163000Z -DTEND:19970903T190000Z -SUMMARY:Annual Employee Review -CLASS:PRIVATE -CATEGORIES:BUSINESS,HUMAN RESOURCES -END:VEVENT - -BEGIN:VEVENT -UID:19970901T130000Z-123402@host.com -DTSTAMP:19970901T1300Z -DTSTART:19970401T163000Z -DTEND:19970402T010000Z -SUMMARY:Laurel is in sensitivity awareness class. -CLASS:PUBLIC -CATEGORIES:BUSINESS,HUMAN RESOURCES -TRANSP:TRANSPARENT -END:VEVENT - -BEGIN:VEVENT -UID:19970901T130000Z-123403@host.com -DTSTAMP:19970901T1300Z -DTSTART:19971102 -SUMMARY:Our Blissful Anniversary -CLASS:CONFIDENTIAL -CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION -RRULE:FREQ=YEARLY -END:VEVENT - -BEGIN:VTODO -UID:19970901T130000Z-123404@host.com -DTSTAMP:19970901T1300Z -DTSTART:19970415T133000Z -DUE:19970416T045959Z -SUMMARY:1996 Income Tax Preparation -CLASS:CONFIDENTIAL -CATEGORIES:FAMILY,FINANCE -PRIORITY:1 -STATUS:NEEDS-ACTION -END:VTODO - -BEGIN:VJOURNAL -UID:19970901T130000Z-123405@host.com -DTSTAMP:19970901T1300Z -DTSTART;VALUE=DATE:19970317 -SUMMARY:Staff meeting minutes -DESCRIPTION:1. Staff meeting: Participants include Joe\, Lisa - and Bob. Aurora project plans were reviewed. There is currently - no budget reserves for this project. Lisa will escalate to - management. Next meeting on Tuesday.\n - 2. Telephone Conference: ABC Corp. sales representative called - to discuss new printer. Promised to get us a demo by Friday.\n - 3. Henry Miller (Handsoff Insurance): Car was totaled by tree. - Is looking into a loaner car. 654-2323 (tel). -END:VJOURNAL - -BEGIN:VFREEBUSY -ORGANIZER:MAILTO:jane_doe@host1.com -ATTENDEE:MAILTO:john_public@host2.com -DTSTART:19971015T050000Z -DTEND:19971016T050000Z -DTSTAMP:19970901T083000Z -END:VFREEBUSY - -BEGIN:VFREEBUSY -ORGANIZER:MAILTO:jane_doe@host1.com -ATTENDEE:MAILTO:john_public@host2.com -DTSTAMP:19970901T100000Z -FREEBUSY;VALUE=PERIOD:19971015T050000Z/PT8H30M, - 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M -URL:http://host2.com/pub/busy/jpublic-01.ifb -COMMENT:This iCalendar file contains busy time information for - the next three months. -END:VFREEBUSY - -BEGIN:VFREEBUSY -ORGANIZER:jsmith@host.com -DTSTART:19980313T141711Z -DTEND:19980410T141711Z -FREEBUSY:19980314T233000Z/19980315T003000Z -FREEBUSY:19980316T153000Z/19980316T163000Z -FREEBUSY:19980318T030000Z/19980318T040000Z -URL:http://www.host.com/calendar/busytime/jsmith.ifb -END:VFREEBUSY - -BEGIN:VTIMEZONE -TZID:US-Eastern -LAST-MODIFIED:19870101T000000Z -BEGIN:STANDARD -DTSTART:19971026T020000 -RDATE:19971026T020000 -TZOFFSETFROM:-0400 -TZOFFSETTO:-0500 -TZNAME:EST -END:STANDARD -BEGIN:DAYLIGHT -DTSTART:19971026T020000 -RDATE:19970406T020000 -TZOFFSETFROM:-0500 -TZOFFSETTO:-0400 -TZNAME:EDT -END:DAYLIGHT -END:VTIMEZONE - -BEGIN:VTIMEZONE -TZID:US-Eastern -LAST-MODIFIED:19870101T000000Z -TZURL:http://zones.stds_r_us.net/tz/US-Eastern -BEGIN:STANDARD -DTSTART:19671029T020000 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 -TZOFFSETFROM:-0400 -TZOFFSETTO:-0500 -TZNAME:EST -END:STANDARD -BEGIN:DAYLIGHT -DTSTART:19870405T020000 -RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 -TZOFFSETFROM:-0500 -TZOFFSETTO:-0400 -TZNAME:EDT -END:DAYLIGHT -END:VTIMEZONE - -BEGIN:VTIMEZONE -TZID:US--Fictitious-Eastern -LAST-MODIFIED:19870101T000000Z -BEGIN:STANDARD -DTSTART:19671029T020000 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 -TZOFFSETFROM:-0400 -TZOFFSETTO:-0500 -TZNAME:EST -END:STANDARD -BEGIN:DAYLIGHT -DTSTART:19870405T020000 -RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z -TZOFFSETFROM:-0500 -TZOFFSETTO:-0400 -TZNAME:EDT -END:DAYLIGHT -END:VTIMEZONE - -BEGIN:VTIMEZONE -TZID:US--Fictitious-Eastern -LAST-MODIFIED:19870101T000000Z -BEGIN:STANDARD -DTSTART:19671029T020000 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 -TZOFFSETFROM:-0400 -TZOFFSETTO:-0500 -TZNAME:EST -END:STANDARD -BEGIN:DAYLIGHT -DTSTART:19870405T020000 -RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z -TZOFFSETFROM:-0500 -TZOFFSETTO:-0400 -TZNAME:EDT -END:DAYLIGHT -BEGIN:DAYLIGHT -DTSTART:19990424T020000 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4 -TZOFFSETFROM:-0500 -TZOFFSETTO:-0400 -TZNAME:EDT -END:DAYLIGHT -END:VTIMEZONE - -BEGIN:VALARM -TRIGGER;VALUE=DATE-TIME:19970317T133000Z -REPEAT:4 -DURATION:PT15M -ACTION:AUDIO -ATTACH;FMTTYPE=audio/basic:ftp://host.com/pub/sounds/bell-01.aud -END:VALARM -BEGIN:VALARM -TRIGGER:-PT30M -REPEAT:2 -DURATION:PT15M -ACTION:DISPLAY -DESCRIPTION:Breakfast meeting with executive\n - team at 8:30 AM EST. -END:VALARM - -BEGIN:VALARM -TRIGGER:-P2D -ACTION:EMAIL -ATTENDEE:MAILTO:john_doe@host.com -SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING *** -DESCRIPTION:A draft agenda needs to be sent out to the attendees - to the weekly managers meeting (MGR-LIST). Attached is a - pointer the document template for the agenda file. -ATTACH;FMTTYPE=application/binary:http://host.com/templates/agen - da.doc -END:VALARM - -BEGIN:VALARM -TRIGGER;VALUE=DATE-TIME:19980101T050000Z -REPEAT:23 -DURATION:PT1H -ACTION:PROCEDURE -ATTACH;FMTTYPE=application/binary:ftp://host.com/novo- - procs/felizano.exe -END:VALARM - -BEGIN:VTIMEZONE -TZID:US-Eastern -BEGIN:STANDARD -DTSTART:19981025T020000 -RDATE:19981025T020000 -TZOFFSETFROM:-0400 -TZOFFSETTO:-0500 -TZNAME:EST -END:STANDARD -BEGIN:DAYLIGHT -DTSTART:19990404T020000 -RDATE:19990404T020000 -TZOFFSETFROM:-0500 -TZOFFSETTO:-0400 -TZNAME:EDT -END:DAYLIGHT -END:VTIMEZONE - -BEGIN:VEVENT -DTSTAMP:19980309T231000Z -UID:guid-1.host1.com -ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP: - MAILTO:employee-A@host.com -DESCRIPTION:Project XYZ Review Meeting -CATEGORIES:MEETING -CLASS:PUBLIC -CREATED:19980309T130000Z -SUMMARY:XYZ Project Review -DTSTART;TZID=US-Eastern:19980312T083000 -DTEND;TZID=US-Eastern:19980312T093000 -LOCATION:1CP Conference Room 4350 -END:VEVENT - -BEGIN:VEVENT -DTSTAMP:19970324T1200Z -SEQUENCE:0 -UID:uid3@host1.com -ORGANIZER:MAILTO:jdoe@host1.com -DTSTART:19970324T123000Z -DTEND:19970324T210000Z -CATEGORIES:MEETING,PROJECT -CLASS:PUBLIC -SUMMARY:Calendaring Interoperability Planning Meeting -DESCRIPTION:Discuss how we can test c&s interoperability\n - using iCalendar and other IETF standards. -LOCATION:LDB Lobby -ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/ - conf/bkgrnd.ps -END:VEVENT - -BEGIN:VTODO -DTSTAMP:19980130T134500Z -SEQUENCE:2 -UID:uid4@host1.com -ORGANIZER:MAILTO:unclesam@us.gov -ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:jqpublic@host.com -DUE:19980415T235959 -STATUS:NEEDS-ACTION -SUMMARY:Submit Income Taxes -BEGIN:VALARM -ACTION:AUDIO -TRIGGER:19980403T120000 -ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio- - files/ssbanner.aud -REPEAT:4 -DURATION:PT1H -END:VALARM -END:VTODO - -BEGIN:VJOURNAL -DTSTAMP:19970324T120000Z -UID:uid5@host1.com -ORGANIZER:MAILTO:jsmith@host.com -STATUS:DRAFT -CLASS:PUBLIC -CATEGORIES:Project Report, XYZ, Weekly Meeting -DESCRIPTION:Project xyz Review Meeting Minutes\n - Agenda\n1. Review of project version 1.0 requirements.\n2. - Definition - of project processes.\n3. Review of project schedule.\n - Participants: John Smith\, Jane Doe\, Jim Dandy\n-It was - decided that the requirements need to be signed off by - product marketing.\n-Project processes were accepted.\n - -Project schedule needs to account for scheduled holidays - and employee vacation time. Check with HR for specific - dates.\n-New schedule will be distributed by Friday.\n- - Next weeks meeting is cancelled. No meeting until 3/23. -END:VJOURNAL - -BEGIN:VFREEBUSY -ORGANIZER:MAILTO:jsmith@host.com -DTSTART:19980313T141711Z -DTEND:19980410T141711Z -FREEBUSY:19980314T233000Z/19980315T003000Z -FREEBUSY:19980316T153000Z/19980316T163000Z -FREEBUSY:19980318T030000Z/19980318T040000Z -URL:http://www.host.com/calendar/busytime/jsmith.ifb -END:VFREEBUSY -END:VCALENDAR |