IDL ���� C ӳ��

IDL ������: orbit-idl

��������½ڣ����ǿ����� IDL ����������������������κ����Է������ǡ�IDL ��װ�����еĶ���һ������������Ϣ�������κ����Զ����Խ�����Щ����ı�ʾ(representation)���󱾵ض���һ���������ǡ����ر�ʾ�� CORBA �����ɱ��ض������һ������ӳ�䡣

һЩ����ӳ���� CORBA ��׼��һ���֡��ִ��ӳ����C��C++,��Java��Smalltalk �� COBOL��C++ �� Java ӳ�����ڽ̳̺�ʵ��������ġ�C ӳ��û�б��㷺��ʹ�ú����漰 CORBA �����н�˵��GNOME ������ȫ�� C ����д�ɡ�����ζ�����ǽ�ֻ�� C ӳ�䡣

ORBit ��һ�� idl �����������Զ������� C ͷ�ļ�������������Ӧ�ڶ���� IDL ����ĺ���(�����ӱ�׼��ӳ��)���÷��� orbit-idl file.idl���������һ�� apple.idl �ļ������� idl ������������ apple.h�����ͷ�ļ��������к�����/�����͵���Ӧ�� C ӳ���������������� apple-common.c�� apple-stub.c �� apple-skels.c����Щ�ļ�������벢��ͻ��ͷ��������ӣ������ṩȱʡ�� stub �� skeleton��

IDL C ӳ�����: ����������

�� C ������û�С���ʵ���Ķ��󣬵� C ӳ��ʹ�õĹ��������� GTK+��GNOME �� Motif������Щ�ط� C �����Ϊ����Ļ��������������Ҫ�Ĺ���

����ķ��������DZ���ȫ���Ƶġ����磺Fruits Basket ģ��� Apple ����� Basketeat_me ������ C ������ FruitsBasket_Apple_eat_me��IDL ��׼������ʹ�����»���('_')�ķ��������֣�����ʹ�ô�Сд��ϡ���׼������ EatMe ������ eat_me���������Ǿ����� FruitsBasket_Apple_EatMe�������ַ�ʽ���DZ��������ֳ�ͻ(���磺FruitsBasket::Apple_eat::me �� FruitsBasket::Apple::eat_me)������ģ��/�ӿ�/����������ʶ��Ȼ����ע�⵽��׼���������Ǻ��ϸ�������������

�ٸ����ӣ����ǵ� Apple �ӿڽ�ת�������� C ������

module FruitsBasket {
        interface Apple {
                void eat_me (in boolean eat_yes_or_not );
        };
};
      

��ӳ��� :

typedef CORBA_Object FruitsBasket_Apple;
void FruitsBasket_Apple_eat_me (Fruits_Apple object, 
                                CORBA_boolean eat_yes_or_not, 
                                CORBA_Environment *ev);

���з����ĵ�����Ҫһ������������Ϊ��һ��������һ�� CORBA_Environment ��Ϊ���һ������������������ CORBA_Object ���͵ģ���������Dz�͸��������(���磺�㲻��ֱ�ӵķ��������κ��ֶλ��κζ���)����ʵ�ϣ�CORBA_Object ������һ��ָ�룬ָ����������ʹ�õ� COBRA ʵ�ֵ�һ���ṹ�� 

�����ض��IJ���(argument��ʵ�ʲ���)���� CORBA_Object �� the CORBA_Environment ����(parameter����ʽ����)֮�䴫�ݡ������ض��IJ�������� out �� inout ������Ӧ�ô���ָ�롣��� in �����ǽṹ���ַ�������������봫��ָ��(һ�������л��ַ����ĵ�һ��Ԫ�ص�ָ��)�����ز�����ʹ����ͬ���ϸ�ģ����ڽṹ�����ϡ��ַ��������к�����ʹ��ָ�롣�� CORBA �淶���и���ϸ��������

���Ե�ӳ��������ģ����������õ� OOP ʵ������������Բ�����ֱ�ӷ��ʣ�����������������_get ������ _set ���������磬���е����������ϸ�ȼۣ�

module FruitsBasket {
        interface Apple {
	        attribute boolean is_eaten;
        };
};

// ����Ķ����������ϵȼ��ڵ�һ�����嵫ȴ�ǷǷ���
// IDL ��ֹʹ�����»��߿�ͷ������
module FruitsBasket {
        interface Apple {
                boolean _get_is_eaten (void);
                void _set_is_eaten ( in boolean b );
        };
};
	

��Ϊ���������Ĵ��뽫��������ʽӿڵ� is_eaten ���ԡ�

��
CORBA_Object app;
CORBA_Environment *ev;
CORBA_boolean bool;

/* �����ǰ� app ���ӵ��������еķ����������һЩ����
 */

/* ��ע��˫�»��ߡ�һ��Դ����ȫ����������֣�
 * ��һ��Դ�ڷ���������
 */
 
FruitsBasket_Apple__set_is_eaten (app, TRUE, ev);
bool = FruitsBasket_Apple__get_is_eaten (app, ev);
	

��IDL ���͵�ӳ��

�� const �ؼ��ֶ���ij���ӳ��� #define��

const long myconstant = 43;
	

��ӳ���:

#define my_constant 43

������ CORBA ����ӳ�������±���

�� 1-2. ���� CORBA ���͵� C ӳ��

