Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]() ![]() |
第10章 インタフェースリポジトリサービスのプログラミング | > 10.4 インタフェースリポジトリサービスのプログラミング |
以下のIDL定義に対するOperationDefオブジェクトのパラメタ情報を獲得するプログラミングを説明します。
module test1 { interface intf1 { long add(in long a, in long b); long sub(in long c, in long d) ; }; };
上記のIDL定義の場合、以下のオブジェクトがインタフェースリポジトリサービスに格納されます。
システム提供サービスのオブジェクトリファレンスの取り出しメソッド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.
対象の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.
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.
以下の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定義の場合、以下のオブジェクトがインタフェースリポジトリサービスに格納されます。
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.
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
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
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
目次
索引
![]() ![]() |