注意
![]()
OOCOBOLは、使用できません。
![]()
OOCOBOLは、Windows(R)クライアントアプリケーションで使用できます。
例1:OperationDefオブジェクトの情報の獲得
以下のIDL定義に対するOperationDefオブジェクトのパラメタ情報を獲得するプログラミングについて説明します。
module test1 {
interface intf1 {
long add(in long a, in long b);
long sub(in long c, in long d) ;
};
};上記のIDL定義の場合、以下のオブジェクトがインタフェースリポジトリサービスに格納されます。

(1)インタフェースリポジトリのオブジェクトリファレンスの獲得
システム提供サービスのオブジェクトリファレンスの取出しメソッドresolve_initial_references()により、ルートリポジトリのオブジェクトリファレンスを取り出します。
CORBA_Repository intf_rep;
/* インタフェースリポジトリのオブジェクトリファレンス獲得 */
intf_rep = CORBA_ORB_resolve_initial_references(
orb,CORBA_ORB_ObjectId_InterfaceRepository, &env);CORBA::Object_ptr obj;
CORBA::Repository_ptr intf_rep;
// インタフェースリポジトリのオブジェクトリファレンス獲得
obj = orb->resolve_initial_references(
CORBA_ORB_ObjectId_InterfaceRepository, *env );
// CORBA::Repositoryクラスに変換
intf_rep = CORBA::Repository::_narrow( obj );org.omg.CORBA.Object Obj; org.omg.CORBA.Repository Rep; // インタフェースリポジトリのオブジェクトリファレンス獲得 Obj = Orb.resolve_initial_references( "InterfaceRepository" ); // RepositoryHelperクラスに変換 Rep = org.omg.CORBA.RepositoryHelper.narrow( Obj );
*########## インタフェースリポジトリのオブジェクトリファレンス獲得 ###########
MOVE FUNCTION LENG (CORBA-ORB-OBJECTID-INTFREP) TO STRING-LENGTH.
CALL "CORBA-STRING-SET" USING
TEMP-BUF
STRING-LENGTH
CORBA-ORB-OBJECTID-INTFREP.
CALL "CORBA-ORB-RESOLVE-INITIAL-REFERENCES" USING
ORB
TEMP-BUF
ENV
OBJ. 01 ORB OBJECT REFERENCE CORBA-ORB.
01 OBJ OBJECT REFERENCE CORBA-OBJECT.
01 REP OBJECT REFERENCE CORBA-REPOSITORY.
INVOKE CORBA "ORB_INIT" USING APL-NAME FJ-OM_ORBID RETURNING ORB.
*######## インタフェースリポジトリのオブジェクトリファレンス獲得
INVOKE ORB "RESOLVE_INITIAL_REFERENCES" USING CORBA-OBJECTID_INTERFACERE-001
RETURNING OBJ.
*######## REPOSITORYクラスに変換
INVOKE CORBA-REPOSITORY "NARROW" USING OBJ
RETURNING REP. (2)OperationDefオブジェクトのオブジェクトリファレンスの獲得
対象のOperationDefオブジェクトのリポジトリIDである“IDL:test1/intf1/add:1.0”とルートリポジトリのオブジェクトリファレンスを指定してlookup_id()を発行すると、OperationDefオブジェクトのオブジェクトリファレンスが獲得できます。
CORBA_Contained intfobj; /* オブジェクトの検索 */ intfobj = CORBA_Repository_lookup_id(intf_rep, "IDL:test1/intf1/add:1.0", &env);
CORBA::Object_ptr intfobj; // オブジェクトの検索 intfobj = intf_rep->lookup_id( "IDL:test1/intf1/add:1.0", *env );
org.omg.CORBA.Object obj; // オブジェクトの検索 obj = Rep.lookup_id( "IDL:test1/intf1/add:1.0" );
*########## インタフェースリポジトリのオブジェクト検索 ##########
MOVE FUNCTION LENG ("IDL:test1/intf1/add:1.0") TO STRING-LENGTH
MOVE "IDL:test1/intf1/add:1.0" TO IN-BUF
CALL "CORBA-STRING-SET" USING
REPOSITORYID
STRING-LENGTH
IN-BUF.
CALL "CORBA-REPOSITORY-LOOKUP-ID" USING
OBJ
REPOSITORYID
ENV
INTF-INTF. 01 R-OBJ OBJECT REFERENCE CORBA-OBJECT.
*######## インタフェースリポジトリのオブジェクト検索
INVOKE REP "LOOKUP_ID" USING "IDL:test1/intf1/add:1.0"
RETURNING R-OBJ.(3)パラメタ情報の獲得
OperationDefオブジェクトのオブジェクトリファレンスを指定してdescribeメソッドを呼び出すことにより、サーバアプリケーションが持っているメソッドの情報をインタフェースリポジトリから検索します。その結果、パラメタの情報(パラメタの名前、個数、パラメタの型など)が返されます。
CORBA_Contained_Description *ope_des;
CORBA_OperationDescription *o;
CORBA_TCKind kind;
CORBA_ParDescriptionSeq *parameters;
CORBA_ParameterDescription *prmp;
/* OperationDefオブジェクトのインタフェース情報の獲得 */
ope_des = CORBA_OperationDef_describe(intfobj,&env);
/* OperationDefオブジェクト固有情報構造体の取り出し */
o = (CORBA_OperationDescription *)ope_des->value._value;
parameters = &(o->parameters); /* パラメタシーケンス情報を参照 */
/* パラメタ数の参照 */
printf("Parameter number = %d\n", parameters->_length );
for(k=0,prmp=parameters->_buffer; k<parameters->_length; k++){
/* パラメタの名前の参照 */
printf("Parameter Identifier(%d) = %s\n", k, prmp[k].name);
/* パラメタの型の参照 */
kind = CORBA_TypeCode_kind(prmp[k].type,&env);
printf("TypeCode_kind(%d) = %d\n",k,kind);
/* パラメタのモード(IN/OUT/INOUT) */
printf("Parameter_mode(%d) = %d\n",k, prmp[k].mode);
}CORBA::OperationDef_ptr opef;
CORBA::Contained::Description *desc;
CORBA::OperationDescription *c;
// OperationDefオブジェクトのインタフェース情報の獲得
opef = CORBA::OperationDef::_narrow(intfobj);
desc = opef->describe(*env);
// OperationDefオブジェクト固有情報構造体の取り出し
CORBA::Any *opeany = (CORBA::Any*)(desc->value);
c = (CORBA::OperationDescription *)opeany->value();
// パラメタシーケンス情報を参照
CORBA::ParDescriptionSeq *parseq = (CORBA::ParDescriptionSeq*)c->parameters;
// パラメタ数の参照
printf("Parameter number = %d\n", parseq->length() );
for( int n = 0;n < parseq->length(); n++) {
CORBA::ParameterDescription *parades =
(CORBA::ParameterDescription*)(*parseq)[m];
// パラメタの名前の参照
printf("para name = %s \n", (char*)parades->name);
// パラメタの型の参照
CORBA::TypeCode
*typecode2 = (CORBA::TypeCode *)(parades->type);
kind = typecode2->kind(*env);
printf("TypeCode_kind = %d\n",kind);
// パラメタのモード(IN/OUT/INOUT)
printf("para mode = %d \n", parades->mode);
}org.omg.CORBA.OperationDef opef;
org.omg.CORBA.ContainedPackage.Description desc;
org.omg.CORBA.OperationDescription c;
org.omg.CORBA.ParameterDescription paraseq[];
// OperationDefオブジェクトのインタフェース情報の獲得
opef = org.omg.CORBA.OperationDefHelper.narrow( obj );
desc = opef.describe();
// OperationDefオブジェクト固有情報構造体の取り出し
org.omg.CORBA.Any opeany = desc.value;
c = ( org.omg.CORBA.OperationDescription )
org.omg.CORBA.OperationDescriptionHelper.extract( opeany );
// パラメタシーケンス情報を参照
paraseq = c.parameters;
// パラメタ数の参照
inoutcc.output( "Parameter number = " + paraseq.length );
for( i = 0; i < paraseq.length; i++ ) {
parades = paraseq[i];
// パラメタの名前の参照
inoutcc.output( "para name = " + parades.name );
// パラメタの型の参照
typecode = parades.type;
kind = typecode.kind().value();
inoutcc.output( "TypeCode_kind = " + kind );
// パラメタのモード
inoutcc.output( "para mode = " + parades.mode.value() );
}*########## OperationDefオブジェクトのインタフェース情報の獲得 ##########
CALL "CORBA-OPERATIONDEF-DESCRIBE" USING
OBJ
ENV
LINK-BUF.
*--- OperationDefオブジェクト固有情報構造体の取り出し ---
SET ADDRESS OF LINK-CONDES TO LINK-BUF.
MOVE IDL-VALUE OF LINK-CONDES TO TMP-ANY.
MOVE ANY-VALUE OF TMP-ANY TO TEMP-BUF.
SET ADDRESS OF TMP-OPR TO TEMP-BUF.
MOVE FUNCTION ADDR(PARAMETERS OF TMP-OPR) TO TEMP-BUF.
SET ADDRESS OF PARDESSEQ TO TEMP-BUF.
*---- パラメタシーケンス情報を参照 ---
*---- パラメタ数の参照 ---
IF SEQ-LENGTH OF PARDESSEQ = 0
DISPLAY "PARA-LENGTH = 0"
END-IF.
DISPLAY "PARAMETER NUMBER = " SEQ-LENGTH OF PARDESSEQ.
PERFORM TEST BEFORE
VARYING CNT FROM 1 BY 1
UNTIL CNT > SEQ-LENGTH OF PARDESSEQ
CALL "CORBA-SEQUENCE-ELEMENT-GET" USING
TEMP-BUF
CNT
ELEMENT-TYPE
SET ADDRESS OF TMP-PARA TO ELEMENT-TYPE
*---- パラメタの名前の参照 ----
MOVE FUNCTION LENG (DSP-BUF) TO STRING-LENGTH
CALL "CORBA-STRING-GET" USING
NAME OF TMP-PARA
STRING-LENGTH
DSP-BUF
DISPLAY "NAME=" DSP-BUF
*---- パラメタの型の参照 ----
CALL "CORBA-TYPECODE-KIND" USING
IDL-TYPE OF TMP-PARA
ENV
TMP-KIND
DISPLAY "TYPECODE KIND=" TMP-KIND
*---- パラメタのモード(IN/OUT/INOUT) ----
DISPLAY "PARA MODE=" IDL-MODE OF TMP-PARA
END-PERFORM. 01 OPEF OBJECT REFERENCE CORBA-OPERATIONDEF.
01 DESC OBJECT REFERENCE CORBA-CONTAINED-DESCRIPTION.
01 OPE-ANY OBJECT REFERENCE CORBA-ANY.
01 C OBJECT REFERENCE CORBA-OPERATIONDESCRIPTION.
01 PARAMSEQ TYPE CORBA-PARDESCRIPTIONSEQ.
01 PARADES OBJECT REFERENCE CORBA-PARAMETERDESCRIPTION.
01 STR OBJECT REFERENCE CORBA-STRING.
01 TYPECODE OBJECT REFERENCE CORBA-TYPECODE.
01 PARA-NAME PIC X(40).
01 SEQ-LEN TYPE CORBA-LONG.
01 N TYPE CORBA-UNSIGNED-LONG.
01 TCK TYPE CORBA-TCKIND.
01 PARA-MODE TYPE CORBA-PARAMETERMODE.
*######## OperationDefオブジェクトのインタフェース情報の獲得
INVOKE CORBA-OPERATIONDEF "NARROW" USING INTF-OBJ
RETURNING OPEF
INVOKE OPEF "DESCRIBE" RETURNING DESC.
SET OPE-ANY TO IDL-VALUE OF DESC.
*
INVOKE CORBA-OPERATIONDESCRIPTION--H "EXTRACT" USING OPE-ANY
RETURNING C.
*######## パラメタシーケンス情報を参照
SET PARAMSEQ TO PARAMETERS OF C.
*######## パラメタ数の参照
MOVE SEQ-LENGTH OF PARAMSEQ TO SEQ-LEN.
DISPLAY "PARAMETER NUMBER = " SEQ-LEN.
PERFORM VARYING N FROM 1 BY 1 UNTIL SEQ-LEN < N
INVOKE PARAMSEQ "GET-VALUE" USING N
RETURNING PARADES
*######## パラメタの名前の参照
SET STR TO NAME OF PARADES
INVOKE STR "GET-VALUE" RETURNING PARA-NAME
DISPLAY " PARA NAME = " PARA-NAME
*######## パラメタの型の参照
SET TYPECODE TO IDL-TYPE OF PARADES
INVOKE TYPECODE "KIND" RETURNING TCK
DISPLAY "TYPECODE_KIND = " TCK
*######## パラメタのモード
MOVE IDL-MODE OF PARADES TO PARA-MODE
DISPLAY "PARA MODE = " PARA-MODE
END-PERFORM.例2:StructDefオブジェクト、AliasDefオブジェクトの情報の獲得
以下のIDL定義に対するStructDefオブジェクト(構造体定義)、AliasDefオブジェクト(typedef定義情報)の情報を獲得するプログラミングについて説明します。
module test3 {
struct struct1{
long para1;
short para2;
};
typedef string<50> string1;
interface intf1 {
long ope1(in struct1 struct1_data, in string1 string1_data);
};
};上記のIDL定義の場合、以下のオブジェクトがインタフェースリポジトリサービスに格納されます。

