Files
evolution/calendar/cal.c
Federico Mena Quintero ca082de77a Added get_uids() method to get a list of UIDs based on object types.
2000-02-08  Federico Mena Quintero  <federico@helixcode.com>

	* evolution-calendar.idl (Cal): Added get_uids() method to get a
	list of UIDs based on object types.

	* cal-backend.c (cal_backend_get_uids): Implemented get_uids() in
	the backend.

	* cal.c (Cal_get_uids): Implemented get_uids() method.

	* cal-client.c (cal_client_get_uids): Implemented client-side
	function.

	* cal-util.c (cal_obj_instance_list_free): Doh.  Free the list,
	not the last link.
	(cal_obj_uid_list_free): New function to free a list of UIDs.

	* GnomeCal.idl (Repository): Removed unused method
	get_object_by_id_list().  This is just for cleanup purposes and to
	remind me exactly of what needs to be moved over to
	evolution-calendar.idl.
	(Repository): Removed unused get_objects() method.

	* corba-cal.c (init_calendar_repo_class): Removed the unused
	get_objects method.

	* calobj.h (CalObjFindStatus): New status value enumeration for
	the find function.

	* calobj.c (ical_object_find_in_string): New function to parse a
	complete calendar and find a calendar object in it.  This should
	be used instead ical_object_new_from_string() in the future.

	* evolution-calendar.idl (CalObjInstance): Added an uid field.
	Now the idea is that whenever calendar object strings are passed
	around, their UIDs are passed along with them so that the actual
	object can be pulled from the whole VCAL object using its UID to
	identify it.

	* cal-util.h (CalObjInstance): Added uid field.

	* cal-util.c (cal_obj_instance_list_free): Free the UIDs.

	* cal-backend.c (build_event_list): Store the object's UID in the
	instance structure.

	* cal.c (Cal_get_events_in_range): Copy the UID field to the CORBA
	structure.

	* cal-client.c (cal_client_get_events_in_range): Copy the UID
	field from the CORBA structure.

	* main.c (gnome_cal_file_menu): Removed unfinished html-month stuff.

	* Makefile.am (gnomecal_SOURCES): Removed html-month.c.

	* gnome-cal.c: #include "alarm.h"
	(mail_notify): Made static.

	* alarm.h: #include "calobj.h"

	* corba-cal-factory.h (init_corba_server): Fixed prototype.

	* quick-view.c (create_items_for_event): Made static.

	* gncal-todo.c (column_resized): Made static.

	* layout.c (find_index): Made static.

svn path=/trunk/; revision=1699
2000-02-09 08:04:33 +00:00

