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;
}