/* * corba-cal-factory.c: Service that provides access to the calendar repositories. * * Author: * Miguel de Icaza (miguel@gnu.org) */ #include #include #include #include #include "gnome-cal.h" #include "main.h" #include "alarm.h" #include "timeutil.h" #include "../libversit/vcc.h" #include #include #include "GnomeCal.h" #include "corba-cal-factory.h" #include "corba-cal.h" CORBA_ORB orb; PortableServer_POA poa; PortableServer_POAManager poa_manager; static POA_GNOME_GenericFactory__epv calendar_epv; static POA_GNOME_GenericFactory__vepv calendar_vepv; /* * Servant and Object Factory */ static POA_GNOME_GenericFactory calendar_servant; static GNOME_GenericFactory calendar_factory; static CORBA_boolean calendar_supports (PortableServer_Servant servant, CORBA_char * obj_goad_id, CORBA_Environment * ev) { if (strcmp (obj_goad_id, "IDL:GNOME:Calendar:Repository:1.0") == 0) return CORBA_TRUE; else return CORBA_FALSE; } static CORBA_Object calendar_create_object (PortableServer_Servant servant, CORBA_char *goad_id, const GNOME_stringlist *params, CORBA_Environment *ev) { GnomeCalendar *gcal; struct stat s; char *name; if (params->_length == 1) name = params->_buffer [0]; else name = NULL; if (strcmp (goad_id, "IDL:GNOME:Calendar:Repository:1.0") != 0){ CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_GenericFactory_CannotActivate, NULL); return CORBA_OBJECT_NIL; } gcal = gnome_calendar_locate (name); if (gcal != NULL) return CORBA_Object_duplicate (gcal->cal->corba_server, ev); if (stat (name, &s) != 0){ CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_GenericFactory_CannotActivate, NULL); return CORBA_OBJECT_NIL; } gcal = new_calendar ("", name, NULL, NULL, FALSE); return CORBA_Object_duplicate (gcal->cal->corba_server, ev); } void init_corba_server (void) { CORBA_Environment ev; CORBA_exception_init (&ev); poa_manager = PortableServer_POA__get_the_POAManager (poa, &ev); if (ev._major != CORBA_NO_EXCEPTION){ g_warning ("Can not get the POA manager"); CORBA_exception_free (&ev); return; } PortableServer_POAManager_activate (poa_manager, &ev); /* First create the locator for the repositories as a factory object */ calendar_vepv.GNOME_GenericFactory_epv = &calendar_epv; calendar_epv.supports = calendar_supports; calendar_epv.create_object = calendar_create_object; calendar_servant.vepv = &calendar_vepv; POA_GNOME_GenericFactory__init ((PortableServer_Servant) &calendar_servant, &ev); CORBA_free (PortableServer_POA_activate_object ( poa, (PortableServer_Servant)&calendar_servant, &ev)); calendar_factory = PortableServer_POA_servant_to_reference ( poa, (PortableServer_Servant) &calendar_servant, &ev); goad_server_register ( CORBA_OBJECT_NIL, calendar_factory, "IDL:GNOME:Calendar:RepositoryLocator:1.0", "object", &ev); CORBA_exception_free (&ev); } void unregister_calendar_services (void) { CORBA_Environment ev; CORBA_exception_init (&ev); goad_server_unregister ( CORBA_OBJECT_NIL, "IDL:GNOME:Calendar:RepositoryLocator:1.0", "object", &ev); CORBA_exception_free (&ev); }