POA �ӿ��е�ܼ�:
module PortableServer { // ����������û�õIJ��� interface POA { // �������� ObjectId activate_object (in Servant p_servant) raises ServantAlreadyActive, WrongPolicy); void activate_object_with_id (in ObjectId, in Servant p_servant) raises (ServantAlreadyActive, ObjectAlreadyActive, WrongPolicy); void deactivate_object (in ObjectId id) raises (ObjectNotActive, WrongPolicy); // ���ý������� Object create_reference (in CORBA::RepositoryId repid) raises (WrongPolicy); Object create_reference_with_id (in ObjectId id, in CORBA::RepositoryId repid) raises (WrongPolicy); // ����ӳ�亯�� ObjectId servant_to_id (in Servant p_servant) raises (ServantNotActive, WrongPolicy); Object servant_to_reference (in Servant p_servant) raises (ServantNotActive, WrongPolicy); Servant reference_to_servant (in Object reference) raises (ObjectNotActive, WrongAdapter, WrongPolicy); ObjectId reference_to_id (in Object reference) raises (WrongAdapter, WrongPolicy); Servant id_to_servant (in ObjectId oid) raises (ObjectNotActive, WrongPolicy); Object id_to_reference (in ObjectId oid) raises (ObjectNotActive, WrongPolicy); }; }; |
���������������һ����ʵ�� POA �ӿڵĽ�¼����ɾ�������е����ⶨ��������ﲻ�漰�ĺ�����һЩ��������Ҫ�ڱ��º���IJ������۶����������ˡ�
���ڣ������ǿ�һ����Щ�����Լ����ǵ���;��
�� 4-1. POA �ӿ�
���������� | ��������; |
---|---|
activate_object | ����������� POA ��ע�����ʹӱ�ʾ�Ķ���ʵ�֣����ص� ObjectId �ɽ��ű� id_to_reference ���������õ����������ʵ��������Ķ������á� |
activate_object_with_id | ����������� POA ��ע�����ʹӱ�ʾ�Ķ���ʵ�֣��������ʵ�ֽ�ͬ��Ϊһ�� ObjectId �� id ������ϵ��һ��ObjectId �����õ� create_reference �ĵ������ɶ������ã������� reference_to_id ���ط�װ�ڶ��������е�ObjectId �� |
deactivate_object | ���������ȥ��һ������ ObjectId ָ���Ķ����ע��(ObjectId ͨ�� reference_to_id �� servant_to_id �������)�� |
create_reference | ����������Ӷ���ʵ��(�ʹӶ���)����һ���������á� |
create_reference_with_id | ���������ֻ������֪���� ObjectId ��������֪�Ķ���... |
servant_to_id | ��������IJ���˵��ʹ����dz����ԡ�����ֵ��ע���������ʹ�δ�������������һ�� ServantNotActive ���⣬����ζ���������������ʹ��activate_object �� activate_object_with_id ����һ������֮ǰ�����á� |
servant_to_reference | ��������IJ���˵��ʹ����dz����ԡ�����ֵ��ע���������ʹ�δ�������������һ�� ServantNotActive ���⣬����ζ���������������ʹ��activate_object �� activate_object_with_id ����һ������֮ǰ�����á� |
id_to_servant | ��������IJ���˵��ʹ����dz����ԡ�����ֵ��ע���������� ObjectId ������һ��Ķ���δ�������������һ�� ServantNotActive ���⣬����ζ���������������ʹ��activate_object �� activate_object_with_id ����һ������֮ǰ�����á� |
id_to_reference | ��������IJ���˵��ʹ����dz����ԡ�����ֵ��ע���������� ObjectId ������һ��Ķ���δ�������������һ�� ServantNotActive ���⣬����ζ���������������ʹ��activate_object �� activate_object_with_id ����һ������֮ǰ�����á� |
reference_to_servant | ��������IJ���˵��ʹ����dz����ԡ�����ֵ��ע����������������ù�����һ��Ķ���δ�������������һ�� ServantNotActive ���⣬����ζ���������������ʹ��activate_object �� activate_object_with_id ����һ������֮ǰ�����á� |
reference_to_id | ��������IJ���˵��ʹ����dz����ԡ�������������������IJ�ͬ�ǣ����������κ� NotActivated ���⣬��ζ��������������� create_reference ����������ȷ�� ObjectId ֮����ã������صķ�װ�ڶ��������е� ObjectId �ɱ�activate_object_with_id ����ʹ�á� |
������ʹ������Щ������һ������ʵ��:
/* ʹ�� activate_object ���������� */ ObjectId obj_id; CORBA_Object obj; obj_id = PortableServer_POA_activate_object (poa, servant, &ev); /* ����, ���ǿ�����������������������ע����� CORBA_Object * ����ת����һ�� ior �ַ��� */ obj = PortableServer_POA_id_to_reference (poa, obj_id, &ev); /* ʹ�� activate_object_with_id ���������� */ CORBA_Object obj; /* ע�� PortableServer_string_to_id ���÷�һ������ϸ��˵���� * ����֪��������һ�� ObjectId ���㹻�ˡ� */ PortableServer_POA_activate_object_with_id (poa, PortableServer_string_to_id ("my_small_servant", &ev), servant, &ev); obj = Portable_Server_POA_servant_to_reference (poa, servant, &ev); /* ����, ���ǿ�����������������������ע����� CORBA_Object * ����ת����һ�� ior �ַ��� */ |
������Щ����չʾ������� POA ��ע��һ���ʹӡ��ʹ������������Եġ����ǵĽṹ�����ǵ�ʹ������ȫ������ӳ��ġ���ǰ�����Ѿ����͵����������������������ֻչʾ C ӳ�䣬����ֻ�鿴���� POA �� C ���Եķ�ʽ��
�뷨����һЩ��ʼ����������һ�����ݽṹ��������ݽṹ���е�����ʵ�ֺ�����ָ����б���������ݽṹ���� EPV (entry point vector����ڵ�����)���ʹ����ݽṹ����������һ�� EPV��
������Ϊ����Ľӿڶ��彨����һ���������ݽṹ��
// idl interface module FruitsBasket { interface Apple { void EatMe (); void ThrowMe (); }; }; |
typedef struct { void *_private; /* ORB specific data */ void (*EatMe) (PortableServer_Servant servant, CORBA_Environment * ev); void (*ThrowMe) (PortableServer_Servant servant, CORBA_Environment * ev); } POA_FruitsBasket_Apple__epv; typedef struct { PortableServer_ServantBase__epv *_base_epv; POA_FruitsBasket_Apple__epv *FruitsBasket_Apple_epv; } POA_FruitsBasket_Apple__vepv; typedef struct { void *_private; /* ORB specific data */ POA_FruitsBasket_Apple__vepv *vepv; } POA_FruitsBasket_Apple; extern void POA_FruitsBasket_Apple__init(POA_FruitsBasket_Apple servant, CORBA_Environment * ev); extern void POA_FruitsBasket_Apple__fini(POA_FruitsBasket_Apple servant, CORBA_Environment * ev); |
һ���ʹӾ���һ�����ݽṹ��������һ���ض��ڶ���ʵ�ֵ� EPV ��һ���� _base_epv ��ͨ�� EPV������ض� EPV ������˵���ģ��ȴ����ĺ���ָ����б������� EPV ������δ����ʾ���������ڳ����ض����ʹ�������һЩ��Ϣ(��ʵ�ϣ�һ���ʹӿ�����Ӧ�Ķ���ʵ�ֶ���һ���������ھ����������ɹ��ȵ�ɱ��)��
���ڣ�������һ�� PortableServer_ServantBase__epv �ṹ��
typedef struct PortableServer_ServantBase__epv { void *private; /* �ض��� ORB ������ */ /* �����õ���ֹ���� * �����������е��ʹ����� */ void (*finalize) (PortableServer_Servant, CORBA_Environment *); /* ����ʹ�ʹ�õ�ȱʡ POA */ PortableServer_POA (*default_POA) (PortableServer_Servant, CORBA_Environment *); } PortableServant_ServantBase__epv; |
��� finalize �� default_poa ��Ա�� NULL�������ʹӴ��ݸ� POA_FruitsBasket_Apple__init ʱ��ORB ���ñ���ȱʡֵ����ʼ�����ǡ� default_POA ȱʡ�� "RootPOA"������CORBA_ORB_resolve_initial_reference (orb, "RootPOA", &ev) ���ص��Ǹ� POA������ ORB �ٶ�Ӧ�ó�����ȷ�ij�ʼ��������ֶΡ�
���͵ģ�Ҫ������������ʼ��һϵ�����ݽṹ��
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 specific data */ MyEatMe, MyThrowMe }; POA_FruitsBasket_Apple__vepv Apple_vepv { &base_epv, &Apple_epv }; POA_FruitsBasket_Apple Apple_servant = { NULL, &Apple_vpev }; |
������Ҫ����ֻʣ�µ��� POA_FruitsBasket_Apple__init ( Apple_servant, &ev) �ˡ������ʹ��Ѿ��� POA ��ע���ˣ������輤���������ʵ�֣��û�һ����Ч�Ķ������ò������ַ�����ע�ᡣ�����������Ĵ��룺
#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 root_poa; 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}; 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)); CORBA_exception_free (&ev); exit 1; } root_poa = CORBA_ORB_resolve_initial_references (orb, "RootPOA", &ev); if (ev->_major != CORBA_NO_EXCEPTION) { fprintf (stderr, "Error: exception during RootPOA initialization: %s\n", CORBA_exception_id(&ev)); CORBA_exception_free (&ev); exit 1; } /* ������� */ obj_id = PortableServer_POA_activate_object (root_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 not register object: %s\n", CORBA_exception_id(&ev)); exit 1; } CORBA_free (root_poa); CORBA_exception_free (&ev); exit 0; } |
pfew !! ��Ҳ̫���������� !! ... ����ֻ�Dzſ�ʼ���� CORBA ����IJ����С������������ʵ������ļ��� �������Ǽٶ� POA �Ѿ����������ˣ���������Ϊ�˼���ʹ�� RootPOA���������ϰٸ�����ʱ��Ͳ���һ���������ˣ����Ƕ�ʹ��ͬһ�� POA ���������ص��������⡣
�����ǽ�����������IJ���֮ǰ��������һ��С�ĵ������õ��ض��� C ӳ��� API���ڴ��� ObjectId �ṹʱ���á����IJ���˵���Ѿ��㹻���������������ˡ�
PortableServer_ObjectId * PortableServer_string_to_ObjectId (CORBA_Char *string, CORBA_Environment *ev); CORBA_Char * PortableServer_ObjectId_to_string (PortableServer_ObjectId *obj, CORBA_Environment *ev); |