/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Author:
* Bertrand Guiheneuf (bg@aful.org)
*
* Dumped from bonobo/bonobo-persist-stream.c
*
* (C) 2000 Helix Code, Inc.
*/
/*
* 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 <gtk/gtksignal.h>
#include <gtk/gtkmarshal.h>
#include "evolution-service-repository.h"
/* Parent class */
static BonoboObjectClass *evolution_service_repository_parent_class;
/* CORBA implementation Entry Point Vector */
POA_Evolution_ServiceRepository__vepv evolution_service_repository_vepv;
/*
*function assigned to the
* Evolution::ServiceRepository::set_shell
* method.
* This function calls the set_shell_fn in
* the EvolutionServiceRepository
*/
static void
impl_set_shell (PortableServer_Servant servant,
Evolution_Shell shell,
CORBA_Environment *ev)
{
BonoboObject *object = bonobo_object_from_servant (servant);
EvolutionServiceRepository *sr = EVOLUTION_SERVICE_REPOSITORY (object);
if (sr->set_shell_fn != NULL) {
(*sr->set_shell_fn)(sr, shell, sr->closure);
} else {
GtkObjectClass *oc = GTK_OBJECT (sr)->klass;
EvolutionServiceRepositoryClass *class = EVOLUTION_SERVICE_REPOSITORY_CLASS (oc);
(*class->set_shell)(sr, shell);
}
}
/**
* evolution_service_repository_get_epv:
* create and initialize the ServiceRepository
* epv.
*/
POA_Evolution_ServiceRepository__epv *
evolution_service_repository_get_epv (void)
{
POA_Evolution_ServiceRepository__epv *epv;
epv = g_new0 (POA_Evolution_ServiceRepository__epv, 1);
epv->set_shell = impl_set_shell;
return epv;
}
/* create the Evolution_ServiceRepository vepv */
static void
init_service_repository_corba_class (void)
{
/* create the Bonobo interface epv */
evolution_service_repository_vepv.Bonobo_Unknown_epv =
bonobo_object_get_epv ();
/* create the ServiceRepository interface epv.
* Defined above */
evolution_service_repository_vepv.Evolution_ServiceRepository_epv =
evolution_service_repository_get_epv ();
}
/* default implementation for the ::set_shell method */
static void
evolution_service_repository_set_shell_default (EvolutionServiceRepository *service_repository,
Evolution_Shell shell)
{
/* do nothing */
}
static void
evolution_service_repository_destroy (GtkObject *object)
{
GTK_OBJECT_CLASS (evolution_service_repository_parent_class)->destroy (object);
}
/* initialize the Gtk object class */
static void
evolution_service_repository_class_init (EvolutionServiceRepositoryClass *klass)
{
GtkObjectClass *object_class = (GtkObjectClass *) klass;
evolution_service_repository_parent_class = gtk_type_class (bonobo_object_get_type ());
/*
* Override and initialize methods
*/
object_class->destroy = evolution_service_repository_destroy;
klass->set_shell = evolution_service_repository_set_shell_default;
/* create the corba class */
init_service_repository_corba_class ();
}
static void
evolution_service_repository_init (EvolutionServiceRepository *service_repository)
{
}
/**
* evolution_service_repository_get_type:
*
* Returns: the GtkType for the EvolutionServiceRepository class.
*/
GtkType
evolution_service_repository_get_type (void)
{
static GtkType type = 0;
if (!type){
GtkTypeInfo info = {
"EvolutionServiceRepository",
sizeof (EvolutionServiceRepository),
sizeof (EvolutionServiceRepositoryClass),
(GtkClassInitFunc) evolution_service_repository_class_init,
(GtkObjectInitFunc) evolution_service_repository_init,
NULL, /* reserved 1 */
NULL, /* reserved 2 */
(GtkClassInitFunc) NULL
};
type = gtk_type_unique (bonobo_object_get_type (), &info);
}
return type;
}
/**
* evolution_service_repository_construct: construct the object
* @sr: the gtk service repository object to construct
* @corba_service_repository: the corresponding corba object
* @set_shell_fn: the ::set_shell implementation for this object
* @closure: data to pass to the set_shell operation
*
* This construct an EvolutionServiceRepository object.
* The caller can give the function that will implement
* the Corba interface. If those methods are %NULL then the
* default class method will be called instead.
*
* Return value: The constructed service repository.
**/
EvolutionServiceRepository *
evolution_service_repository_construct (EvolutionServiceRepository *sr,
Evolution_ServiceRepository corba_service_repository,
EvolutionServiceRepositorySetShellFn set_shell_fn,
void *closure)
{
g_return_val_if_fail (sr != NULL, NULL);
g_return_val_if_fail (EVOLUTION_IS_SERVICE_REPOSITORY (sr), NULL);
g_return_val_if_fail (corba_service_repository != CORBA_OBJECT_NIL, NULL);
bonobo_object_construct (BONOBO_OBJECT (sr),
corba_service_repository);
sr->closure = closure;
sr->set_shell_fn = set_shell_fn;
return sr;
}
/*
* construct the corba
* Evolution_ServiceRepository object
*/
static Evolution_ServiceRepository
create_evolution_service_repository (BonoboObject *object)
{
POA_Evolution_ServiceRepository *servant;
CORBA_Environment ev;
/* create a servant */
servant = (POA_Evolution_ServiceRepository *) g_new0 (BonoboObjectServant, 1);
/* initialize its virtual entry point vector */
servant->vepv = &evolution_service_repository_vepv;
CORBA_exception_init (&ev);
/* initialise the servant */
POA_Evolution_ServiceRepository__init ((PortableServer_Servant) servant, &ev);
if (ev._major != CORBA_NO_EXCEPTION){
g_free (servant);
CORBA_exception_free (&ev);
return CORBA_OBJECT_NIL;
}
CORBA_exception_free (&ev);
/* activate it and return */
return (Evolution_ServiceRepository) bonobo_object_activate_servant (object, servant);
}
/**
* evolution_service_repository_new: create a new EvolutionServiceRepository object
* @set_shell_fn: The ::set_shell method
* @closure: The data passed to the ::set_shell method
*
* Create a full EvolutionServiceRepository. Also create the correspoding
* servant. The ::set_shell method calls set_shell_fn unless set_shell_fn
* is %NULL, in which case, the class default method is called.
*
* Return value: The newly created EvolutionServiceRepository object
**/
EvolutionServiceRepository *
evolution_service_repository_new (EvolutionServiceRepositorySetShellFn set_shell_fn,
void *closure)
{
Evolution_ServiceRepository corba_sr;
EvolutionServiceRepository *sr;
/* create the gtk object */
sr = gtk_type_new (evolution_service_repository_get_type ());
/* create the Corba object */
corba_sr = create_evolution_service_repository (
BONOBO_OBJECT (sr));
/* check for an error in the creation of the corba object */
if (corba_sr == CORBA_OBJECT_NIL){
gtk_object_destroy (GTK_OBJECT (sr));
return NULL;
}
/* construct the object */
evolution_service_repository_construct (sr, corba_sr, set_shell_fn, closure);
return sr;
}