/* Evolution calendar - Live search query listener convenience object * * Copyright (C) 2001 Ximian, Inc. * * Author: Federico Mena-Quintero * * 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 #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; }