Contextインタフェースを使用したデータ値の設定方法/取得方法についてのプログラム例を以下に示します。IDLは、以下のIDLを使用します。
module ODsample { interface contexttest { long op( in long x ) context( "DATA", "DATA1", "DATA2" ); }; };
注意
Portable-ORBを使用した運用を行う場合、Contextインタフェースは使用できません。
(1)C言語でのプログラミング例
CORBA_ORB_get_default_context()で取得したContextオブジェクトに対して、CORBA_Context_set_one_value()を発行してプロパティ名とそのデータ値をContextオブジェクトに関連付けます。
CORBA_ORB orb; CORBA_Environment env; CORBA_Object obj; CORBA_Context_ptr context; /*デフォルト・コンテキストの取得 */ CORBA_ORB_get_default_context( orb, &context, &env ); /* データ値の設定 */ CORBA_ORB_set_one_value( context, "DATA", "data", env ); CORBA_ORB_set_one_value( context, "DATA1", "data1", env ); CORBA_ORB_set_one_value( context, "DATA2", "data2", env ); /* Contextの送信 */ ODsample_contexttest_op( obj, 3, context, &env );
サーバでは、CORBA_Context_get_values()を使用して、プロパティ名とそれに関連したデータ値を取得できます。このとき、検索するプロパティ名にワイルドカード(*)を使用できます。
void ODsample_contexttest_op( ODsample_contexttest obj, CORBA_long x, CORBA_Context context, CORBA_Environment *env ) { CORBA_NVList nvlist; CORBA_long len; /* コンテキストに関連付けられた情報の取得 */ CORBA_Context_get_values( context, "", 0, "DATA*", &nvlist , env ); /* nvlistの解析 */ CORBA_NVList_get_count( nvlist, &len, &env ); for ( i = 0; i < len; i++ ){ printf("NVList:[%s]\n", *(CORBA_string *)nvlist[i].argument._value ); /* DATA, DATA1, DATA2の各データ値が表示されます。*/ } ... }
(2)C++言語でのプログラミング例
CORBA::ORB::get_default_context()で取得したContextオブジェクトに対して、CORBA::Context::set_one_value()を発行してプロパティ名とそのデータ値をContextオブジェクトに関連付けます。
CORBA::ORB_ptr orb; CORBA::Environment env; CORBA::Object_ptr obj; CORBA::Context_ptr context; try { /*デフォルト・コンテキストの取得 */ orb->get_default_context( context, env ); /* データ値の設定 */ CORBA::Any p1, p2, p3; p1 <<= (const CORBA::Char *)"data"; context->set_one_value( "DATA", p1, env ); p2 <<= (const CORBA::Char *)"data1"; context->set_one_value("DATA1", p2, env ); p3 <<= (const CORBA::Char *)"data2"; context_set_one_value( "DATA2", p3, env ); /* Contextの送信 */ obj->op( 3, context, env ); } catch( CORBA::Exception &e ){ // エラー処理 }
サーバでは、CORBA::Context::get_values()を使用して、プロパティ名とそれに関連したデータ値を取得できます。このとき、検索するプロパティ名にワイルドカード(*)を使用できます。
void ODsample_contexttest_impl::op( CORBA::Long x, CORBA::Context_ptr context, CORBA::Environment &env ) throw( CORBA::Exception ) { CORBA::NVList_ptr nvlist; CORBA::NamedValue_ptr nv; /* コンテキストに関連付けられた情報の取得 */ context->get_values( NULL, 0, "DATA*", nvlist , env ); /* nvlistの解析 */ CORBA::Long len = nvlist->count( env ); for( I = 0; I < len; I++ ){ nv = nvlist->item( I, env ); CORBA::Any *data = nv->value( env ); CORBA::Char *str = (CORBA::Char *)data->value(); } ... }
(3)Java言語でのプログラミング例
org.omg.CORBA.ORB.get_default_context()で取得したContextオブジェクトに対して、org.omg.CORBA.Context.set_one_value()を発行してプロパティ名とそのデータ値をContextオブジェクトに関連付けます。
org.omg.CORBA.ORB Orb; ODsample.contexttestOperations obj; try { : /*デフォルト・コンテキストの取得 */ org.omg.CORBA.Context ctx = Orb.get_default_context(); /* データ値の設定 */ org.omg.CORBA.Any p1,p2,p3; p1 = Orb.create_any(); p1.insert_string("data"); ctx.set_one_value("DATA",p1); p2 = Orb.create_any(); p2.insert_string("data1"); ctx.set_one_value("DATA1",p2); p3 = Orb.create_any(); p3.insert_string("data2"); ctx.set_one_value("DATA2",p3); /* Contextの送信 */ obj.op( 3, ctx ); } catch ( Exception e ) { System.out.println( "ERROR" ); // エラー処理 }
サーバでは、org.omg.CORBA.Context.get_values()を使用して、プロパティ名とそれに関連したデータ値を取得できます。このとき、検索するプロパティ名にワイルドカード(*)を使用できます。
/* Servant内のオペレーション実装部分 */ public void op( int x, org.omg.CORBA.Context ctx ) { /* コンテキストに関連付けられた情報の取得 */ NVList nvlist = ctx.get_values("",0,"DATA*"); /* nvlistの解析 */ int count = nvlist.count(); org.omg.CORBA.NamedValue nv; String str; for(int i=0;i<count;i++){ nv = nvlist.item(i); str = nv.value().extract_string(); System.out.println( "result = " + str ); /* DATA, DATA1, DATA2の各データ値が表示されます。*/ } return; }