(1)IDLマッピング
IDL言語で属性宣言(attribute)を定義すると、オブジェクトのデータ設定/取得を行う関数(関数名はIDLで定義された変数名)にマッピングされます。
以降では、以下のIDL定義例をもとに説明します。
module ODsample{ interface attrtest{ attribute long para1; attribute string para2; readonly attribute long para3; }; };
CORBA::Long para1; av->para1(100,*env); // データ設定関数 para1 = av->para1(*env); // データ取得関数 CORBA::Char* p; p = CORBA::string_alloc(7); av->para2( p,*env ); // データ設定関数 p = av->para2( *env ); // データ取得関数 CORBA::Long para3; para3 = av->para3(*env); // データ取得関数
(2)クライアントアプリケーションで扱うパラメタ
データ設定関数でデータ設定に使用するデータ域はinパラメタと同様に扱われます。また、データ取得関数でデータ取得に使用するデータ域は復帰パラメタと同様に扱われます。このため、可変長データでは、その領域が不要になった時点で領域を解放する必要があります。
ODsample::attrtest_var av env = new CORBA::Environment; CORBA::Long para1; para1 = av->para1(*env); av->para1(100, *env); para1 = av->para1(*env); cout << para1 << endl; CORBA::Char* p; p = CORBA::string_alloc(7); strcpy( p, "STRING" ); av->para2( p,*env ); CORBA::string_free( p ); p = av->para2( *env ); cout << p << endl; CORBA::string_free( p ); para3 = av->para3(*env); cout << para3 << endl;
(3)サーバアプリケーションで扱うパラメタ
データ設定関数でデータ設定に使用するデータ域はinパラメタと同様に扱われ、スケルトンで自動的に獲得/解放されます。データ取得関数でデータ取得に使用するデータ域は、復帰パラメタと同様に扱われます。このため、可変長データでは、データ域獲得関数で領域獲得する必要があります。獲得した領域はスケルトンで自動的に解放されます。
CORBA::Long ODsample_attrtest_impl::para1( // データ取得関数 CORBA::Environment & ) throw( CORBA::Exception ) { CORBA::Long para1; return( para1 ); } void ODsample_attrtest_impl::para1( // データ設定関数 CORBA::Long data, CORBA::Environment & ) throw( CORBA::Exception ) { CORBA::Long para1; para1 = data; } CORBA::Char* ODsample_attrtest_impl::para2( // データ取得関数 CORBA::Environment & ) throw( CORBA::Exception ) { static CORBA::Char* p; p = "test"; return( p ); } void ODsample_attrtest_impl::para2( // データ設定関数 const CORBA::Char* data, CORBA::Environment & ) throw( CORBA::Exception ) { CORBA::String_var para2(""); para2 = data; return; } CORBA::Long ODsample_attrtest_impl::para3( // データ取得関数 CORBA::Environment & ) throw( CORBA::Exception ) { CORBA::Long para3; return( para3 ); }