һ����ʵ�ķ����� : ���յ� !!

�ֹ������е���

����һ�Σ����ǽ����� FruitsBasket::Apple ��������������Ҫ׼���ˣ�������Ǵ���: ���в��ֶ��Ѿ����������о����ˡ�

#include <orb/orbit.h>
#include <ORBitservices/CosNaming.h>

void MyEatMe (PortableServer_Servant servant, 
CORBA_Environment * ev)
{
/* ���������Լ�����Ӧ�Ķ���ʵ�ֵĴ��� */
}
void MyThrowMe (PortableServer_Servant servant, 
CORBA_Environment * ev)
{
/* ���������Լ�����Ӧ�Ķ���ʵ�ֵĴ��� */
}

PortableServer_ServantBase__epv base_epv {
	NULL, /* �ض��� ORB ������ */
	NULL, /* ��ֹ���� */
	NULL  /* ȱʡ POA */
}

POA_FruitsBasket_Apple__epv Apple_epv {
	NULL,    /* �ض��� ORB ������ */
	MyEatMe,
	MyThrowMe
};

POA_FruitsBasket_Apple__vepv Apple_vepv {
	&base_epv,
	&Apple_epv
};

POA_FruitsBasket_Apple Apple_servant = {
	NULL,
	&Apple_vpev
};

int main (int argc, char **argv)
{
CORBA_Environment ev;
CORBA_ORB orb;
PortableServer_POA poa;
/* ����ʹ��ȱʡ�IJ��� */
CORBA_PolicyList policy_list = {0, 0, NULL}; 
PortableServer_POA root_poa;
PortableServer_POAManager root_poa_manager;
ObjectId *obj_id;
CORBA_Object obj;
CosNaming_NamingContext *root_name;
CosNaming_NameComponent name_component[1] = { {"MyApple", "server"} };
CosNaming_Name name = {1, 1, name_component, CORBA_FALSE};

/* ��ʼ�� ORB ���ʹ�
CORBA_exception_init (&ev);
orb = CORBA_ORB_init (&argc,
	argv, 
	"orbit-local-orb", 
	&ev);

POA_FruitsBasket_Apple__init (orb, 
	Apple_servant, 
	&ev);
if (ev->_major != CORBA_NO_EXCEPTION) {
	fprintf (stderr, 
		"Error: exception during Servant initialization: %s\n", 
		CORBA_exception_id(&ev));
	exit (1);
}

/* ��ʼ�� POA */
root_poa = CORBA_ORB_resolve_initial_references (orb, 
	"RootPOA", 
	&ev);
root_poa_manager = PortableServer_POA_get_the_POAManager (root_poa, 
	&ev);
PortableServer_POAManager_activate (root_poa_manager, 
	&ev);
PortableServer_POA_create_poa (root_poa, 
	"my_own_poa", 
	root_poa_manager, 
	policy_list, 
	&ev);
poa = PortableServer_POA_find_poa (root_poa, 
	"my_own_poa", 
	&ev);
if (ev->_major != CORBA_NO_EXCEPTION) {
	fprintf (stderr, 
		"Error: exception during POA initialization: %s\n", 
		CORBA_exception_id(&ev));
	CORBA_exception_free (&ev);
	exit (1);
}


/* ������� */
obj_id = PortableServer_POA_activate_object (poa,
	&Apple_servant,
	&ev);
/* �õ��������� */
obj = PortableServer_POA_id_to_reference (poa,
	obj_id,
	&ev);

/* ������������ע�� */
root_name = CORBA_ORB_resolve_initial_service (orb, 
	"NameService", 
	&ev);
if (ev->_major != CORBA_NO_EXCEPTION) {
	fprintf (stderr, 
		"Error: could not get name service: %s\n", 
		CORBA_exception_id(&ev));
	exit (1);
}
CosNaming_NamingContext_bind (root_amp, 
	&name, 
	obj, 
	&ev);
if (ev->_major != CORBA_NO_EXCEPTION) {
	fprintf (stderr, 
		"Error: could register object: %s\n", 
		CORBA_exception_id(&ev));
	exit (1);
}
CORBA_free (root_poa);
CORBA_exception_free (&ev);
/* pfew !! here we are !! */

return 0;
}

