aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--calendar/ChangeLog20
-rw-r--r--calendar/cal-backend.c21
-rw-r--r--calendar/cal-backend.h4
-rw-r--r--calendar/cal-client/cal-listener.c116
-rw-r--r--calendar/cal-client/cal-listener.h10
-rw-r--r--calendar/cal-factory.c45
-rw-r--r--calendar/cal-listener.c116
-rw-r--r--calendar/cal-listener.h10
-rw-r--r--calendar/evolution-calendar.idl8
-rw-r--r--calendar/idl/evolution-calendar.idl8
-rw-r--r--calendar/pcs/cal-backend.c21
-rw-r--r--calendar/pcs/cal-backend.h4
-rw-r--r--calendar/pcs/cal-factory.c45
13 files changed, 308 insertions, 120 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index 3b32e80de3..6df4329dd9 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,23 @@
+2000-01-22 Federico Mena Quintero <federico@helixcode.com>
+
+ * cal-backend.c (cal_backend_load): Take in a GnomeVFSURI, not a
+ string.
+
+ * cal-listener.c (Listener_cal_loaded): Pass the load status to
+ the signal.
+ (cal_listener_destroy): Better error checking.
+ (cal_listener_new): Better error checking.
+
+ * cal-listener.h (CalListenerLoadStatus): New enum for the load
+ status of a calendar.
+ (CalListenerClass): Added the status argument to the cal_loaded
+ signal.
+
+ * gnome-calendar.idl (cal_loaded): Added a load status code.
+
+ * cal-backend.h (CalBackendLoadStatus): Renamed from
+ CalBackendLoadResult.
+
2000-01-18 Federico Mena Quintero <federico@helixcode.com>
* cal-backend.c cal-backend.h: Moved the calendar backend here.
diff --git a/calendar/cal-backend.c b/calendar/cal-backend.c
index 2fb523dc14..0d90e7a2dd 100644
--- a/calendar/cal-backend.c
+++ b/calendar/cal-backend.c
@@ -303,41 +303,36 @@ cal_backend_add_cal (CalBackend *backend, Cal *cal)
/**
* cal_backend_load:
* @backend: A calendar backend.
- * @str_uri: URI that contains the calendar data.
+ * @uri: URI that contains the calendar data.
*
* Loads a calendar backend with data from a calendar stored at the specified
* URI.
*
- * Return value: An operation result code.
+ * Return value: An operation status code.
**/
-CalBackendLoadResult
-cal_backend_load (CalBackend *backend, char *str_uri)
+CalBackendLoadStatus
+cal_backend_load (CalBackend *backend, GnomeVFSURI *uri)
{
CalBackendPrivate *priv;
- GnomeVFSURI *uri;
VObject *vobject;
g_return_val_if_fail (backend != NULL, CAL_BACKEND_LOAD_ERROR);
g_return_val_if_fail (IS_CAL_BACKEND (backend), CAL_BACKEND_LOAD_ERROR);
- g_return_val_if_fail (str_uri != NULL, CAL_BACKEND_LOAD_ERROR);
+ g_return_val_if_fail (uri != NULL, CAL_BACKEND_LOAD_ERROR);
priv = backend->priv;
g_return_val_if_fail (!priv->loaded, CAL_BACKEND_LOAD_ERROR);
- uri = gnome_vfs_uri_new (str_uri);
- if (!uri)
- return CAL_BACKEND_LOAD_ERROR;
-
vobject = Parse_MIME_FromURI (uri);
- if (!vobject) {
- gnome_vfs_uri_unref (uri);
+ if (!vobject)
return CAL_BACKEND_LOAD_ERROR;
- }
load_from_vobject (backend, vobject);
cleanVObject (vobject);
cleanStrTbl ();
+ gnome_vfs_uri_ref (uri);
+
priv->uri = uri;
priv->loaded = TRUE;
return CAL_BACKEND_LOAD_SUCCESS;
diff --git a/calendar/cal-backend.h b/calendar/cal-backend.h
index 14cc903ae6..cffc3c5cc3 100644
--- a/calendar/cal-backend.h
+++ b/calendar/cal-backend.h
@@ -41,7 +41,7 @@ BEGIN_GNOME_DECLS
typedef enum {
CAL_BACKEND_LOAD_SUCCESS, /* Loading OK */
CAL_BACKEND_LOAD_ERROR /* We need better error reporting in libversit */
-} CalBackendLoadResult;
+} CalBackendLoadStatus;
struct _CalBackend {
GtkObject object;
@@ -62,7 +62,7 @@ GnomeVFSURI *cal_backend_get_uri (CalBackend *backend);
void cal_backend_add_cal (CalBackend *backend, Cal *cal);
-CalBackendLoadResult cal_backend_load (CalBackend *backend, char *str_uri);
+CalBackendLoadStatus cal_backend_load (CalBackend *backend, GnomeVFSURI *uri);
diff --git a/calendar/cal-client/cal-listener.c b/calendar/cal-client/cal-listener.c
index 2c3ffe119d..8583a689c8 100644
--- a/calendar/cal-client/cal-listener.c
+++ b/calendar/cal-client/cal-listener.c
@@ -45,6 +45,8 @@ static void cal_listener_class_init (CalListenerClass *class);
static void cal_listener_init (CalListener *listener);
static void cal_listener_destroy (GtkObject *object);
+static void marshal_cal_loaded (GtkObject *object, GtkSignalFunc func, gpointer data, GtkArg *args);
+
static POA_GNOME_Calendar_Listener__vepv cal_listener_vepv;
static guint cal_listener_signals[LAST_SIGNAL];
@@ -108,8 +110,9 @@ cal_listener_class_init (CalListenerClass *class)
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (CalListenerClass, cal_loaded),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
+ marshal_cal_loaded,
+ GTK_TYPE_NONE, 2,
+ GTK_TYPE_ENUM,
GTK_TYPE_POINTER);
cal_listener_signals[OBJ_ADDED] =
gtk_signal_new ("obj_added",
@@ -155,20 +158,6 @@ cal_listener_init (CalListener *listener)
priv->cal = CORBA_OBJECT_NIL;
}
-/* Returns whether a CORBA object is nil */
-static gboolean
-corba_object_is_nil (CORBA_Object object)
-{
- CORBA_Environment ev;
- gboolean retval;
-
- CORBA_exception_init (&ev);
- retval = CORBA_Object_is_nil (object, &ev);
- CORBA_exception_free (&ev);
-
- return retval;
-}
-
/* Destroy handler for the calendar listener */
static void
cal_listener_destroy (GtkObject *object)
@@ -176,6 +165,7 @@ cal_listener_destroy (GtkObject *object)
CalListener *listener;
CalListenerPrivate *priv;
CORBA_Environment ev;
+ gboolean result;
g_return_if_fail (object != NULL);
g_return_if_fail (IS_CAL_LISTENER (object));
@@ -184,11 +174,20 @@ cal_listener_destroy (GtkObject *object)
priv = listener->priv;
CORBA_exception_init (&ev);
+ result = CORBA_Object_is_nil (priv->cal, &ev);
+
+ if (ev._major != CORBA_NO_EXCEPTION)
+ g_message ("cal_listener_destroy(): could not see if the calendar was NIL");
+ else if (!result) {
+ CORBA_exception_free (&ev);
- if (!CORBA_Object_is_nil (priv->cal, &ev)) {
- GNOME_Unknown_unref (priv->cal, &ev);
+ CORBA_exception_init (&ev);
CORBA_Object_release (priv->cal, &ev);
+
+ if (ev._major != CORBA_NO_EXCEPTION)
+ g_message ("cal_listener_destroy(): could not release the calendar");
}
+ CORBA_exception_free (&ev);
g_free (priv);
@@ -198,24 +197,72 @@ cal_listener_destroy (GtkObject *object)
+/* Marshalers */
+
+typedef void (* CalLoadedFunc) (GtkObject *object, gint status, gpointer cal, gpointer data);
+
+static void
+marshal_cal_loaded (GtkObject *object, GtkSignalFunc func, gpointer data, GtkArg *args)
+{
+ CalLoadedFunc rfunc;
+
+ rfunc = (CalLoadedFunc) func;
+ (* rfunc) (object, GTK_VALUE_ENUM (args[0]), GTK_VALUE_POINTER (args[1]), data);
+}
+
+
+
/* CORBA servant implementation */
/* Listener::cal_loaded method */
static void
Listener_cal_loaded (PortableServer_Servant servant,
+ GNOME_Calendar_Listener_LoadStatus status,
GNOME_Calendar_Cal cal,
CORBA_Environment *ev)
{
CalListener *listener;
CalListenerPrivate *priv;
+ CORBA_Environment aev;
+ GNOME_Calendar_Cal cal_copy;
+ CalListenerLoadStatus load_status;
listener = CAL_LISTENER (gnome_object_from_servant (servant));
priv = listener->priv;
- priv->cal = CORBA_Object_duplicate (cal, ev);
- GNOME_Unknown_ref (priv->cal);
+ if (priv->cal != CORBA_OBJECT_NIL) {
+ g_message ("Listener_cal_loaded(): calendar was already loaded!");
+ return;
+ }
+
+ CORBA_exception_init (&aev);
+ cal_copy = CORBA_Object_duplicate (cal, &aev);
+
+ if (aev._major != CORBA_NO_EXCEPTION) {
+ g_message ("Listener_cal_loaded(): could not duplicate the calendar");
+ CORBA_exception_free (&aev);
+ return;
+ }
+ CORBA_exception_free (&aev);
+
+ priv->cal = cal_copy;
+
+ switch (status) {
+ GNOME_Calendar_Listener_SUCESSS:
+ load_status = CAL_LISTENER_LOAD_SUCCESS;
+ break;
+
+ GNOME_Calendar_Listener_ERROR:
+ load_status = CAL_LISTENER_LOAD_ERROR;
+ break;
+
+ default:
+ load_status = CAL_LISTENER_LOAD_ERROR; /* keep gcc happy */
+ g_assert_not_reached ();
+ }
+
gtk_signal_emit (GTK_OBJECT (listener), cal_listener_signals[CAL_LOADED],
- cal);
+ load_status, cal);
}
/* Listener::obj_added method */
@@ -281,20 +328,6 @@ cal_listener_get_epv (void)
-/* Returns whether a CORBA object is nil */
-static gboolean
-corba_object_is_nil (CORBA_Object object)
-{
- CORBA_Environment ev;
- gboolean retval;
-
- CORBA_exception_init (&ev);
- retval = CORBA_Object_is_nil (object, &ev);
- CORBA_exception_free (&ev);
-
- return retval;
-}
-
/**
* cal_listener_construct:
* @listener: A calendar listener.
@@ -310,7 +343,6 @@ cal_listener_construct (CalListener *listener, GNOME_Calendar_Listener corba_lis
{
g_return_val_if_fail (listener != NULL, NULL);
g_return_val_if_fail (IS_CAL_LISTENER (listener), NULL);
- g_return_val_if_fail (!corba_object_is_nil (corba_listener), NULL);
gnome_object_construct (GNOME_OBJECT (listener), corba_listener);
return listener;
@@ -363,14 +395,24 @@ CalListener *
cal_listener_new (void)
{
CalListener *listener;
+ CORBA_Environment ev;
GNOME_Calendar_Listener corba_listener;
+ gboolean result;
listener = gtk_type_new (CAL_LISTENER_TYPE);
+
corba_listener = cal_listener_corba_object_create (GNOME_OBJECT (listener));
- if (corba_object_is_nil (corba_listener)) {
+
+ CORBA_exception_init (&ev);
+ result = CORBA_Object_is_nil (corba_listener, &ev);
+
+ if (ev._major != CORBA_NO_EXCEPTION || result) {
+ g_message ("cal_listener_new(): could not create the CORBA listener");
gtk_object_destroy (listener);
+ CORBA_exception_free (&ev);
return NULL;
}
+ CORBA_exception_free (&ev);
return cal_listener_construct (listener, corba_listener);
}
diff --git a/calendar/cal-client/cal-listener.h b/calendar/cal-client/cal-listener.h
index 41665b2b58..c8d26dab80 100644
--- a/calendar/cal-client/cal-listener.h
+++ b/calendar/cal-client/cal-listener.h
@@ -40,6 +40,12 @@ BEGIN_GNOME_DECLS
typedef struct _CalListener CalListener;
typedef struct _CalListenerClass CalListenerClass;
+/* Load status for the cal_loaded signal. We need better error reporting. */
+typedef enum {
+ CAL_LISTENER_LOAD_SUCCESS,
+ CAL_LISTENER_LOAD_ERROR
+} CalListenerLoadStatus;
+
struct _CalListener {
GnomeObject object;
@@ -50,7 +56,9 @@ struct _CalListener {
struct _CalListenerClass {
GnomeObjectClass parent_class;
- void (* cal_loaded) (CalListener *listener, GNOME_Calendar_Cal cal);
+ void (* cal_loaded) (CalListener *listener,
+ CalListenerLoadStatus status,
+ GNOME_Calendar_Cal cal);
void (* obj_added) (CalListener *listener, GNOME_Calendar_CalObj calobj);
void (* obj_removed) (CalListener *listener, GNOME_Calendar_CalObjUID uid);
void (* obj_changed) (CalListener *listener, GNOME_Calendar_CalObj calobj);
diff --git a/calendar/cal-factory.c b/calendar/cal-factory.c
index 053baebe5c..75c281d235 100644
--- a/calendar/cal-factory.c
+++ b/calendar/cal-factory.c
@@ -20,6 +20,7 @@
*/
#include <config.h>
+#include "cal-backend.h"
#include "cal-factory.h"
#include "job.h"
@@ -27,7 +28,7 @@
/* Private part of the CalFactory structure */
typedef struct {
- /* Hash table from GnomeVFSURI structures to loaded calendars */
+ /* Hash table from GnomeVFSURI structures to CalBackend objects */
GHashTable *calendars;
} CalFactoryPrivate;
@@ -215,7 +216,33 @@ lookup_calendar (CalFactory *factory, GnomeVFSURI *uri)
static void
load_calendar (CalFactory *factory, GnomeVFSURI *uri, GNOME_Calendar_Listener listener)
{
- /* FIXME */
+ CalFactoryPrivate *priv;
+ CalBackend *backend;
+ CalBackendLoadStatus status;
+
+ priv = factory->priv;
+
+ backend = cal_backend_new ();
+ if (!backend) {
+ CORBA_Environment ev;
+
+ g_message ("load_calendar(): could not create the backend");
+
+ CORBA_exception_init (&ev);
+ GNOME_Calendar_Listener_cal_loaded (listener,
+ GNOME_Calendar_Listener_ERROR,
+ CORBA_OBJECT_NIL,
+ &ev);
+ if (ev._major != CORBA_NO_EXCEPTION) {
+ g_message ("load_calendar(): could not notify the listener");
+ CORBA_exception_free (&ev);
+ gtk_object_unref (backend);
+ return;
+ }
+ CORBA_exception_free (&ev);
+ }
+
+ status = cal_backend_load (backend, uri);
}
/* Adds a listener to a calendar */
@@ -250,10 +277,15 @@ load_fn (gpointer data)
g_free (jd->uri);
CORBA_exception_init (&ev);
- GNOME_Unknown_unref (jd->listener, &ev);
CORBA_Object_release (jd->listener, &ev);
+
+ if (ev._major != CORBA_NO_EXCEPTION)
+ g_message ("load_fn(): could not release the listener");
+
CORBA_exception_free (&ev);
+ /* Done */
+
g_free (jd);
}
@@ -303,6 +335,7 @@ cal_factory_corba_object_create (GnomeObject *object)
CORBA_exception_init (&ev);
POA_GNOME_Calendar_CalFactory__init ((PortableServer_Servant) servant, &ev);
+
if (ev._major != CORBA_NO_EXCEPTION) {
g_message ("cal_factory_corba_object_create(): could not init the servant");
g_free (servant);
@@ -334,16 +367,16 @@ cal_factory_new (void)
factory = gtk_type_new (CAL_FACTORY_TYPE);
corba_factory = cal_factory_corba_object_create (GNOME_OBJECT (factory));
+
CORBA_exception_init (&ev);
retval = CORBA_Object_is_nil (corba_factory, &ev);
if (ev._major != CORBA_NO_EXCEPTION || retval) {
- g_message ("cal_factory_new(): could not create the CORBA object");
+ g_message ("cal_factory_new(): could not create the CORBA factory");
gtk_object_unref (factory);
CORBA_exception_free (&ev);
return NULL;
}
-
CORBA_exception_free (&ev);
return cal_factory_construct (factory, corba_factory);
@@ -357,8 +390,8 @@ cal_factory_load (CalFactory *factory, const char *uri, GNOME_Calendar_Listener
GNOME_Calendar_Listener listener_copy;
CORBA_exception_init (&ev);
-
listener_copy = CORBA_Object_duplicate (listener, &ev);
+
if (ev._major != CORBA_NO_EXCEPTION) {
g_message ("cal_factory_load(): could not duplicate the listener");
CORBA_exception_free (&ev);
diff --git a/calendar/cal-listener.c b/calendar/cal-listener.c
index 2c3ffe119d..8583a689c8 100644
--- a/calendar/cal-listener.c
+++ b/calendar/cal-listener.c
@@ -45,6 +45,8 @@ static void cal_listener_class_init (CalListenerClass *class);
static void cal_listener_init (CalListener *listener);
static void cal_listener_destroy (GtkObject *object);
+static void marshal_cal_loaded (GtkObject *object, GtkSignalFunc func, gpointer data, GtkArg *args);
+
static POA_GNOME_Calendar_Listener__vepv cal_listener_vepv;
static guint cal_listener_signals[LAST_SIGNAL];
@@ -108,8 +110,9 @@ cal_listener_class_init (CalListenerClass *class)
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (CalListenerClass, cal_loaded),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
+ marshal_cal_loaded,
+ GTK_TYPE_NONE, 2,
+ GTK_TYPE_ENUM,
GTK_TYPE_POINTER);
cal_listener_signals[OBJ_ADDED] =
gtk_signal_new ("obj_added",
@@ -155,20 +158,6 @@ cal_listener_init (CalListener *listener)
priv->cal = CORBA_OBJECT_NIL;
}
-/* Returns whether a CORBA object is nil */
-static gboolean
-corba_object_is_nil (CORBA_Object object)
-{
- CORBA_Environment ev;
- gboolean retval;
-
- CORBA_exception_init (&ev);
- retval = CORBA_Object_is_nil (object, &ev);
- CORBA_exception_free (&ev);
-
- return retval;
-}
-
/* Destroy handler for the calendar listener */
static void
cal_listener_destroy (GtkObject *object)
@@ -176,6 +165,7 @@ cal_listener_destroy (GtkObject *object)
CalListener *listener;
CalListenerPrivate *priv;
CORBA_Environment ev;
+ gboolean result;
g_return_if_fail (object != NULL);
g_return_if_fail (IS_CAL_LISTENER (object));
@@ -184,11 +174,20 @@ cal_listener_destroy (GtkObject *object)
priv = listener->priv;
CORBA_exception_init (&ev);
+ result = CORBA_Object_is_nil (priv->cal, &ev);
+
+ if (ev._major != CORBA_NO_EXCEPTION)
+ g_message ("cal_listener_destroy(): could not see if the calendar was NIL");
+ else if (!result) {
+ CORBA_exception_free (&ev);
- if (!CORBA_Object_is_nil (priv->cal, &ev)) {
- GNOME_Unknown_unref (priv->cal, &ev);
+ CORBA_exception_init (&ev);
CORBA_Object_release (priv->cal, &ev);
+
+ if (ev._major != CORBA_NO_EXCEPTION)
+ g_message ("cal_listener_destroy(): could not release the calendar");
}
+ CORBA_exception_free (&ev);
g_free (priv);
@@ -198,24 +197,72 @@ cal_listener_destroy (GtkObject *object)
+/* Marshalers */
+
+typedef void (* CalLoadedFunc) (GtkObject *object, gint status, gpointer cal, gpointer data);
+
+static void
+marshal_cal_loaded (GtkObject *object, GtkSignalFunc func, gpointer data, GtkArg *args)
+{
+ CalLoadedFunc rfunc;
+
+ rfunc = (CalLoadedFunc) func;
+ (* rfunc) (object, GTK_VALUE_ENUM (args[0]), GTK_VALUE_POINTER (args[1]), data);
+}
+
+
+
/* CORBA servant implementation */
/* Listener::cal_loaded method */
static void
Listener_cal_loaded (PortableServer_Servant servant,
+ GNOME_Calendar_Listener_LoadStatus status,
GNOME_Calendar_Cal cal,
CORBA_Environment *ev)
{
CalListener *listener;
CalListenerPrivate *priv;
+ CORBA_Environment aev;
+ GNOME_Calendar_Cal cal_copy;
+ CalListenerLoadStatus load_status;
listener = CAL_LISTENER (gnome_object_from_servant (servant));
priv = listener->priv;
- priv->cal = CORBA_Object_duplicate (cal, ev);
- GNOME_Unknown_ref (priv->cal);
+ if (priv->cal != CORBA_OBJECT_NIL) {
+ g_message ("Listener_cal_loaded(): calendar was already loaded!");
+ return;
+ }
+
+ CORBA_exception_init (&aev);
+ cal_copy = CORBA_Object_duplicate (cal, &aev);
+
+ if (aev._major != CORBA_NO_EXCEPTION) {
+ g_message ("Listener_cal_loaded(): could not duplicate the calendar");
+ CORBA_exception_free (&aev);
+ return;
+ }
+ CORBA_exception_free (&aev);
+
+ priv->cal = cal_copy;
+
+ switch (status) {
+ GNOME_Calendar_Listener_SUCESSS:
+ load_status = CAL_LISTENER_LOAD_SUCCESS;
+ break;
+
+ GNOME_Calendar_Listener_ERROR:
+ load_status = CAL_LISTENER_LOAD_ERROR;
+ break;
+
+ default:
+ load_status = CAL_LISTENER_LOAD_ERROR; /* keep gcc happy */
+ g_assert_not_reached ();
+ }
+
gtk_signal_emit (GTK_OBJECT (listener), cal_listener_signals[CAL_LOADED],
- cal);
+ load_status, cal);
}
/* Listener::obj_added method */
@@ -281,20 +328,6 @@ cal_listener_get_epv (void)
-/* Returns whether a CORBA object is nil */
-static gboolean
-corba_object_is_nil (CORBA_Object object)
-{
- CORBA_Environment ev;
- gboolean retval;
-
- CORBA_exception_init (&ev);
- retval = CORBA_Object_is_nil (object, &ev);
- CORBA_exception_free (&ev);
-
- return retval;
-}
-
/**
* cal_listener_construct:
* @listener: A calendar listener.
@@ -310,7 +343,6 @@ cal_listener_construct (CalListener *listener, GNOME_Calendar_Listener corba_lis
{
g_return_val_if_fail (listener != NULL, NULL);
g_return_val_if_fail (IS_CAL_LISTENER (listener), NULL);
- g_return_val_if_fail (!corba_object_is_nil (corba_listener), NULL);
gnome_object_construct (GNOME_OBJECT (listener), corba_listener);
return listener;
@@ -363,14 +395,24 @@ CalListener *
cal_listener_new (void)
{
CalListener *listener;
+ CORBA_Environment ev;
GNOME_Calendar_Listener corba_listener;
+ gboolean result;
listener = gtk_type_new (CAL_LISTENER_TYPE);
+
corba_listener = cal_listener_corba_object_create (GNOME_OBJECT (listener));
- if (corba_object_is_nil (corba_listener)) {
+
+ CORBA_exception_init (&ev);
+ result = CORBA_Object_is_nil (corba_listener, &ev);
+
+ if (ev._major != CORBA_NO_EXCEPTION || result) {
+ g_message ("cal_listener_new(): could not create the CORBA listener");
gtk_object_destroy (listener);
+ CORBA_exception_free (&ev);
return NULL;
}
+ CORBA_exception_free (&ev);
return cal_listener_construct (listener, corba_listener);
}
diff --git a/calendar/cal-listener.h b/calendar/cal-listener.h
index 41665b2b58..c8d26dab80 100644
--- a/calendar/cal-listener.h
+++ b/calendar/cal-listener.h
@@ -40,6 +40,12 @@ BEGIN_GNOME_DECLS
typedef struct _CalListener CalListener;
typedef struct _CalListenerClass CalListenerClass;
+/* Load status for the cal_loaded signal. We need better error reporting. */
+typedef enum {
+ CAL_LISTENER_LOAD_SUCCESS,
+ CAL_LISTENER_LOAD_ERROR
+} CalListenerLoadStatus;
+
struct _CalListener {
GnomeObject object;
@@ -50,7 +56,9 @@ struct _CalListener {
struct _CalListenerClass {
GnomeObjectClass parent_class;
- void (* cal_loaded) (CalListener *listener, GNOME_Calendar_Cal cal);
+ void (* cal_loaded) (CalListener *listener,
+ CalListenerLoadStatus status,
+ GNOME_Calendar_Cal cal);
void (* obj_added) (CalListener *listener, GNOME_Calendar_CalObj calobj);
void (* obj_removed) (CalListener *listener, GNOME_Calendar_CalObjUID uid);
void (* obj_changed) (CalListener *listener, GNOME_Calendar_CalObj calobj);
diff --git a/calendar/evolution-calendar.idl b/calendar/evolution-calendar.idl
index 9ff87f62f6..390dfa1531 100644
--- a/calendar/evolution-calendar.idl
+++ b/calendar/evolution-calendar.idl
@@ -33,10 +33,16 @@ module Calendar {
/* Listener for changes in a calendar */
interface Listener : Unknown {
+ /* Return status when loading a calendar; we need better error reporting */
+ enum LoadStatus {
+ SUCESSS,
+ ERROR
+ };
+
/* Called from a CalFactory when a calendar is initially loaded
* or created. The listener must remember the cal object.
*/
- void cal_loaded (in Cal cal);
+ void cal_loaded (in LoadStatus status, in Cal cal);
/* Called from a Calendar when an object is added */
void obj_added (in CalObj calobj);
diff --git a/calendar/idl/evolution-calendar.idl b/calendar/idl/evolution-calendar.idl
index 9ff87f62f6..390dfa1531 100644
--- a/calendar/idl/evolution-calendar.idl
+++ b/calendar/idl/evolution-calendar.idl
@@ -33,10 +33,16 @@ module Calendar {
/* Listener for changes in a calendar */
interface Listener : Unknown {
+ /* Return status when loading a calendar; we need better error reporting */
+ enum LoadStatus {
+ SUCESSS,
+ ERROR
+ };
+
/* Called from a CalFactory when a calendar is initially loaded
* or created. The listener must remember the cal object.
*/
- void cal_loaded (in Cal cal);
+ void cal_loaded (in LoadStatus status, in Cal cal);
/* Called from a Calendar when an object is added */
void obj_added (in CalObj calobj);
diff --git a/calendar/pcs/cal-backend.c b/calendar/pcs/cal-backend.c
index 2fb523dc14..0d90e7a2dd 100644
--- a/calendar/pcs/cal-backend.c
+++ b/calendar/pcs/cal-backend.c
@@ -303,41 +303,36 @@ cal_backend_add_cal (CalBackend *backend, Cal *cal)
/**
* cal_backend_load:
* @backend: A calendar backend.
- * @str_uri: URI that contains the calendar data.
+ * @uri: URI that contains the calendar data.
*
* Loads a calendar backend with data from a calendar stored at the specified
* URI.
*
- * Return value: An operation result code.
+ * Return value: An operation status code.
**/
-CalBackendLoadResult
-cal_backend_load (CalBackend *backend, char *str_uri)
+CalBackendLoadStatus
+cal_backend_load (CalBackend *backend, GnomeVFSURI *uri)
{
CalBackendPrivate *priv;
- GnomeVFSURI *uri;
VObject *vobject;
g_return_val_if_fail (backend != NULL, CAL_BACKEND_LOAD_ERROR);
g_return_val_if_fail (IS_CAL_BACKEND (backend), CAL_BACKEND_LOAD_ERROR);
- g_return_val_if_fail (str_uri != NULL, CAL_BACKEND_LOAD_ERROR);
+ g_return_val_if_fail (uri != NULL, CAL_BACKEND_LOAD_ERROR);
priv = backend->priv;
g_return_val_if_fail (!priv->loaded, CAL_BACKEND_LOAD_ERROR);
- uri = gnome_vfs_uri_new (str_uri);
- if (!uri)
- return CAL_BACKEND_LOAD_ERROR;
-
vobject = Parse_MIME_FromURI (uri);
- if (!vobject) {
- gnome_vfs_uri_unref (uri);
+ if (!vobject)
return CAL_BACKEND_LOAD_ERROR;
- }
load_from_vobject (backend, vobject);
cleanVObject (vobject);
cleanStrTbl ();
+ gnome_vfs_uri_ref (uri);
+
priv->uri = uri;
priv->loaded = TRUE;
return CAL_BACKEND_LOAD_SUCCESS;
diff --git a/calendar/pcs/cal-backend.h b/calendar/pcs/cal-backend.h
index 14cc903ae6..cffc3c5cc3 100644
--- a/calendar/pcs/cal-backend.h
+++ b/calendar/pcs/cal-backend.h
@@ -41,7 +41,7 @@ BEGIN_GNOME_DECLS
typedef enum {
CAL_BACKEND_LOAD_SUCCESS, /* Loading OK */
CAL_BACKEND_LOAD_ERROR /* We need better error reporting in libversit */
-} CalBackendLoadResult;
+} CalBackendLoadStatus;
struct _CalBackend {
GtkObject object;
@@ -62,7 +62,7 @@ GnomeVFSURI *cal_backend_get_uri (CalBackend *backend);
void cal_backend_add_cal (CalBackend *backend, Cal *cal);
-CalBackendLoadResult cal_backend_load (CalBackend *backend, char *str_uri);
+CalBackendLoadStatus cal_backend_load (CalBackend *backend, GnomeVFSURI *uri);
diff --git a/calendar/pcs/cal-factory.c b/calendar/pcs/cal-factory.c
index 053baebe5c..75c281d235 100644
--- a/calendar/pcs/cal-factory.c
+++ b/calendar/pcs/cal-factory.c
@@ -20,6 +20,7 @@
*/
#include <config.h>
+#include "cal-backend.h"
#include "cal-factory.h"
#include "job.h"
@@ -27,7 +28,7 @@
/* Private part of the CalFactory structure */
typedef struct {
- /* Hash table from GnomeVFSURI structures to loaded calendars */
+ /* Hash table from GnomeVFSURI structures to CalBackend objects */
GHashTable *calendars;
} CalFactoryPrivate;
@@ -215,7 +216,33 @@ lookup_calendar (CalFactory *factory, GnomeVFSURI *uri)
static void
load_calendar (CalFactory *factory, GnomeVFSURI *uri, GNOME_Calendar_Listener listener)
{
- /* FIXME */
+ CalFactoryPrivate *priv;
+ CalBackend *backend;
+ CalBackendLoadStatus status;
+
+ priv = factory->priv;
+
+ backend = cal_backend_new ();
+ if (!backend) {
+ CORBA_Environment ev;
+
+ g_message ("load_calendar(): could not create the backend");
+
+ CORBA_exception_init (&ev);
+ GNOME_Calendar_Listener_cal_loaded (listener,
+ GNOME_Calendar_Listener_ERROR,
+ CORBA_OBJECT_NIL,
+ &ev);
+ if (ev._major != CORBA_NO_EXCEPTION) {
+ g_message ("load_calendar(): could not notify the listener");
+ CORBA_exception_free (&ev);
+ gtk_object_unref (backend);
+ return;
+ }
+ CORBA_exception_free (&ev);
+ }
+
+ status = cal_backend_load (backend, uri);
}
/* Adds a listener to a calendar */
@@ -250,10 +277,15 @@ load_fn (gpointer data)
g_free (jd->uri);
CORBA_exception_init (&ev);
- GNOME_Unknown_unref (jd->listener, &ev);
CORBA_Object_release (jd->listener, &ev);
+
+ if (ev._major != CORBA_NO_EXCEPTION)
+ g_message ("load_fn(): could not release the listener");
+
CORBA_exception_free (&ev);
+ /* Done */
+
g_free (jd);
}
@@ -303,6 +335,7 @@ cal_factory_corba_object_create (GnomeObject *object)
CORBA_exception_init (&ev);
POA_GNOME_Calendar_CalFactory__init ((PortableServer_Servant) servant, &ev);
+
if (ev._major != CORBA_NO_EXCEPTION) {
g_message ("cal_factory_corba_object_create(): could not init the servant");
g_free (servant);
@@ -334,16 +367,16 @@ cal_factory_new (void)
factory = gtk_type_new (CAL_FACTORY_TYPE);
corba_factory = cal_factory_corba_object_create (GNOME_OBJECT (factory));
+
CORBA_exception_init (&ev);
retval = CORBA_Object_is_nil (corba_factory, &ev);
if (ev._major != CORBA_NO_EXCEPTION || retval) {
- g_message ("cal_factory_new(): could not create the CORBA object");
+ g_message ("cal_factory_new(): could not create the CORBA factory");
gtk_object_unref (factory);
CORBA_exception_free (&ev);
return NULL;
}
-
CORBA_exception_free (&ev);
return cal_factory_construct (factory, corba_factory);
@@ -357,8 +390,8 @@ cal_factory_load (CalFactory *factory, const char *uri, GNOME_Calendar_Listener
GNOME_Calendar_Listener listener_copy;
CORBA_exception_init (&ev);
-
listener_copy = CORBA_Object_duplicate (listener, &ev);
+
if (ev._major != CORBA_NO_EXCEPTION) {
g_message ("cal_factory_load(): could not duplicate the listener");
CORBA_exception_free (&ev);