IDL ����C ����ӳ��
shortCORBA_short
unsigned shortCORBA_unsigned_short
longCORBA_long
unsigned longCORBA_unsigned_long
long longCORBA_long_long
unsigned long longCORBA_unsigned_long_long
floatCORBA_float
doubleCORBA_double
long doubleCORBA_long_double
booleanCORBA_boolean
charCORBA_char
wcharCORBA_wchar

CORBA_boolean ��ӳ��� C �� unsigned char ����ö�ٱ�ӳ��� #define��

������������(�ṹ�����С��ַ��������ַ���)�DZ䳤���ͱ����⴦�������һ������������Щ�䳤���ͣ������߱���ʹ�� CORBA_free() �ͷ�Ϊ֮������ڴ棬������������ͷ���Щ�ڴ档

�ṹֱ��ӳ��Ϊ C �Ľṹ��

�����ӳ�����е�����:

sequence <char,10> my_var;
      

��ӳ��ɣ�

typedef struct {
        CORBA_unsigned_long _maximum;
        CORBA_unsigned_long _lenght;
        CORBA_char *_buffer;
} CORBA_sequence_char;

typedef CORBA_sequence_char my_var
	

CORBA_sequence_char ��� C �ṹ������˵���ģ�_maximum ��������������Ԫ����Ŀ�� _lenght ��Ԫ�ص���Ч��Ŀ��_buffer �ǵ��������ݵ� C ���е�ָ�롣

�����������ӵ��ǣ�CORBA_sequence_anytype������� anytype �����б�ָ�������͡�

����������һ���ṹ��Ϊһ�� in ������ʱ��������չܸ�ÿ���ֶ������ʵ���ֵ��ȷ��������ʵ����ڴ���䡣�����Ϊһ�� out ��������ֻ��Ҫ�չ��� CORBA_free ��ȥ���乤����deallocation���ͷ�������������Ϊ inout �����������ȷ��  _maximum, _lenght �� _buffer ����ȷ��������(���� in ��������)�������ص�ʱ��_lenght �����з��ص�Ԫ�صĸ�������  _buffer ���ڴ�Ҫ�� CORBA_free ���ͷš����� _buffer ���ڴ�Ҫ�� CORBA_sequence_*_allocbuf �����䣬�����Ļ�����������ڴ��ǿ��Ըı�ġ��������������룺

// ��������������ʵĽӿ�:
module my {
        interface seq {
                void SetThing ( in sequence <long long, 20> );
                void GetThing ( out sequence <long long, 20> );
                void SendReceiveThing ( inout sequence <long long, 20> );
        };
};
	
/* �����ǵ��ò�ͬ������ C ���� */

CORBA_Object obj; 
CORBA_Environment ev;
CORBA_sequence_long_long *seq_one;
CORBA_sequence_long_long seq; 

/* ������ʵ�Ķ���������Ĵ��� */

my_seq_GetThing (obj, seq_one, &ev);

/* ������, seq_one ����ȷ�ĸ�ֵ */
/* ȥ��Ϊ��ʱ�洢�������ж�������ڴ� */
CORBA_free (seq_one); 


seq._maximum = 20;
seq._lenght = 2;
seq._buffer = CORBA_sequence_long_long_allocbuf (2);
seq._buffer = { 1, 1 };
my_seq_SetThing (obj, &seq, &ev);

my_seq_SendReceiveThing (obj, &seq, &ev);
/* ������, _buffer �������κζ���: �����ڴ���Բ������Ƿ����
 * ��Ϊ�����߽� CORBA_free ���ǵ� _buffer 
 * ���������С�����Ļ������·���һ���µĻ�����
 */
 CORBA_free (seq._buffer);
	

Ҫ�ö���������ι����ĸ��õ����⣬��Ӧ�ö� CORBA ��׼�������ܷ�����Ȥ�IJ���(������û���κ������������ļ�����Ҫ��)�����ڵڶ��������ĵ�ʱ��Ӧ��������

�ַ������򵥵�Ӱ��� CORBA_char ���У���Ӧ���� CORBA_string_allocate �����䡣���ǵ�ʹ�����������С�������һ�����Ӵ��룺

// ��������������ʵĽӿ�:
module my {
        interface str {
                void SetThing ( in string my_str );
                void GetThing ( out string my_str );
                void SendReceiveThing ( inout string my_str );
        };
};
	
/* �����ǵ��ò�ͬ������ C ���� */

CORBA_Object obj; 
CORBA_Environment ev;
CORBA_char *str;

/* ������ʵ�Ķ���������Ĵ��� */

my_str_GetThing (obj, &str, &ev);
/* ������, str ����ȷ�ĸ�ֵ */
/* ȥ��Ϊ��ʱ�洢�������ж�������ڴ� */
CORBA_free (str); 

str = CORBA_string_alloc (5);

my_str_SetThing (obj, str, &ev);

my_str_SendReceiveThing (obj, &str, &ev);
/* ������, str �������κζ���: �����ڴ���Բ������Ƿ����
 * ��Ϊ�����߽� CORBA_free ���ǵ� str 
 * ���������С�����Ļ������·���һ���µĻ�����
 */
CORBA_free (str);
	

Ϊ�˸��õ��������ǵ�ʹ�ú�Э������/ȥ������̣���ο� CORBA ��׼���������/��һ���������ݻ����ַ���ʱ�����ˡ���ֵġ����飬��Ӧ������ض���Щ���ϡ�ע�����ӿ�������Ҫʵ��ʹ�õĴ���ļ򵥻�(���磺����û�����⴦��)��

���⴦��

�� C �����е����⴦�������Ժ��˵����Ϊ C û���� C++ �� Java ���������õĴ�������Ļ��ơ