ORBit �Ŀ��

���뿴�����зdz����Ե�һ����: ���˶��󷽷��ĺ���ʵ�֣������������ض��� FruitsBasket::Apple �ӿڵ�(���Ƿdz�������)�� ������Щ����������κ��������ӿڵ�������������ʹ�á�

�����Ϊʲô ORBit �ṩ��һ�����׵�;���������Զ��������һ���һ����������͵Ĵ��롣 --skeleton-impl ѡ�����һ�������������������� C �ļ���������Ϊ��� FruitsBasket::Apple �ӿڵĵ����ɵ�������롣

#include "apple.h"

/*** App-specific servant structures ***/
typedef struct {
	POA_FruitsBasket_Apple servant;
	PortableServer_POA poa;

} impl_POA_FruitsBasket_Apple;

/*** Implementation stub prototypes ***/
static void impl_FruitsBasket_Apple__destroy(impl_POA_FruitsBasket_Apple * servant,
	CORBA_Environment * ev);
static void
impl_FruitsBasket_Apple_EatMe(impl_POA_FruitsBasket_Apple * servant,
	CORBA_Environment * ev);

static void
impl_FruitsBasket_Apple_ThrowMe(impl_POA_FruitsBasket_Apple * servant,
	CORBA_Environment * ev);

/*** epv structures ***/
static PortableServer_ServantBase__epv impl_FruitsBasket_Apple_base_epv =
{
	NULL,			/* _private data */
	NULL,			/* finalize routine */
	NULL,			/* default_POA routine */
};
static POA_FruitsBasket_Apple__epv impl_FruitsBasket_Apple_epv =
{
	NULL,			/* _private */
	(gpointer) & impl_FruitsBasket_Apple_EatMe,
	(gpointer) & impl_FruitsBasket_Apple_ThrowMe,

};

/*** vepv structures ***/
static POA_FruitsBasket_Apple__vepv impl_FruitsBasket_Apple_vepv =
{
	&impl_FruitsBasket_Apple_base_epv,
	&impl_FruitsBasket_Apple_epv,
};

/*** Stub implementations ***/
static FruitsBasket_Apple
impl_FruitsBasket_Apple__create(PortableServer_POA poa, 
	CORBA_Environment * ev)
{
FruitsBasket_Apple retval;
impl_POA_FruitsBasket_Apple *newservant;
PortableServer_ObjectId *objid;

newservant = g_new0(impl_POA_FruitsBasket_Apple, 1);
newservant->servant.vepv = &impl_FruitsBasket_Apple_vepv;
newservant->poa = poa;
POA_FruitsBasket_Apple__init((PortableServer_Servant) newservant, ev);
objid = PortableServer_POA_activate_object(poa, newservant, ev);
CORBA_free(objid);
retval = PortableServer_POA_servant_to_reference(poa, newservant, ev);

return retval;
}

static void
impl_FruitsBasket_Apple__destroy(impl_POA_FruitsBasket_Apple * servant,
				 CORBA_Environment * ev)
{
PortableServer_ObjectId *objid;

objid = PortableServer_POA_servant_to_id(servant->poa, servant, ev);
PortableServer_POA_deactivate_object(servant->poa, objid, ev);
CORBA_free(objid);

POA_FruitsBasket_Apple__fini((PortableServer_Servant) servant, ev);
g_free(servant);
}

static void
impl_FruitsBasket_Apple_EatMe(impl_POA_FruitsBasket_Apple * servant,
			      CORBA_Environment * ev)
{
}

static void
impl_FruitsBasket_Apple_ThrowMe(impl_POA_FruitsBasket_Apple * servant,
				CORBA_Environment * ev)
{
}

��

ʣ�µ�Ψһ���������ʵ��һ������ create �����ͳ�ʼ��һЩ����...�� main ������

ע���������ʹ��������һ�½���������Ǹ����ţ�����ͨ���������ֽṹ�ķ�ʽ�� PortableServer_POA POA �������ʹ��ϡ�

typedef struct {
	POA_FruitsBasket_Apple servant;
	PortableServer_POA poa;

} impl_POA_FruitsBasket_Apple;