�����Ӵ�������������һ��ʵ�ʵĿɹ����ķ������Ľ�һ�����⣬ʹ�������� ORBit ��֧�֡�
ϵͳ�������ܶࡣ������ֻ�ṩ�������ܣ�һ�����������ļӷ�һ�����������ļ�������һ��������������Ϊ������д IDL �ļ��������ǵ��������Ƿdz��ġ�
Example 5-3. ������ IDL �ļ�
interface Calculator { double add(in double number1, in double number2); double sub(in double number1, in double number2); };
������������ɿ��(skeleton)�ʹ��(stub)�ļ������������ļ�֮�� ORBit IDL ������һ�������ļ���һ��ͷ�ļ��������ļ�ʵ���ڴ�������ܺ��������飬�Կͻ��ͷ����������á����� C Դ�ļ����������зdz���$ orbit-idl --skeleton-impl calculator.idl ������������Ҫ�õ������ļ���
��һ���������������д�������Ϳͻ��������Ǵӿͻ���ʼ����Ϊ������Щ��
һ���Ŀͻ�ʵ�ֿ����������ģ�
Example 5-4. �������ͻ� C Դ�ļ�
#include "orb/orbit.h" #include "calculator.h" #include <stdio.h> int main(int argc, char* argv[]) { CORBA_Environment ev; CORBA_ORB orb; CORBA_Object server; CORBA_double res; gchar* dummy_argv[2]; gint dummy_argc; dummy_argc = 1; dummy_argv[0] = argv[0]; dummy_argv[1] = 0; CORBA_exception_init(&ev); orb = CORBA_ORB_init(&dummy_argc, dummy_argv, "orbit-local-orb", &ev); server = CORBA_ORB_string_to_object(orb, argv[1], &ev); res = Calculator_add(server,1.0, 2.0, &ev); fprintf(stdout,"1.0 + 2.0 = %2.0f\n", res); CORBA_Object_release(server,&ev); exit(0); }
�dz�����ȫ��δ�ӽ��͵IJ��ϡ������ȿ�һ�¶���ı�����
�����������ȫ���ܵĿͻ���������ӵ��ؾ��ǰ� argv[1] �������ݸ� CORBA_ORB_string_to_object �������Դ˵Ľ���Ϊ����������Ա�ʾ���������������ַ���Ϊ��һ�������������õġ���λ������ַ�����������һ��������������
����ʵ�ַ�������IDL ������Ϊ�����˴����Ĺ���������Ϊ������ʵ��ɢ�����������ݽṹ�ͺ������ñ���IJ��ϡ����������д����������������е�������Щ���ϣ��Լ������ķ���������ʵ�֡������ҽ��ṩ IDL ���������ɵĺ��������ݽṹ�������ҽ�չʾΪʹ��Щ������ȷ�Ĺ������������õĻ�������Щ��
Ϊ�˼���ʵ�ּ����������� ORBit IDL ���������һ����������ʵ�ֿ�ܡ���ͨ���� IDL ������һ�� --skeleton-impl ����(ѡ��)���������ɵġ� orbit-idl --skeleton-impl calculator.idl ������������������(���ɵ�Դ�ļ���ȱʡ�������� calculator-skelimpl.c ��������������б�������Ϊ calculator-impl.c )��
Example 5-5. ������ʵ�ֿ��
#include "calculator.h" /*** App-specific servant structures Ӧ�ó���ָ�����ʹӽṹ ***/ typedef struct { POA_Calculator servant; PortableServer_POA poa; } impl_POA_Calculator; /*** Implementation stub prototypes ʵ�ִ��ԭ�� ***/ static void impl_Calculator__destroy(impl_POA_Calculator * servant, CORBA_Environment * ev); CORBA_double impl_Calculator_add(impl_POA_Calculator * servant, CORBA_double number1, CORBA_double number2, CORBA_Environment * ev); CORBA_double impl_Calculator_sub(impl_POA_Calculator * servant, CORBA_double number1, CORBA_double number2, CORBA_Environment * ev); /*** epv structures epv �ṹ ***/ static PortableServer_ServantBase__epv impl_Calculator_base_epv = { NULL, /* _private data */ (gpointer) & impl_Calculator__destroy, /* finalize routine */ NULL, /* default_POA routine */ }; static POA_Calculator__epv impl_Calculator_epv = { NULL, /* _private */ (gpointer) & impl_Calculator_add, (gpointer) & impl_Calculator_sub, }; /*** vepv structures vepv �ṹ ***/ static POA_Calculator__vepv impl_Calculator_vepv = { &impl_Calculator_base_epv, &impl_Calculator_epv, }; /*** Stub implementations ���ʵ�� ***/ static Calculator impl_Calculator__create(PortableServer_POA poa, CORBA_Environment * ev) { Calculator retval; impl_POA_Calculator *newservant; PortableServer_ObjectId *objid; newservant = g_new0(impl_POA_Calculator, 1); newservant->servant.vepv = &impl_Calculator_vepv; newservant->poa = poa; POA_Calculator__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; } /* * You shouldn't call this routine directly without first deactivating the servant... * ����ֹ�ʹӾͲ���ֱ�ӵ���������� */ static void impl_Calculator__destroy(impl_POA_Calculator * servant, CORBA_Environment * ev) { POA_Calculator__fini((PortableServer_Servant) servant, ev); g_free(servant); } CORBA_double impl_Calculator_add(impl_POA_Calculator * servant, CORBA_double number1, CORBA_double number2, CORBA_Environment * ev) { CORBA_double retval; return retval; } CORBA_double impl_Calculator_sub(impl_POA_Calculator * servant, CORBA_double number1, CORBA_double number2, CORBA_Environment * ev) { CORBA_double retval; return retval; }
���Դ�ļ��ṩ����һ����������������֮����ע���������ɵ�����ļ�(���� --skeleton-impl ����)ֻ��һ�Σ����� makefile �����κο��صĵ��� orbit-idl��������� makefile �е��� orbit-idl --skeleton-impl����ǰ���ļ�������д�������ʵ�ִ��뽫��ʧ��һ��д��ʵ�ִ��룬ֻ��Ҫ�� calculator-server.c �ļ��Ŀ�ͷ�������Դ�ļ���
����������У��Ҳ���������ɵ�����ļ������в��ֺ�����λ���⽫���Ժ�ȥ�������ǽ������ڷ����������С�
��������������
CORBA_doubleimpl_Calculator_add
(impl_POA_Calculator*servant, CORBA_doublenumber1, CORBA_doublenumber2,
CORBA_Environment*ev);��
CORBA_doubleimpl_Calculator_sub
(impl_POA_Calculator*servant, CORBA_doublenumber1, CORBA_doublenumber2,
CORBA_Environment*ev);�������������� IDL �ļ��ж���ĺ�����ʵ�֡���Ϊ IDL ���������ṩ��ʵ��ʵ��(������֪�������Ǹ�ʲô�õ�)��������Լ���չ�����ܡ�
���� impl_Calculator_add() Ӧ�����������������ؽ�������������Ӧ�����Ϊ��
CORBA_double impl_Calculator_add(impl_POA_Calculator * servant, CORBA_double number1, CORBA_double number2, CORBA_Environment * ev) { CORBA_double retval; retval = number1 + number2; return retval; }
������Ѿ���С��������������Ҫʹ�����������������������з�ʽʵ�ֵġ�
Example 5-6. ������������ʵ��
#include "calculator-impl.c" #include <stdio.h> int main(int argc, char* argv[]) { CORBA_ORB orb; CORBA_Environment* ev; PortableServer_ObjectId* oid; Calculator calculator; PortableServer_POA root_poa; PortableServer_POAManager pm; CORBA_char* objref; ev = g_new0(CORBA_Environment,1); CORBA_exception_init(ev); orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", ev); /* * Handle exception somehow * ����ij��ԭ���µ����� */ root_poa = (PortableServer_POA)CORBA_ORB_resolve_initial_references(orb, "RootPOA", ev); /* * ����ij��ԭ���µ����� */ calculator = impl_Calculator__create(root_poa, ev); /* * ����ij��ԭ���µ����� */ objref = CORBA_ORB_object_to_string(orb, calculator, ev); /* * ����ij��ԭ���µ����� */ fprintf(stderr, "%s\n", objref); pm = PortableServer_POA__get_the_POAManager(root_poa, ev); /* * ����ij��ԭ���µ����� */ PortableServer_POAManager_activate(pm, ev); /* * ����ij��ԭ���µ����� */ CORBA_ORB_run(orb, ev); return 0; }
�Ҳ��������������ӵ�ÿһ�У�����Ҫ�����÷��������в������Ƕ����ĵ�һ�ε��á��� fprintf() ���õ���һ��ֵ�ý��͡�������õ�Ŀ���������ʾ�������õ��ַ���������ַ�������"IOR:"���п�ͷ�ģ��ǿͻ�����IJ���������ʶһ���ض����������������������ڵ���������������λ�ã�������ض��ķ�������Ķ����ʶ��������ϸ��ԭ���Ǻܿ�����һ���������������ж�����������Ժ������εõ�����ַ�����������ã�������Ҫ����һ��(������)��������������ճ������һ��(�ͻ�)������������ϡ�
����� makefile �����ڱ���ͻ��ͷ��������ߡ�Ҫ֪�� ORBit ��λ�ã����ҵ�ϵͳ�ϱ���װ�� /usr ���棬������Դ�ļ��������������� /usr/local �£����� ORBIT ������·�������Ƕ����ġ��� orbit-docs.tar.gz �е����ӵ����ýű����ҵ���ȷ��·����д�� makefile �ļ���
CC = gcc ORBIT_IDL = /usr/bin/orbit-idl ORBIT_CFLAGS = -I/usr/lib/glib/include -I/usr/include ORBIT_LIBS = -L/usr/lib -lORBit -lIIOP -lORBitutil -lglib -lm CFLAGS = $(ORBIT_CFLAGS) LFLAGS = $(ORBIT_LIBS) all : idltargets calculator-client calculator-server calculator-client : calculator-client.o calculator-common.o calculator-stubs.o $(CC) -o calculator-client calculator-client.o calculator-stubs.o calculator-common.o -lIIOP -lORBit -lORBitutil $(LFLAGS) calculator-server : calculator-server.o calculator-skels.o calculator-common.o $(CC) -o calculator-server calculator-server.o calculator-skels.o calculator-common.o -lIIOP -lORBit -lORBitutil $(LFLAGS)
�ڵ����� make all ֮����Ҫ���������ڡ��ڵ�һ�����������������calculator-server �����������������������һ���dz��������ĸ��ַ��� IOR: ���п�ͷ���ַ������ڵڶ��������������� calculator-client IOR-string �����ͻ���������ò�Ҫ��ͼ��������ַ�������������� xterm �����������Ǹ����ƵĶ�����ʹ�ü��к�ճ�����ܡ�
���һ�������������㽫���������3.