455 lines
11 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Evolution calendar client interface object
*
* Copyright (C) 2000 Helix Code, Inc.
*
* Author: Federico Mena-Quintero <federico@helixcode.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#include <config.h>
#include "cal.h"
#include "cal-backend.h"
/* Private part of the Cal structure */
typedef struct {
/* Our backend */
CalBackend *backend;
/* Listener on the client we notify */
Evolution_Calendar_Listener listener;
} CalPrivate;
static void cal_class_init (CalClass *class);
static void cal_init (Cal *cal);
static void cal_destroy (GtkObject *object);
static POA_Evolution_Calendar_Cal__vepv cal_vepv;
static BonoboObjectClass *parent_class;
/**
* cal_get_type:
* @void:
*
* Registers the #Cal class if necessary, and returns the type ID associated to
* it.
*
* Return value: The type ID of the #Cal class.
**/
GtkType
cal_get_type (void)
{
static GtkType cal_type = 0;
if (!cal_type) {
static const GtkTypeInfo cal_info = {
"Cal",
sizeof (Cal),
sizeof (CalClass),
(GtkClassInitFunc) cal_class_init,
(GtkObjectInitFunc) cal_init,
NULL, /* reserved_1 */
NULL, /* reserved_2 */
(GtkClassInitFunc) NULL
};
cal_type = gtk_type_unique (BONOBO_OBJECT_TYPE, &cal_info);
}
return cal_type;
}
/* CORBA class initialzation function for the calendar */
static void
init_cal_corba_class (void)
{
cal_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv ();
cal_vepv.Evolution_Calendar_Cal_epv = cal_get_epv ();
}
/* Class initialization function for the calendar */
static void
cal_class_init (CalClass *class)
{
GtkObjectClass *object_class;
object_class = (GtkObjectClass *) class;
parent_class = gtk_type_class (BONOBO_OBJECT_TYPE);
object_class->destroy = cal_destroy;
init_cal_corba_class ();
}
/* Object initialization function for the calendar */
static void
cal_init (Cal *cal)
{
CalPrivate *priv;
priv = g_new0 (CalPrivate, 1);
cal->priv = priv;
priv->listener = CORBA_OBJECT_NIL;
}
/* Destroy handler for the calendar */
static void
cal_destroy (GtkObject *object)
{
Cal *cal;
CalPrivate *priv;
CORBA_Environment ev;
g_return_if_fail (object != NULL);
g_return_if_fail (IS_CAL (object));
cal = CAL (object);
priv = cal->priv;
CORBA_exception_init (&ev);
CORBA_Object_release (priv->listener, &ev);
if (ev._major != CORBA_NO_EXCEPTION)
g_message ("cal_destroy(): could not release the listener");
CORBA_exception_free (&ev);
g_free (priv);
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
/* CORBA servant implementation */
/* Cal::get_uri method */
static CORBA_char *
Cal_get_uri (PortableServer_Servant servant,
CORBA_Environment *ev)
{
Cal *cal;
CalPrivate *priv;
GnomeVFSURI *uri;
char *str_uri;
CORBA_char *str_uri_copy;
cal = CAL (bonobo_object_from_servant (servant));
priv = cal->priv;
uri = cal_backend_get_uri (priv->backend);
str_uri = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE);
str_uri_copy = CORBA_string_dup (str_uri);
g_free (str_uri);
return str_uri_copy;
}
/* Cal::get_object method */
static Evolution_Calendar_CalObj
Cal_get_object (PortableServer_Servant servant,
const Evolution_Calendar_CalObjUID uid,
CORBA_Environment *ev)
{
Cal *cal;
CalPrivate *priv;
char *calobj;
cal = CAL (bonobo_object_from_servant (servant));
priv = cal->priv;
calobj = cal_backend_get_object (priv->backend, uid);
if (calobj) {
CORBA_char *calobj_copy;
calobj_copy = CORBA_string_dup (calobj);
g_free (calobj);
return calobj_copy;
} else {
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
ex_Evolution_Calendar_Cal_NotFound,
NULL);
return NULL;
}
}
/* Cal::get_uids method */
static Evolution_Calendar_CalObjUIDSeq *
Cal_get_uids (PortableServer_Servant servant,
const Evolution_Calendar_CalObjType type,
CORBA_Environment *ev)
{
Cal *cal;
CalPrivate *priv;
GList *uids, *l;
Evolution_Calendar_CalObjUIDSeq *seq;
int t;
int n, i;
cal = CAL (bonobo_object_from_servant (servant));
priv = cal->priv;
/* Translate the CORBA flags to our own flags */
t = (((type & Evolution_Calendar_TYPE_EVENT) ? CALOBJ_TYPE_EVENT : 0)
| ((type & Evolution_Calendar_TYPE_TODO) ? CALOBJ_TYPE_TODO : 0)
| ((type & Evolution_Calendar_TYPE_JOURNAL) ? CALOBJ_TYPE_JOURNAL : 0)
| ((type & Evolution_Calendar_TYPE_OTHER) ? CALOBJ_TYPE_OTHER : 0)
| ((type & Evolution_Calendar_TYPE_ANY) ? CALOBJ_TYPE_ANY : 0));
uids = cal_backend_get_uids (priv->backend, t);
n = g_list_length (uids);
seq = Evolution_Calendar_CalObjUIDSeq__alloc ();
seq->_length = n;
seq->_buffer = CORBA_sequence_Evolution_Calendar_CalObjUID_allocbuf (n);
/* Fill the sequence */
for (i = 0, l = uids; l; i++, l = l->next) {
char *uid;
uid = l->data;
seq->_buffer[i] = CORBA_string_dup (uid);
}
/* Done */
cal_obj_uid_list_free (uids);
return seq;
}
/* Cal::get_events_in_range method */
static Evolution_Calendar_CalObjInstanceSeq *
Cal_get_events_in_range (PortableServer_Servant servant,
const Evolution_Calendar_Time_t start,
const Evolution_Calendar_Time_t end,
CORBA_Environment *ev)
{
Cal *cal;
CalPrivate *priv;
time_t t_start, t_end;
Evolution_Calendar_CalObjInstanceSeq *seq;
GList *elist, *l;
int n, i;
cal = CAL (bonobo_object_from_servant (servant));
priv = cal->priv;
t_start = (time_t) start;
t_end = (time_t) end;
if (t_start > t_end || t_start == -1 || t_end == -1) {
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
ex_Evolution_Calendar_Cal_InvalidRange,
NULL);
return NULL;
}
/* Figure out the list and allocate the sequence */
elist = cal_backend_get_events_in_range (priv->backend, t_start, t_end);
n = g_list_length (elist);
seq = Evolution_Calendar_CalObjInstanceSeq__alloc ();
seq->_length = n;
seq->_buffer = CORBA_sequence_Evolution_Calendar_CalObjInstance_allocbuf (n);
/* Fill the sequence */
for (i = 0, l = elist; l; i++, l = l->next) {
CalObjInstance *icoi;
Evolution_Calendar_CalObjInstance *corba_icoi;
icoi = l->data;
corba_icoi = &seq->_buffer[i];
corba_icoi->uid = CORBA_string_dup (icoi->uid);
corba_icoi->calobj = CORBA_string_dup (icoi->calobj);
corba_icoi->start = icoi->start;
corba_icoi->end = icoi->end;
}
/* Done */
cal_obj_instance_list_free (elist);
return seq;
}
/**
* cal_get_epv:
* @void:
*
* Creates an EPV for the Cal CORBA class.
*
* Return value: A newly-allocated EPV.
**/
POA_Evolution_Calendar_Cal__epv *
cal_get_epv (void)
{
POA_Evolution_Calendar_Cal__epv *epv;
epv = g_new0 (POA_Evolution_Calendar_Cal__epv, 1);
epv->_get_uri = Cal_get_uri;
epv->get_object = Cal_get_object;
epv->get_uids = Cal_get_uids;
epv->get_events_in_range = Cal_get_events_in_range;
return epv;
}
/**
* cal_construct:
* @cal: A calendar client interface.
* @corba_cal: CORBA object for the calendar.
* @backend: Calendar backend that this @cal presents an interface to.
* @listener: Calendar listener for notification.
*
* Constructs a calendar client interface object by binding the corresponding
* CORBA object to it. The calendar interface is bound to the specified
* @backend, and will notify the @listener about changes to the calendar.
*
* Return value: The same object as the @cal argument.
**/
Cal *
cal_construct (Cal *cal,
Evolution_Calendar_Cal corba_cal,
CalBackend *backend,
Evolution_Calendar_Listener listener)
{
CalPrivate *priv;
CORBA_Environment ev;
g_return_val_if_fail (cal != NULL, NULL);
g_return_val_if_fail (IS_CAL (cal), NULL);
g_return_val_if_fail (backend != NULL, NULL);
g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL);
priv = cal->priv;
CORBA_exception_init (&ev);
priv->listener = CORBA_Object_duplicate (listener, &ev);
if (ev._major != CORBA_NO_EXCEPTION) {
g_message ("cal_construct: could not duplicate the listener");
priv->listener = CORBA_OBJECT_NIL;
CORBA_exception_free (&ev);
return NULL;
}
CORBA_exception_free (&ev);
priv->backend = backend;
bonobo_object_construct (BONOBO_OBJECT (cal), corba_cal);
return cal;
}
/**
* cal_corba_object_create:
* @object: #BonoboObject that will wrap the CORBA object.
*
* Creates and activates the CORBA object that is wrapped by the specified
* calendar client interface @object.
*
* Return value: An activated object reference or #CORBA_OBJECT_NIL in case of
* failure.
**/
Evolution_Calendar_Cal
cal_corba_object_create (BonoboObject *object)
{
POA_Evolution_Calendar_Cal *servant;
CORBA_Environment ev;
g_return_val_if_fail (object != NULL, CORBA_OBJECT_NIL);
g_return_val_if_fail (IS_CAL (object), CORBA_OBJECT_NIL);
servant = (POA_Evolution_Calendar_Cal *) g_new0 (BonoboObjectServant, 1);
servant->vepv = &cal_vepv;
CORBA_exception_init (&ev);
POA_Evolution_Calendar_Cal__init ((PortableServer_Servant) servant, &ev);
if (ev._major != CORBA_NO_EXCEPTION) {
g_message ("cal_corba_object_create(): could not init the servant");
g_free (servant);
CORBA_exception_free (&ev);
return CORBA_OBJECT_NIL;
}
CORBA_exception_free (&ev);
return (Evolution_Calendar_Cal) bonobo_object_activate_servant (object, servant);
}
/**
* cal_new:
* @backend: A calendar backend.
* @listener: A calendar listener.
*
* Creates a new calendar client interface object and binds it to the specified
* @backend and @listener objects.
*
* Return value: A newly-created #Cal calendar client interface object, or NULL
* if its corresponding CORBA object could not be created.
**/
Cal *
cal_new (CalBackend *backend, Evolution_Calendar_Listener listener)
{
Cal *cal, *retval;
Evolution_Calendar_Cal corba_cal;
CORBA_Environment ev;
gboolean ret;
g_return_val_if_fail (backend != NULL, NULL);
g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL);
cal = CAL (gtk_type_new (CAL_TYPE));
corba_cal = cal_corba_object_create (BONOBO_OBJECT (cal));
CORBA_exception_init (&ev);
ret = CORBA_Object_is_nil ((CORBA_Object) corba_cal, &ev);
if (ev._major != CORBA_NO_EXCEPTION || ret) {
g_message ("cal_new(): could not create the CORBA object");
gtk_object_unref (GTK_OBJECT (cal));
CORBA_exception_free (&ev);
return NULL;
}
CORBA_exception_free (&ev);
retval = cal_construct (cal, corba_cal, backend, listener);
if (!retval) {
g_message ("cal_new(): could not construct the calendar client interface");
gtk_object_unref (GTK_OBJECT (cal));
return NULL;
}
return retval;
}