(1)オブジェクトリファレンスの獲得
OperationDefオブジェクトのパラメタ情報より、StructDefオブジェクト、AliasDefオブジェクトのオブジェクトリファレンスを獲得します。
CORBA_Repository intf_rep;
CORBA_Contained intfobj;
CORBA_Contained_Description *ope_des;
CORBA_OperationDescription *o;
CORBA_TCKind kind;
CORBA_ParDescriptionSeq *parameters;
CORBA_ParameterDescription *prmp;
CORBA_StructDef StructObj;
CORBA_AliasDef AliasObj;
/* インタフェースリポジトリのオブジェクトリファレンス獲得 */
intf_rep = CORBA_ORB_resolve_initial_references(
orb,CORBA_ORB_ObjectId_InterfaceRepository, &env);
/* オブジェクトの検索 */
intfobj = CORBA_Repository_lookup_id(intf_rep, "IDL:test1/intf1/ope1:1.0", &env);
/* OperationDefオブジェクトのインタフェース情報の獲得 */
ope_des = CORBA_OperationDef_describe(intfobj,&env);
exception_check("CORBA_OperationDef_describe");
/* OperationDefオブジェクト固有情報構造体の取り出し */
o = (CORBA_OperationDescription *)ope_des->value._value;
parameters = &(o->parameters); /* パラメタシーケンス情報を参照 */
for(k=0,prmp=parameters->_buffer; k<parameters->_length; k++){
/* パラメタの型の参照 */
kind = CORBA_IRObject__get_def_kind(prmp[k].type_def,&env);
if(kind == CORBA_dk_Struct)
/* StructObjにStructDefのオブジェクトリファレンス設定 */
StructObj = (CORBA_StructDef)prmp[k].type_def;
else if(kind == CORBA_dk_Alias)
/* AliasObjにAliasDefのオブジェクトリファレンス設定 */
AliasObj = (CORBA_AliasDef)prmp[k].type_def;
}CORBA::Object_ptr obj;
CORBA::Repository_ptr intf_rep;
CORBA::Contained_ptr intfobj;
CORBA::OperationDef_ptr opef;
CORBA::Contained::Description *desc;
CORBA::OperationDescription *c;
CORBA::IRObject_ptr irobj;
CORBA::StructDef_ptr StructObj;
CORBA::AliasDef_ptr AliasObj;
CORBA::IDLType_ptr idltypep;
// インタフェースリポジトリのオブジェクトリファレンス獲得
obj = orb->resolve_initial_references(
CORBA_ORB_ObjectId_InterfaceRepository, *env );
// CORBA::Repositoryクラスに変換
intf_rep = CORBA::Repository::_narrow( obj );
// オブジェクトの検索
intfobj = intf_rep->lookup_id( "IDL:test3/intf1/ope1:1.0", *env );
if(intfobj == CORBA_OBJECT_NIL){
/* オブジェクトが存在しない */
printf("Not Found Object\n");
exit(1);
}
// OperationDefオブジェクトのインタフェース情報の獲得
opef = CORBA::OperationDef::_narrow(intfobj);
desc = opef->describe(*env);
// OperationDefオブジェクト固有情報構造体の取り出し
CORBA::Any *opeany = (CORBA::Any*)(desc->value);
c = (CORBA::OperationDescription *)opeany->value();
// パラメタシーケンス情報を参照
CORBA::ParDescriptionSeq *parseq = (CORBA::ParDescriptionSeq*)c->parameters;
for( int n = 0;n < parseq->length(); n++){
CORBA::ParameterDescription *parades =
(CORBA::ParameterDescription*)(*parseq)[n];
// パラメタの型の参照
objvar = (CORBA::Object_var*)&(parades->type_def);
idlobj = (CORBA::Object_ptr)(*objvar);
idltypep = CORBA::IDLType::_narrow( idlobj );
kind = idltypep->def_kind(*env);
if(kind == CORBA::dk_Struct)
// StructObjにStructDefのオブジェクトリファレンス設定
StructObj = CORBA::StructDef::_narrow(idltypep);
else if(kind == CORBA::dk_Alias)
// AliasObjにAliasDefのオブジェクトリファレンス設定
AliasObj = CORBA::AliasDef::_narrow(idltypep);
}org.omg.CORBA.Object Obj;
org.omg.CORBA.Repository Rep;
org.omg.CORBA.Object obj;
org.omg.CORBA.OperationDef opef;
org.omg.CORBA.ContainedPackage.Description desc;
org.omg.CORBA.OperationDescription c;
org.omg.CORBA.ParameterDescription paraseq[];
org.omg.CORBA.ParameterDescription parades;
int kind;
org.omg.CORBA.IDLType idltype;
org.omg.CORBA.AliasDef AliasObj;
org.omg.CORBA.StructDef StructObj;
// インタフェースリポジトリのオブジェクトリファレンス獲得
Obj = Orb.resolve_initial_references( "InterfaceRepository" );
// RepositoryHelperクラスに変換
Rep = org.omg.CORBA.RepositoryHelper.narrow( Obj );
// オブジェクトの検索
obj = Rep.lookup_id( "IDL:test3/intf1/ope1:1.0" );
// OperationDefオブジェクトのインタフェース情報の獲得
opef = org.omg.CORBA.OperationDefHelper.narrow( obj );
desc = opef.describe();
// OperationDefオブジェクト固有情報構造体の取り出し
org.omg.CORBA.Any opeany = desc.value;
c = ( org.omg.CORBA.OperationDescription )
org.omg.CORBA.OperationDescriptionHelper.extract( opeany );
// パラメタシーケンス情報を参照
paraseq = c.parameters;
for( i = 0; i < paraseq.length; i++ ) {
// パラメタの型の参照
parades = paraseq[i];
idltype = org.omg.CORBA.IDLTypeHelper.narrow( parades.type_def );
kind = idltype.def_kind();
if( kind == org.omg.CORBA.DefinitionKind.dk_Struct.value() ) {
// StructObjにStructDefのオブジェクトリファレンス設定
StructObj = org.omg.CORBA.StructDefHelper.narrow( obj );
} else if( kind == org.omg.CORBA.DefinitionKind.dk_Alias.value() ) {
// AliasObjにAliasDefのオブジェクトリファレンス設定
AliasObj = org.omg.CORBA.AliasDefHelper.narrow(stcf);
}
}*########## インタフェースリポジトリのオブジェクト検索 ##########
MOVE FUNCTION LENG ("IDL:test3/intf1/ope1:1.0") TO STRING-LENGTH.
MOVE "IDL:test3/intf1/ope1:1.0" TO REP-BUF.
CALL "CORBA-STRING-SET" USING
REPOSITORYID
STRING-LENGTH
REP-BUF.
CALL "CORBA-REPOSITORY-LOOKUP-ID" USING
OBJ
REPOSITORYID
ENV
INTF-INTF.
CALL "CORBA-FREE" USING REPOSITORYID.
*--- オブジェクトが存在するかのチェック ---
CALL "CORBA-OBJECT-IS-NIL" USING
INTF-INTF
ENV
TMP-RESULT.
IF TMP-RESULT = CORBA-TRUE
*--- オブジェクトは存在しない ---
DISPLAY "Null Object Reference"
GO TO MAIN-END
END-IF.
*########## OperationDefオブジェクトのインタフェース情報の獲得 ##########
MOVE INTF-INTF TO OBJ.
CALL "CORBA-OPERATIONDEF-DESCRIBE" USING
OBJ
ENV
LINK-BUF.
MOVE "CORBA-OPERATIONDEF--DESCRIBE" TO MESS.
PERFORM ENV-CHECK.
*--- OperationDefオブジェクト固有情報構造体の取り出し ---
SET ADDRESS OF LINK-CONDES TO LINK-BUF.
MOVE IDL-VALUE OF LINK-CONDES TO TMP-ANY.
MOVE ANY-VALUE OF TMP-ANY TO TEMP-BUF.
SET ADDRESS OF TMP-OPR TO TEMP-BUF.
MOVE FUNCTION ADDR(PARAMETERS OF TMP-OPR) TO TEMP-BUF.
SET ADDRESS OF PARDESSEQ TO TEMP-BUF.
*---- パラメタシーケンス情報を参照 ---
IF SEQ-LENGTH OF PARDESSEQ = 0
*---- パラメタがない ---
DISPLAY "PARA-LENGTH = 0"
END-IF.
PERFORM TEST BEFORE
VARYING CNT FROM 1 BY 1
UNTIL CNT > SEQ-LENGTH OF PARDESSEQ
CALL "CORBA-SEQUENCE-ELEMENT-GET" USING
TEMP-BUF
CNT
ELEMENT-TYPE
SET ADDRESS OF TMP-PARA TO ELEMENT-TYPE
MOVE FUNCTION LENG (DSP-BUF) TO STRING-LENGTH
*--- パラメタの型の参照 ----
CALL "CORBA-TYPECODE-KIND" USING
IDL-TYPE OF TMP-PARA
ENV
TMP-KIND
MOVE TMP-KIND TO TYPE-KIND
IF CORBA-TK-STRUCT OF TYPE-KIND
*--- STRUCT-OBJにSTRUCTDEFのオブジェクトリファレンス設定
MOVE TYPE-DEF OF TMP-PARA TO STRUCT-OBJ
ELSE
IF CORBA-TK-ALIAS OF TYPE-KIND
*--- ALIAS-OBJにALIASDEFのオブジェクトリファレンス設定
MOVE TYPE-DEF OF TMP-PARA TO ALIAS-OBJ
END-IF
END-IF
END-PERFORM. 01 ORB OBJECT REFERENCE CORBA-ORB.
01 OBJ OBJECT REFERENCE CORBA-OBJECT.
01 REP OBJECT REFERENCE CORBA-REPOSITORY.
01 CONTAINED-OBJ OBJECT REFERENCE CORBA-CONTAINED.
01 DESC OBJECT REFERENCE CORBA-CONTAINED-DESCRIPTION.
01 OPE-ANY OBJECT REFERENCE CORBA-ANY.
01 C OBJECT REFERENCE CORBA-OPERATIONDESCRIPTION.
01 PARAMSEQ TYPE CORBA-PARDESCRIPTIONSEQ.
01 PARADES OBJECT REFERENCE CORBA-PARAMETERDESCRIPTION.
01 STR OBJECT REFERENCE CORBA-STRING.
01 IDLTYPE OBJECT REFERENCE CORBA-IDLTYPE.
01 PARA-NAME PIC X(40).
01 SEQ-LEN TYPE CORBA-LONG.
01 N TYPE CORBA-UNSIGNED-LONG.
01 TCK TYPE CORBA-TCKIND.
01 PARA-MODE TYPE CORBA-PARAMETERMODE.
01 KIND TYPE CORBA-DEFINITIONKIND.
01 ALIAS-OBJ OBJECT REFERENCE CORBA-OBJECT.
01 ALIASDEF-OBJ OBJECT REFERENCE CORBA-ALIASDEF.
01 OPEF OBJECT REFERENCE CORBA-OPERATIONDEF.
01 TYPECODE OBJECT REFERENCE CORBA-TYPECODE.
01 MEM-NAME PIC X(20).
01 STRUCT-OBJ OBJECT REFERENCE CORBA-OBJECT.
01 STRUCTDEF-OBJ OBJECT REFERENCE CORBA-STRUCTDEF.
01 TYPE_DEF PIC X(40).
01 ID-NAME OBJECT REFERENCE CORBA-STRING.
INVOKE CORBA "ORB_INIT" USING APL-NAME FJ-OM_ORBID RETURNING ORB.
*######## インタフェースリポジトリのオブジェクトリファレンス獲得
INVOKE ORB "RESOLVE_INITIAL_REFERENCES" USING CORBA-OBJECTID_INTERFACERE-001
RETURNING OBJ.
*######## REPOSITORYクラスに変換
INVOKE CORBA-REPOSITORY "NARROW" USING OBJ
RETURNING REP.
*######## オブジェクトの検索
INVOKE REP "LOOKUP_ID" USING "IDL:test3/intf1/ope1:1.0"
RETURNING OBJ.
*######## OperationDefオブジェクト固有情報構造体の取り出し
INVOKE CORBA-OPERATIONDEF "NARROW" USING OBJ
RETURNING OPEF.
INVOKE OPEF "DESCRIBE" RETURNING DESC.
SET OPE-ANY TO IDL-VALUE OF DESC.
*
INVOKE CORBA-OPERATIONDESCRIPTION--H "EXTRACT" USING OPE-ANY
RETURNING C.
*######## パラメタシーケンス情報を参照
SET PARAMSEQ TO PARAMETERS OF C.
*######## パラメタ数の参照
MOVE SEQ-LENGTH OF PARAMSEQ TO SEQ-LEN.
DISPLAY "PARAMETER NUMBER = " SEQ-LEN.
PERFORM VARYING N FROM 1 BY 1 UNTIL SEQ-LEN < N
INVOKE PARAMSEQ "GET-VALUE" USING N
RETURNING PARADES
*######## パラメタの型の参照
SET IDLTYPE TO TYPE_DEF OF PARADES
MOVE DEF_KIND OF IDLTYPE TO KIND
*######## 型のIDの取得
SET TYPECODE TO IDL-TYPE OF PARADES
INVOKE TYPECODE "ID" RETURNING ID-NAME
INVOKE ID-NAME "GET-VALUE" RETURNING TYPE_DEF
*
EVALUATE TRUE
WHEN CORBA-DK_STRUCT OF KIND
*######## STRUCT-OBJにStructDefのオブジェクトリファレンス設定
INVOKE REP "LOOKUP_ID" USING TYPE_DEF
RETURNING STRUCT-OBJ
INVOKE CORBA-STRUCTDEF "NARROW" USING STRUCT-OBJ
RETURNING STRUCTDEF-OBJ
WHEN CORBA-DK_ALIAS OF KIND
*######## ALIAS-OBJにAliasDefのオブジェクトリファレンス設定
INVOKE REP "LOOKUP_ID" USING TYPE_DEF
RETURNING ALIAS-OBJ
INVOKE CORBA-ALIASDEF "NARROW" USING ALIAS-OBJ
RETURNING ALIASDEF-OBJ
END-EVALUATE
END-PERFORM.(2)StructDefオブジェクトのメンバ情報の獲得
StructDefオブジェクトのオブジェクトリファレンスを指定してmembersメソッドを発行すると、構造体のメンバ情報(識別名、タイプコード)がリスト形式で返されます。
CORBA_StructMemberSeq *members;
CORBA_StructMember *str;
/* 構造体のメンバ情報がリスト形式で返されます */
members = CORBA_StructDef__get_members(StructObj,&env);
/* 構造体メンバの解析 */
for(i=0,str=members->_buffer; i<members->_length;i++){
/* 識別名の参照 */
printf("Identifier : %s\n",str[i].name);
/* タイプコードの参照 */
printf("TypeCode_kind : %d\n",CORBA_TypeCode_kind(str[i].type, &env));
}CORBA::StructDef_ptr strobj;
CORBA::StructMemberSeq *structseq;
CORBA::StructMember *structmem;
// 構造体のメンバ情報がリスト形式で返されます
strobj = CORBA::StructDef::_narrow(StructObj);
structseq = strobj->members(*env);
for(int y=0; y < structseq->length(); y++) {
/* 識別名の参照 */
structmem = (CORBA::StructMember*)(*structseq)[y];
printf( "name = %s\n", (char *)structmem->name );
/* タイプコードの参照 */
CORBA::TypeCode
*typecode2 = (CORBA::TypeCode *)(structmem->type);
kind = typecode2->kind(*env);
printf("TypeCode_kind = %d\n",kind);
}org.omg.CORBA.StructDef strobj;
org.omg.CORBA.StructMember structseq[];
org.omg.CORBA.StructMember structmem;
org.omg.CORBA.TypeCode typecode;
int tkind;
// 構造体のメンバ情報がリスト形式で返されます
strobj = org.omg.CORBA.StructDefHelper.narrow( StructObj );
structseq = strobj.members();
for( i = 0; i < structseq.length; i++ ) {
// 識別名の参照
structmem = structseq[i];
inoutcc.output( "name = " + structmem.name );
// タイプコードの参照
typecode = structmem.type;
tkind = typecode.kind().value();
inoutcc.output( "TypeCode_kind = " + tkind );
}*########## 構造体のメンバ情報がリスト形式で返されます ##########
CALL "CORBA-STRUCTDEF--GET-MEMBERS" USING
STRUCT-OBJ
ENV
LINK-BUF.
SET ADDRESS OF STRMEMSEQ TO LINK-BUF.
IF SEQ-LENGTH OF STRMEMSEQ = 0
DISPLAY "STRMEM-LENGTH = 0"
END-IF.
PERFORM TEST BEFORE
VARYING CNT FROM 1 BY 1
UNTIL CNT > SEQ-LENGTH OF STRMEMSEQ
CALL "CORBA-SEQUENCE-ELEMENT-GET" USING
LINK-BUF
CNT
ELEMENT-TYPE
SET ADDRESS OF STRMEM TO ELEMENT-TYPE
*--- 識別名の参照 ---
MOVE FUNCTION LENG (DSP-BUF) TO STRING-LENGTH
CALL "CORBA-STRING-GET" USING
NAME OF STRMEM
STRING-LENGTH
DSP-BUF
DISPLAY "NAME=" DSP-BUF
*--- タイプコードの参照 ---
CALL "CORBA-TYPECODE-KIND" USING
IDL-TYPE OF STRMEM
ENV
TMP-KIND
DISPLAY "TYPECODE KIND=" TMP-KIND
END-PERFORM. 01 MEM-STR OBJECT REFERENCE CORBA-STRING.
01 TKIND TYPE CORBA-TCKIND.
01 STRUCT-MEM OBJECT REFERENCE CORBA-STRUCTMEMBER.
01 I TYPE CORBA-UNSIGNED-LONG.
01 MEM-NUM TYPE CORBA-UNSIGNED-LONG.
01 STRUCT-SEQ TYPE CORBA-STRUCTMEMBERSEQ.
*######## 構造体のメンバ情報がリスト形式で返されます
SET STRUCT-SEQ TO MEMBERS OF STRUCTDEF-OBJ
MOVE SEQ-LENGTH OF STRUCT-SEQ TO MEM-NUM
PERFORM VARYING I FROM 1 BY 1 UNTIL MEM-NUM < I
*######## 識別名の参照
INVOKE STRUCT-SEQ "GET-VALUE" USING I
RETURNING STRUCT-MEM
SET MEM-STR TO NAME OF STRUCT-MEM
INVOKE MEM-STR "GET-VALUE" RETURNING MEM-NAME
DISPLAY "NAME = " MEM-NAME
*######## タイプコードの参照
SET TYPECODE TO IDL-TYPE OF STRUCT-MEM
INVOKE TYPECODE "KIND" RETURNING TKIND
DISPLAY "TYPECODE_KIND = " TKIND
END-PERFORM(3)StringDefオブジェクトのオブジェクトリファレンスの獲得
AliasDefオブジェクトのオブジェクトリファレンスを指定してoriginal_type_defメソッドを発行すると、StringDefオブジェクトのオブジェクトリファレンスが返されます。
CORBA_IDLType originalobj; /* StringDefオブジェクトのオブジェクトの獲得 */ originalobj = CORBA_AliasDef__get_original_type_def(AliasObj,&env);
CORBA::IDLType_ptr originalobj; // StringDefオブジェクトのオブジェクトの獲得 originalobj = AliasObj->original_type_def(*env);
CORBA.IDLType originalobj; // StringDefオブジェクトのオブジェクトの獲得 originalobj = AliasObj.original_type_def();
*########## StringDefオブジェクトのオブジェクトの獲得 ##########
CALL "CORBA-ALIASDEF--GET-ORIGINAL-TYPE-DEF" USING
ALIAS-OBJ
ENV
IDLTYPE. 01 ORIGINALOBJ OBJECT REFERENCE CORBA-IDLTYPE.
01 TMP-OBJ OBJECT REFERENCE CORBA-OBJECT.
*######## StringDefオブジェクトのオブジェクトの獲得
SET ORIGINALOBJ TO ORIGINAL_TYPE_DEF OF ALIASDEF-OBJ
SET TMP-OBJ TO ORIGINALOBJ(4)StringDefオブジェクトの情報獲得
StringDefオブジェクトのオブジェクトリファレンスを指定してboundメソッドを発行すると、最大文字列長が返されます。
CORBA_unsigned_long bound; /* StringDefオブジェクトの最大文字列長の獲得 */ bound = CORBA_StringDef__get_bound(originalobj,&env);
CORBA::ULong len; CORBA::StringDef_ptr stringobj; // StringDefオブジェクトの最大文字列長の獲得 stringobj = CORBA::StringDef::_narrow(originalobj); len = stringobj->bound(*env);
org.omg.CORBA.StringDef stringobj; int len; // StringDefオブジェクトの最大文字列長の獲得 stringobj = org.omg.CORBA.StringDefHelper.narrow( originalobj ); len = stringobj.bound();
*--- StringDefオブジェクトの最大文字列長の獲得 ---
MOVE IDLTYPE TO TMP-OBJ.
CALL "CORBA-STRINGDEF--GET-BOUND" USING
TMP-OBJ
ENV
BOUND. 01 STRINGDEF-OBJ OBJECT REFERENCE CORBA-STRINGDEF.
01 LEN TYPE CORBA-UNSIGNED-LONG.
*######## StringDefオブジェクトの最大文字列長の獲得
INVOKE CORBA-STRINGDEF "NARROW" USING TMP-OBJ
RETURNING STRINGDEF-OBJ
MOVE BOUND OF STRINGDEF-OBJ TO LEN