![]() ![]() ![]() ![]() ![]() ![]() ![]() |
この章では、C++と拡張C++でのコア・メンバー関数のOracle Tuxedo実装について説明します。また、擬似オブジェクトとそのC++クラスとの関係についても説明します。擬似オブジェクトとは、ネットワーク経由で転送不可能なオブジェクト参照のことです。擬似オブジェクトはその他のオブジェクトと似ていますが、ORBによって所有されるため拡張ができません。
注意: | この章に記載されている情報の一部は、Object Management Group (OMG)が発行している「Common Object Request Broker: Architecture and SpecificationRevision 2.4.2」(2001年2月)からの引用です。また、この情報は、OMGの権限を得て転載しています。 |
注意: | Oracle Tuxedo CORBA JavaクライアントとOracle Tuxedo CORBA JavaクライアントORBはTuxedo 8.1で非推奨になり、Tuxedo 9.xではサポートされなくなりました。 Oracle Tuxedo CORBA JavaクライアントとOracle Tuxedo CORBA JavaクライアントORBのすべてのテキスト・リファレンスや関連するサンプル・コードは、以下の場合にのみ使用してください。 |
注意: | サード・パーティのCORBA Java ORBのテクニカル・サポートは、各ベンダーによって提供されます。Oracle Tuxedoでは、サード・パーティのCORBA Java ORBに関する技術的なサポートやマニュアルは提供していません。 |
次のOracle Tuxedoクラスは、スコープ内においてグローバルです。
上記のクラスには、Oracle Tuxedoの開発で使用する定義済みの型、クラス、および関数が含まれています。
CORBAクラスには、CORBAで定義されている、オブジェクト・リクエスト・ブローカ(ORB)を使用する際に不可欠なクラス、データ型、およびメンバー関数があります。Oracle TuxedoのCORBAへの拡張は、Tobj C++クラスに含まれています。Tobjクラスには、Oracle TuxedoでCORBAへの拡張として用意されているデータ型、ネストされたクラス、およびメンバー関数があります。
Oracle Tuxedo製品でCORBAのデータ型とメンバー関数を使用するには、CORBA::
接頭辞が必要です。たとえば、Long
の場合はCORBA::Long
となります。同様に、Oracle Tuxedo製品でTobjのネストされたクラスとメンバー関数を使用するには、Tobj::
接頭辞が必要です。たとえば、FactoryFinderの場合はTobj::FactoryFinder
となります。
擬似オブジェクトは、CORBAクラス内部にあるローカル・クラスとして表されます。擬似オブジェクトおよび対応するメンバー関数の名前は、ネストされたクラス構造で付けます。たとえば、ORBオブジェクトの場合はCORBA::ORB
、Currentオブジェクトの場合はCORBA::Current
となります。
これらのメンバー関数のC++へのマッピングは次のとおりです:
class CORBA
{
class Any
{
public:
Any ();
Any (const Any&);
Any (TypeCode_ptr tc, void *value, Boolean release =
CORBA_ FALSE);
~Any ();
Any & operator=(const Any&);
void operator<<=(Short);
void operator<<=(UShort);
void operator<<=(Long);
void operator<<=(ULong);
void operator<<=(Float);
void operator<<=(Double);
void operator<<=(const Any&);
void operator<<=(const char*);
void operator<<=(Object_ptr);
void operator<<=(from_boolean);
void operator<<=(from_char);
void operator<<=(from_octet);
void operator<<=(from_string);
Boolean operator>>=(Short&) const;
Boolean operator>>=(UShort&) const;
Boolean operator>>=(Long&) const;
Boolean operator>>=(ULong&) const;
Boolean operator>>=(Float&) const;
Boolean operator>>=(Double&) const;
Boolean operator>>=(Any&) const;
Boolean operator>>=(char*&) const;
Boolean operator>>=(Object_ptr&) const;
Boolean operator>>=(to_boolean) const;
Boolean operator>>=(to_char) const;
Boolean operator>>=(to_octet) const;
Boolean operator>>=(to_object) const;
Boolean operator>>=(to_string) const;
TypeCode_ptr type()const;
void replace(TypeCode_ptr, void *, Boolean);
void replace(TypeCode_ptr, void *);
const void * value() const;
};
}; //CORBA
CORBA::Any::Any()
CORBA::Any
クラスのデフォルトのコンストラクタです。tc_null
型および値0 (ゼロ)のTypeCodeでAnyオブジェクトを作成します。
ほかのAnyオブジェクトのコピーであるAnyオブジェクトを作成します。
CORBA::Any::Any(const CORBA::Any & InitAny)
InitAny
CORBA::Any
クラスのコピー・コンストラクタです。このコンストラクタは、渡されるAnyのTypeCodeリファレンスを複製します。
コピーする型は、コピー元のAnyオブジェクトのrelease
フラグによって決まります。release
がCORBA_TRUE
と評価された場合、コンストラクタはパラメータの値をディープ・コピーします。release
がCORBA_FALSE
と評価された場合、コンストラクタはパラメータの値をシャロー・コピーします。シャロー・コピーを使用すると、メモリーの割当てをより高度に制御できます。ただし、呼出し側は、解放済みのメモリーをAnyが使用していないことを確認する必要があります。
CORBA::Any::Any(TypeCode_ptr TC, void * Value, Boolean Release)
TC
Value
Release
Value
引数で指定されたメモリーの所有権をAny
が想定するかどうかを指定します。Release
がCORBA_TRUE
の場合、Any
は所有権を想定します。Release
がCORBA_FALSE
の場合、Any
は所有権を想定しません。この場合、Value
引数が指すデータは、割当て時または破棄時に解放されません。
このコンストラクタは、非型保障Any
インタフェースで使用されます。指定されたTypeCodeオブジェクト参照を複製してから、Any
オブジェクト内の値が指すデータを挿入します。
CORBA::Any::~Any()
このデストラクタは、Release
フラグがCORBA_TRUE
に指定されている場合に、CORBA::Any
が保持しているメモリーを解放します。また、Any
に含まれるTypeCode擬似オブジェクト参照も解放します。
CORBA::Any & CORBA::Any::operator=(const CORBA::Any & InitAny)
InitAny
Value
でメモリーの所有権を想定するかどうかが決まります。Release
がCORBA_TRUE
の場合、Anyは所有権を想定してInitAny
引数の値をディープ・コピーします。Release
がCORBA_FALSE
の場合、AnyはInitAny
引数の値をシャロー・コピーします。
これは、Anyクラスの代入演算子です。このメンバー関数のメモリー管理は、Release
フラグの現在の値によって決まります。また、Release
フラグの現在の値によって、現在のメモリーが割当て前に解放されるかどうかも決まります。現在のRelease
フラグがCORBA_TRUE
の場合、Anyは保持していたすべての値を解放します。現在のReleaseフラグがCORBA_FALSE
の場合、Anyは保持していた値を解放しません。
InitAny
のコピーを保持するAnyを返します。
void CORBA::Any::operator<<=(CORBA::Short Value)
void CORBA::Any::operator<<=(CORBA::UShort Value)
void CORBA::Any::operator<<=(CORBA::Long Value)
void CORBA::Any::operator<<=(CORBA::Ulong Value)
void CORBA::Any::operator<<=(CORBA::Float Value)
void CORBA::Any::operator<<=(CORBA::Double Value)
void CORBA::Any::operator<<=(const CORBA::Any & Value)
void CORBA::Any::operator<<=(const char * Value)
void CORBA::Any::operator<<=(Object_ptr Value)
Value
この挿入メンバー関数は、型保障挿入を実行します。Anyに前の値があり、Release
フラグがCORBA_TRUE
の場合、メモリーの割当てを解除し、前のTypeCodeオブジェクトを解放します。次に、Value
パラメータで渡された値をコピーしてAnyに新しい値を挿入します。これにより、適切なTypeCodeリファレンスが複製されます。
CORBA::Boolean CORBA::Any::operator>>=(
CORBA::Short & Value) const
CORBA::Boolean CORBA::Any::operator>>=(
CORBA::UShort & Value) const
CORBA::Boolean CORBA::Any::operator>>=(
CORBA::Long & Value) const
CORBA::Boolean CORBA::Any::operator>>=(
CORBA::Ulong & Value) const
CORBA::Boolean CORBA::Any::operator>>=(
CORBA::Float & Value) const
CORBA::Boolean CORBA::Any::operator>>=(
CORBA::Double & Value) const
CORBA::Boolean CORBA::Any::operator>>=(CORBA::Any & Value) const
CORBA::Boolean CORBA::Any::operator>>=(char * & Value) const
CORBA::Boolean CORBA::Any::operator>>=(Object_ptr & Value) const
Value
引数は、Anyオブジェクトに格納されている値の出力を受け取る関連オブジェクトのリファレンスです。
この抽出メンバー関数は、型保障抽出を実行します。Anyオブジェクトに指定の型がある場合、このメンバー関数は、Anyのポインタを出力リファレンス値Value
に割り当て、CORBA_TRUE
を返します。Anyに適切な型がない場合は、CORBA_FALSE
を返します。ストレージはAnyオブジェクトによって所有および管理されているため、呼出し側はストレージの解放または削除を試行しないでください。Value
引数は、Anyオブジェクトに格納されている値の出力を受け取る関連オブジェクトのリファレンスです。Anyオブジェクトに適切な型がない場合、値は変更されません。
特定の型の値がAnyにあった場合はCORBA_TRUE
。特定の型の値がAnyになかった場合はCORBA_FALSE
。
void CORBA::Any::operator<<=(from_boolean Value)
void CORBA::Any::operator<<=(from_char Value)
void CORBA::Any::operator<<=(from_octet Value)
void CORBA::Any::operator<<=(from_string Value)
Value
これらの挿入メンバー関数は、AnyにCORBA::Boolean
、CORBA::Char
、またはCORBA::Octet
リファレンスを型保障で挿入します。Anyに前の値があり、そのRelease
フラグがCORBA_TRUE
の場合、メモリーの割当てを解除し、前のTypeCodeオブジェクトを解放します。次に、Value
パラメータで渡された値をコピーしてAnyオブジェクトに新しい値を挿入します。これにより、適切なTypeCodeリファレンスが複製されます。
CORBA::Boolean CORBA::Any::operator>>=(to_boolean Value) const
CORBA::Boolean CORBA::Any::operator>>=(to_char Value) const
CORBA::Boolean CORBA::Any::operator>>=(to_octet Value) const
CORBA::Boolean CORBA::Any::operator>>=(to_object Value) const
CORBA::Boolean CORBA::Any::operator>>=(to_string Value) const
Value
これらの抽出メンバー関数は、AnyからCORBA::Boolean
、CORBA::Char
、CORBA::Octet
、CORBA::Object
、または
String
リファレンスを型保障で抽出します。これらの関数は、Anyクラス内でネストされたヘルパーです。その目的は、C++ではBoolean型、char型、octet型の識別が不要なため、OMG IDLのこれらの型を識別して抽出することです。
Anyオブジェクトに指定の型がある場合、このメンバー関数は、Anyオブジェクト参照の値を出力変数Value
に割り当て、CORBA_TRUE
を返します。Anyオブジェクトに適切な型がない場合は、CORBA_FALSE
を返します。
CORBA::TypeCode_ptr CORBA::Any::type();
この関数は、Anyに関連付けられたTypeCodeオブジェクトのTypeCode_ptr
擬似オブジェクト参照を返します。TypeCode_ptr
擬似オブジェクト参照は、CORBA::release
メンバー関数で解放する必要があります。または、TypeCode_var
に割り当てて自動的に解放されるようにする必要があります。
void CORBA::Any::replace(TypeCode_ptr TC, void * Value,
Boolean Release = CORBA_FALSE);
TC
Value
Release
Release
がCORBA_TRUE
の場合、Anyは所有権を想定します。Release
がCORBA_FALSE
の場合、Anyは所有権を想定しません。この場合、Value
パラメータが指すデータは、割当て時または破棄時に解放されません。
これらのメンバー関数は、渡されたTCおよびValue
引数の値に、現在Anyに格納されているデータおよびTypeCode値を置き換えます。この関数による置換えは型保障ではありません。つまり、TypeCode値とValue
引数が指すストレージのデータ型との一貫性は、呼出し側が維持することになります。
ReleaseがCORBA_TRUE
の場合、この関数はAnyオブジェクト内の既存のTypeCode擬似オブジェクトを解放し、Anyオブジェクト参照が指すストレージを解放します。
Contextは、メソッド呼出しに関連付けられたオプションのコンテキスト情報を提供します。
これらのメンバー関数のC++へのマッピングは次のとおりです:
class CORBA
{
class Context
{
public:
const char *context_name() const;
Context_ptr parent() const;
void create_child(const char *, Context_out);
void set_one_value(const char *, const Any &);
void set_values(NVList_ptr);
void delete_values(const char *);
void get_values(
const char *,
Flags,
const char *,
NVList_out
);
}; // Context
}// CORBA
Const char * CORBA::Context::context_name () const;
このメンバー関数は、Contextオブジェクトの名前を返します。Contextオブジェクト参照は、戻り値 char *のメモリーを所有します。このメモリーは変更できません。
メンバー関数が成功した場合、Contextオブジェクトの名前を返します。ContextオブジェクトがCORBA::Context::create_child
の呼出しで作成された子Contextでない場合、値は空になることがあります。
Contextオブジェクトに名前がない場合、空の文字列になります。
void CORBA::Context::create_child (
const char * CtxName,
CORBA::Context_out CtxObject);
CtxName
CtxObject
このメンバー関数は、Contextオブジェクトの子を作成します。子Contextオブジェクトの検索は、一致する親コンテキストのプロパティ名や、必要に応じてコンテキスト・ツリーなどを対象に行われます。
CORBA::ORB::get_default_context
CORBA::release
Contextオブジェクトの指定された属性の値を削除します。
void CORBA::Context::delete_values (
const char * AttrName);
AttrName
属性が空の文字列の場合、CORBA::BAD_PARAM
。
削除する属性が見つからなかった場合、CORBA::BAD_CONTEXT
。
このメンバー関数は、Contextオブジェクトの属性の名前付きの値を削除します。ただし、親がある場合、再帰的に親に対して同じ処理は行いません。
CORBA::Context::create_child
CORBA::ORB::get_default_context
指定されたスコープ内でContextオブジェクトの属性値を取り出します。
void CORBA::Context::get_values (
const char * StartScope,
CORBA::Flags OpFlags,
const char * AttrName,
CORBA::NVList_out AttrValues);
StartScope
parent
です。値が0 (ゼロ)の場合、現在のContextオブジェクトで検索が開始されます。
OpFlags
CORBA::CTX_RESTRICT_SCOPE
のみです。このフラグを指定すると、オブジェクト実装によってプロパティの検索が現在のスコープのみに制限されます。したがって、一連の親コンテキストのプロパティの検索は再帰的に実行されません。このフラグを指定しない場合は、スコープを広げて一致が見つかるか、または検索対象がすべてのレベルになるまで検索が続行されます。
AttrName
AttrValues
属性が空の文字列の場合、CORBA::BAD_PARAM
。
一致する属性が見つからなかった場合、CORBA::BAD_CONTEXT
。
動的メモリー割当てに失敗した場合、CORBA::NO_MEMORY
。
このメンバー関数は、Contextオブジェクトの指定された属性の値を取り出します。値はNVListオブジェクトとして返します。このオブジェクトが不要になったときは、CORBA::release
メンバー関数を使用して解放する必要があります。
CORBA::Context::create_child
CORBA::ORB::get_default_context
CORBA::Context_ptr CORBA::Context::parent () const;
このメンバー関数は、Contextオブジェクトの親コンテキストを返します。Contextオブジェクトの親はContextが所有する属性で、呼出し側が変更または解放することはできません。CORBA::Context::create_child
メンバー関数でContextオブジェクトを作成するまで、親はnilです。
メンバー関数が成功した場合、Contextオブジェクトの親コンテキストを返します。親コンテキストがnilの場合もあります。CORBA::is_nil
メンバー関数を使用すると、オブジェクト参照がnilかどうかをテストできます。
メンバー関数が失敗した場合、例外がスローされます。CORBA::is_nil
メンバー関数を使用すると、オブジェクト参照がnilかどうかをテストできます。
void CORBA::Context::set_one_value (
const char * AttrName,
const CORBA::Any & AttrValue);
AttrName
AttrValue
AttrName
が空の文字列の場合、またはAttrValue
に文字列型がない場合、CORBA::BAD_PARAM
。
動的メモリー割当てに失敗した場合、CORBA::NO_MEMORY
。
このメンバー関数は、Contextオブジェクトの指定された属性値を設定します。現在、Contextオブジェクトでサポートされているのは文字列値のみです。Contextオブジェクトに属性名が設定済みの場合、最初にその属性名が削除されます。
CORBA::Context::get_values
CORBA::Context::set_values
void CORBA::Context::set_values (
CORBA::NVList_ptr AttrValue);
AttrValues
CORBA::Any
オブジェクト内で文字列型で指定する必要があります。
属性値の中に文字列型でない値がある場合、CORBA::BAD_PARAM
。
動的メモリー割当てに失敗した場合、CORBA::NO_MEMORY
。
このメンバー関数は、Contextオブジェクトの指定の属性値を設定します。CORBA::NVList
メンバー関数には、設定するプロパティの名前と値のペアが入ります。
CORBA::Context::get_values
CORBA::Context::set_one_value
ContextListを使用すると、Request呼出しで指定する必要のあるコンテキスト文字列のリストをクライアント・アプリケーションまたはサーバー・アプリケーションでを提供できるようになります。Requestメンバー関数の説明は、「Requestメンバー関数」を参照してください。
ContextListとContextは、前者が必要に応じてRequest呼出しで検索または送信されるコンテキスト文字列値のみを提供するのに対し、後者は取得する文字列値を提供する点で異なります。Contextメンバー関数については、「Contextメンバー関数」を参照してください。
これらのメンバー関数のC++へのマッピングは次のとおりです:
class CORBA
{
class ContextList
{
public:
Ulong count ();
void add(const char* ctxt);
void add_consume(char* ctxt);
const char* item(Ulong index);
Status remove(Ulong index);
}; // ContextList
}// CORBA
Ulong count ();
関数が成功した場合、戻り値はリスト内の項目数です。リストを作成したばかりで、ContextListオブジェクトを追加していない場合は、0 (ゼロ)が返されます。
CORBA::ContextList::add
CORBA::ContextList::add_consume
CORBA::ContextList::item
CORBA::ContextList::remove
名前の付いていない項目でContextListオブジェクトを作成します。これは、flags
属性のみを設定したオブジェクトです。
void add(const char* ctxt);
ctxt
メンバー関数が失敗した場合、CORBA::NO_MEMORY
例外がスローされます。
このメンバー関数は、名前の付いていない項目でContextListオブジェクトを作成します。これは、flags属性のみを設定したオブジェクトです。
ContextListオブジェクトは動的に拡張するので、そのサイズをアプリケーションで追跡する必要がありません。
関数が成功した場合、戻り値は新しく作成されたContextListオブジェクトへのポインタです。
CORBA::ContextList::add_consume
CORBA::ContextList::count
CORBA::ContextList::item
CORBA::ContextList::remove
void add_consume(const char* ctxt);
このメンバー関数は、ContextListオブジェクトを作成します。
ContextListオブジェクトは動的に拡張するので、そのサイズをアプリケーションで追跡する必要がありません。
関数が成功した場合、戻り値は新しく作成されたContextListオブジェクトへのポインタです。
CORBA::ContextList::add
CORBA::ContextList::count
CORBA::ContextList::item
CORBA::ContextList::remove
渡された索引に基づいてContextListオブジェクトへのポインタを取り出します。
const char* item(ULong index);
index
この関数が失敗した場合、BAD_PARAM
例外がスローされます。
このメンバー関数は、渡された索引に基づいてContextListオブジェクトへのポインタを取り出します。関数では、ゼロを基数にした索引を使用します。
関数が成功した場合、戻り値はContextListオブジェクトへのポインタです。
CORBA::ContextList::add
CORBA::ContextList::add_consume
CORBA::ContextList::count
CORBA::ContextList::remove
指定された索引の項目を削除し、関連付けられたメモリーをすべて解放してから、リストの残りの項目を順序付けし直します。
Status remove(ULong index);
Index
この関数が失敗した場合、BAD_PARAM
例外がスローされます。
このメンバー関数は、指定された索引の項目を削除し、関連付けられたメモリーをすべて解放してから、リストの残りの項目を順序付けし直します。
CORBA::ContextList::add
CORBA::ContextList::add_consume
CORBA::ContextList::count
CORBA::ContextList::item
NamedValueメンバー関数は、特にDIIでNVListの要素としてのみ使用します。NamedValueは、(オプション)名前、any
の値、およびラベリング・フラグを保持します。有効なフラグ値は、CORBA::ARG_IN
、CORBA::ARG_OUT
、およびCORBA::ARG_INOUT
です。
NamedValueの値は、any
の標準オペレーションで操作できます。
これらのメンバー関数のC++へのマッピングは次のとおりです:
// C++
class NamedValue
{
public:
Flags flags() const;
const char * name() const;
Any * value() const;
};
NamedValueには、次の特別なメモリー管理規則があります。
以下のセクションでは、NamedValueの各メンバー関数について説明します。
NamedValueオブジェクトのflags属性を取り出します。
CORBA::Flags CORBA::NamedValue::flags () const;
このメンバー関数は、NamedValueオブジェクトのflags属性を取り出します。
関数が成功した場合、戻り値はNamedValueオブジェクトのflags属性です。
NamedValueオブジェクトのname属性を取り出します。
const char * CORBA::NamedValue::name () const;
このメンバー関数は、NamedValueオブジェクトのname属性を取り出します。このメンバー関数が返す名前はNamedValueオブジェクトによって所有されます。そのため、変更または解放しないでください。
関数が成功した場合、戻り値はNamedValueオブジェクトのname属性を表す定数Identifierオブジェクトです。
NamedValueオブジェクトのvalue属性へのポインタを取り出します。
CORBA::Any * CORBA::NamedValue::value () const;
このメンバー関数は、NamedValueオブジェクトのvalue属性を表すAnyオブジェクトへのポインタを取り出します。この属性はNamedValueオブジェクトによって所有されます。そのため、変更または解放しないでください。
関数が成功した場合、戻り値はNamedValueオブジェクト内にあるAnyオブジェクトへのポインタです。
NVListはNamedValueのリストです。新しいNVListは、ORB::create_list
オペレーション(「CORBA::ORB::create_exception_list」を参照)で作成します。新しいNamedValueは、次のいずれかの方法でNVListの一部として作成できます。
要素は、ゼロを基数にした索引を介してアクセスおよび削除できます。add
、add_item
、add_value
、add_item_consume
、およびadd_value_consume
関数は、呼び出されるたびにNVList
を長くして新しい要素を保持できるようにします。既存の要素にアクセスするには、item
関数を使用します。
// C++
class NVList
{
public:
ULong count() const;
NamedValue_ptr add(Flags);
NamedValue_ptr add_item(const char*, Flags);
NamedValue_ptr add_value(const char*, const Any&, Flags);
NamedValue_ptr item(ULong);
void remove(ULong);
};
add
、add_item
、add_value
、add_item_consume
、add_value_consume
、およびitem
関数の戻り値の所有権はNVListが保持します。したがって、呼出し側はこれらの戻り値を解放しないでください。add_item_consume
とadd_value_consume
関数のchar*
パラメータ、およびadd_value_consume
関数のAny*
パラメータは、NVListが使用します。NVListはこれらのパラメータをコピーして、元のパラメータをすぐに破棄します。そのため、パラメータが関数に渡された後は、呼出し側がこれらのデータにアクセスすることはできません。基底のNamedValueのvalue
属性を呼出し側が変更する場合は、NamedValue::value()
オペレーションを使用します。remove
関数は、削除済みのNamedValueのCORBA::release
も呼び出します。以下のセクションでは、NVListの各メンバー関数について説明します。
名前の付いていない項目でNamedValueオブジェクトを作成します。これは、flags
属性のみを設定したオブジェクトです。
CORBA::NamedValue_ptr CORBA::NVList::add (
CORBA::Flags Flags);
Flags
このメンバー関数は、名前の付いていない項目でNamedValueオブジェクトを作成します。これは、flags属性のみを設定したオブジェクトです。NamedValueオブジェクトは、呼び出されたNVListオブジェクトに追加されます。
NVListオブジェクトは動的に拡張するので、そのサイズをアプリケーションで追跡する必要はありません。
関数が成功した場合、戻り値は新しく作成されたNamedValueオブジェクトへのポインタです。返されたNamedValueオブジェクト参照はNVListが所有するため、解放しないでください。
メンバー関数が失敗した場合、CORBA::NO_MEMORY
例外がスローされます。
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::NVList::count
CORBA::NVList::remove
空のvalue属性を作成し、nameおよびflags属性を初期化してNamedValueオブジェクトを作成します。
CORBA::NamedValue_ptr CORBA::NVList::add_item (
const char * Name,
CORBA::Flags Flags);
Name
Flags
このメンバー関数は、空のvalue属性を作成し、パラメータとして渡すnameおよびflags属性を初期化してNamedValueオブジェクトを作成します。NamedValueオブジェクトは、呼び出されたNVListオブジェクトに追加されます。
NVListオブジェクトは動的に拡張するので、そのサイズをアプリケーションで追跡する必要はありません。
関数が成功した場合、戻り値は新しく作成されたNamedValueオブジェクトへのポインタです。返されたNamedValueオブジェクト参照はNVListが所有するため、解放しないでください。
CORBA::NVList::add
CORBA::NVList::add_value
CORBA::NVList::count
CORBA::NVList::item
CORBA::NVList::remove
name、value、およびflags属性を初期化してNamedValueオブジェクトを作成します。
CORBA::NamedValue_ptr CORBA::NVList::add_value (
const char * Name,
const CORBA::Any & Value,
CORBA::Flags Flags);
Name
Value
Flags
このメンバー関数は、name、value、およびflags属性を初期化してNamedValueオブジェクトを作成します。NamedValueオブジェクトは、呼び出されたNVListオブジェクトに追加されます。
NVListオブジェクトは動的に拡張するので、そのサイズをアプリケーションで追跡する必要はありません。
関数が成功した場合、戻り値は新しく作成されたNamedValueオブジェクトへのポインタです。返されたNamedValueオブジェクト参照はNVListが所有するため、解放しないでください。
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::count
CORBA::NVList::item
CORBA::NVList::remove
CORBA::ULong CORBA::NVList::count () const;
関数が成功した場合、戻り値はリスト内の項目数です。リストを作成したばかりで、NamedValueオブジェクトを追加していない場合は、0 (ゼロ)が返されます。
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::NVList::item
CORBA::NVList::remove
渡された索引に基づいてNamedValueオブジェクトへのポインタを取り出します。
CORBA::NamedValue_ptr CORBA::NVList::item (
CORBA::ULong Index);
Index
この関数が失敗した場合、BAD_PARAM
例外がスローされます。
このメンバー関数は、渡された索引に基づいてNamedValueオブジェクトへのポインタを取り出します。関数では、ゼロを基数にした索引を使用します。
関数が成功した場合、戻り値はNamedValueオブジェクトへのポインタです。返されたNamedValueオブジェクト参照はNVListが所有するため、解放しないでください。
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::NVList::count
CORBA::NVList::remove
指定された索引の項目を削除し、関連付けられたメモリーをすべて解放してから、リストの残りの項目を順序付けし直します。
void CORBA::NVList::remove (
CORBA::ULong Index);
Index
この関数が失敗した場合、BAD_PARAM
例外がスローされます。
このメンバー関数は、指定された索引の項目を削除し、関連付けられたメモリーをすべて解放してから、リストの残りの項目を順序付けし直します。
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::NVList::count
CORBA::NVList::item
ここでは、OMG IDLインタフェースのObjectに適用される規則について説明します。Objectは、OMG IDLインタフェース階層の基底インタフェースです。インタフェースObjectでは、擬似オブジェクトではなく通常のCORBAオブジェクトを定義します。ただし、ここではほかの擬似オブジェクトも参照するため、これについても触れています。
ほかの規則に加えて、インタフェースObjectのオペレーション名はすべて、マッピングされるC++クラスの先頭にアンダースコアが付きます。また、create_request
のマッピングは3つに分類されます。これらは、「Requestメンバー関数」で説明した方式にそれぞれ対応しています。is_nil
およびrelease
関数については、「Objectメンバー関数」で説明するCORBAネームスペースを参照してください。
Oracle Tuxedoソフトウェアでは、CORBA Revision 2.2で定義されているオブジェクト参照オペレーションを使用しています。これらのオペレーションが依存するのは、型Object
のみです。したがって、オペレーションはCORBAネームスペースの中で通常の関数として記述できます。
注意: | Oracle Tuxedoソフトウェアでは、BOAではなくPOAを使用しているため、非推奨のget_implementation() メンバー関数は認識されません。このメンバー関数を参照しようとすると、コンパイル・エラーが発生します。 |
これらのメンバー関数のC++へのマッピングは次のとおりです:
class CORBA
ExceptionList_ptr Except_list,
{
class Object
{
public:
CORBA::Boolean _is_a(const char *)
CORBA::Boolean _is_equivalent();
CORBA::Boolean _nonexistent(Object_ptr);
static Object_ptr _duplicate(Object_ptr obj);
static Object_ptr _nil();
InterfaceDef_ptr _get_interface();
CORBA::ULong _hass(CORBA::ULong);
void _create_request(
Context_ptr ctx,
const char *operation,
NVList_ptr arg_list,
NamedValue_ptr result,
Request_out request,
Flags req_flags
);
Status _create_request(
Context_ptr ctx,
const char * operation,
NVList_ptr arg_list,
NamedValue_ptr result,
ContextList_ptr Context_list,Request_out request,
Flags req_flags
);
Request_ptr _request(const char* operation);
}; //Object
}; // CORBA
以下のセクションでは、Object
の各メンバー関数について説明します。
Void CORBA::Object::_create_request (
CORBA::Context_ptr Ctx,
const char * Operation,
CORBA::NVList_ptr Arg_list,
CORBA::NamedValue_ptr Result,
CORBA::ExceptionList_ptr Except_list,
CORBA::ContextList_ptr Context_list,
CORBA::Request_out Request,
CORBA::Flags Req_flags,);
Ctx
Operation
Arg_list
Result
Except_list
Context_list
Request
Req_flags
このメンバー関数は、コンテキスト、オペレーション名、およびその他の情報を提供するリクエストを作成します(長い形式)。呼出し時に指定したオペレーション名だけでリクエストを作成する(短縮形式)には、CORBA::Object::_request
メンバー関数を使用します。ただし、長い形式で提供される残りの情報については、最終的には指定する必要があります。
CORBA::Object_ptr CORBA::Object::_duplicate(
Object_ptr Obj);
obj
このメンバー関数は、指定のObjectオブジェクト参照(Obj
)を複製します。指定のオブジェクト参照がnilの場合、_duplicate
関数はnilオブジェクト参照を返します。この呼出しで返されるオブジェクトは、CORBA::release
で解放するか、または自動的に破棄されるようにCORBA::Object_var
を割り当てる必要があります。
この関数では、CORBAシステム例外がスローされる場合があります。
複製オブジェクト参照を返します。指定のオブジェクト参照がnilの場合は、nilオブジェクト参照を返します。
CORBA::Object_ptr op = TP::create_object_reference(
"IDL:Teller:1.0","MyTeller");
CORBA::Object_ptr dop = CORBA::Object::_duplicate(op);
Repositoryオブジェクトのインタフェース定義を返します。
CORBA::InterfaceDef_ptr CORBA::Object::_get_interface ();
Repositoryオブジェクトのインタフェース定義を返します。
注意: | リポジトリ・インタフェースAPIを使用するには、マクロを定義してからCORBA.h をインクルードします。マクロの定義方法については、『CORBAサーバー・アプリケーションの作成』を参照してください。 |
オブジェクトが特定のインタフェースのインスタンスであるかどうかを指定します。
CORBA::Boolean CORBA::Object::_is_a(const char * interface_id);
interface_id
このメンバー関数は、オブジェクトがinterface_id
パラメータで指定されたインタフェースのインスタンスであるかどうかを指定するために使用します。この関数を使用すると、ORBのスコープでオブジェクト参照の型保障の維持が容易になります。
オブジェクトが指定の型のインスタンスである場合、またはオブジェクトがそのオブジェクトの「最終派生」型の上位オブジェクトである場合、TRUE
を返します。
CORBA::Object_ptr op = TP::create_object_reference(
"IDL:Teller:1.0", "MyTeller");
CORBA::Boolean b = op->_is_a("IDL:Teller:1.0");
CORBA::Boolean CORBA::Object::_is_equivalent (
CORBA::Object_ptr other_obj);
other_obj
このメンバー関数は、2つのオブジェクト参照が等価であるかどうかを判別するために使用します。これにより、ORBでの判別が容易になります。この関数では、一方のオブジェクト参照が、パラメータとして渡されたオブジェクト参照と等価である場合、TRUE
を返します。2つのオブジェクト参照が同じ場合、両者は等価です。2つのオブジェクト参照が異なっても、同一のオブジェクトを参照していれば、両者は等価です。
ターゲット・オブジェクト参照が、パラメータとして渡された他方のオブジェクト参照と等価であると認識された場合、TRUE
を返します。それ以外の場合は、FALSE
を返します。
CORBA::Object_ptr op = TP::create_object_reference(
"IDL:Teller:1.0", "MyTeller");
CORBA::Object_ptr dop = CORBA::Object::_duplicate(op);
CORBA::Boolean b = op->_is_equivalent(dop);
CORBA::Object_ptr CORBA::Object::_nil();
このメンバー関数は、nilオブジェクト参照を返します。指定のオブジェクトがnilであるかどうかをテストするには、適切なCORBA::is_nil
メンバー関数を使用します。この関数については、「CORBA::release」を参照してください。_nil
メンバー関数のCORBA:is_nil
ルーチンを呼び出すと、常にCORBA_TRUE
が返されます。
CORBA::Object_ptr op = CORBA::Object::_nil();
オブジェクトが破棄されているかどうかを判別するために使用します。
CORBA::Boolean CORBA::Object::_non_existent();
このメンバー関数は、オブジェクトが破棄されているかどうかを判別するために使用します。この関数では、オブジェクトのアプリケーション・レベルのオペレーションを呼び出さずに判別を行うので、オブジェクト自体に影響は生じません。
ORBで正式にオブジェクトが存在しないことが認識された場合、CORBA::OBJECT_NOT_EXIST
を引き起こさずにCORBA_TRUE
を返します。それ以外の場合は、CORBA_FALSE
を返します。
CORBA::Request_ptr CORBA::Object::_request (
const char * Operation);
Operation
このメンバー関数は、オペレーション名を指定するリクエストを作成します。引数や結果などのその他の情報はすべて、CORBA::Request
メンバー関数で設定する必要があります。
関数が成功した場合、戻り値は新しく作成されたリクエストへのポインタです。
CORBA::Object::_create_request
ここでは、ObjectおよびPseudo-Object Referenceメンバー関数について説明します。
これらのメンバー関数のC++へのマッピングは次のとおりです:
class CORBA {
void release(Object_ptr);
void release(Environment_ptr);
void release(NamedValue_ptr);
void release(NVList_ptr);
void release(Request_ptr);
void release(Context_ptr);
void release(TypeCode_ptr);
void release(POA_ptr);
void release(ORB_ptr);
void release(ExceptionList_ptr);
void release(ContextList_ptr);
Boolean is_nil(Object_ptr);
Boolean is_nil(Environment_ptr);
Boolean is_nil(NamedValue_ptr);
Boolean is_nil(NVList_ptr);
Boolean is_nil(Request_ptr);
Boolean is_nil(Context_ptr);
Boolean is_nil(TypeCode_ptr);
Boolean is_nil(POA_ptr);
Boolean is_nil(ORB_ptr);
Boolean is_nil(ExceptionList_ptr);
Boolean is_nil(ContextList_ptr);
hash(maximum);
resolve_initial_references(identifier);
...
};
指定のオブジェクト型に対して割り当てられたリソースを解放できるようにします。
void CORBA::release(spec_object_type obj);
obj
このメンバー関数は、呼出し側が今後リファレンスにアクセスしないことを示します。その結果、関連付けられたリソースの割当てが解除される場合があります。指定したオブジェクト参照がnilの場合、releaseオペレーションは何の処理も行いません。ORBの最後のリファレンスであるORBインスタンスを解放する場合、ORBは破棄の前に停止されます。これは、CORBA::release
を呼び出す前にORB_shutdown
を呼び出すのと同じです。この処理は、ORBで呼び出されたrelease
メンバー関数にのみ適用されます。
このメンバー関数では、CORBA例外はスローされない場合があります。
CORBA::Object_ptr op = TP::create_object_reference(
"IDL:Teller:1.0", "MyTeller");
CORBA::release(op);
指定のオブジェクト型に対応するオブジェクトが存在するかどうかを判別します。
CORBA::Boolean CORBA::is_nil(spec_object_type obj);
obj
このメンバー関数は、指定のオブジェクト参照がnilかどうかを判別するために使用します。ORBで定義したnilオブジェクト参照の特別な値がオブジェクト参照にある場合、TRUEが返されます。
このオペレーションでは、CORBA例外はスローされない場合があります。
指定のオブジェクトがnilの場合はTRUE
を、それ以外の場合はFALSE
を返します。
CORBA::Object_ptr op = TP::create_object_reference(
"IDL:Teller:1.0", "MyTeller");
CORBA::Boolean b = CORBA::is_nil(op);
ORB内部の識別子でオブジェクト参照への間接アクセスを提供します。
CORBA::hash(CORBA::ULong maximum);
maximum
オブジェクト参照は、ORB内部識別子に関連付けられています。アプリケーションは、hash()オペレーションを使用して、この識別子に間接的にアクセスできます。この識別子の値は、オブジェクト参照の存続期間は変更されません。したがって、識別子のどのハッシュ関数も変更されません。
このオペレーションの値は、確実に一意とは限りません。つまり、ほかのオブジェクト参照が同じハッシュ値を返す場合もあるということです。ただし、2つのオブジェクト参照が別々にハッシュされた場合、アプリケーションでは2つのオブジェクト参照が同じでないことを判別できます。
hashオペレーションのmaximumパラメータには、ORBが返すハッシュ値の上限を指定します。この値の下限はゼロです。この機能は通常、オブジェクト参照の衝突チェーン状のハッシュ表を作成したり、これにアクセスしたりするために使用します。したがって、その範囲内で値がランダムに分散するほど、計算する値は小さくなり、計算精度も向上します。
identifier
文字列に対応する初期オブジェクト参照を返します。
CORBA::Object_ptr CORBA::resolve_initial_references(
const CORBA::char *identifier);
identifier
identifier
文字列に対応する初期オブジェクト参照を返します。有効な識別子は、“RootPOA"
および“POACurrent"
です。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
CORBA::ORB_ptr orb = CORBA::ORB_init(argc, argv);
CORBA::Object_ptr pfobj =
orb->resolve_initial_references("RootPOA");
PortableServer::POA_ptr rootPOA;
rootPOA = PortableServer::POA::narrow(pfobj);
ORBメンバー関数は、オブジェクト・リクエスト・ブローカのプログラミング・インタフェースです。
class CORBA
{
class ORB
{
public:
char *object_to_string(Object_ptr);
Object_ptr string_to_object(const char *);
void create_list(Long, NVList_out);
void create_operation_list(operationDef_ptr, NVList_out);
void create_named_value(NamedValue_out);
void create_exception_list(ExceptionList_out);
void create_context_list(ContextList_out);
void get_default_context(Context_out);
void create_environment(Environment_out);
void send_multiple_requests_oneway(const requestSeq&);
void send_multiple_requests_deferred(const requestSeq&);
Boolean poll_next_response();
void get_next_response(Request_out);
Boolean work_pending();
void perform_work();
void create_policy (in PolicyType type, in any val);
// Extension
void destroy();
// Extensions to support sharing context between threads
void Ctx get_ctx() = 0;
void set_ctx(Ctx) = 0;
void clear_ctx() = 0;
// Thread extensions
void inform_thread_exit(TID) = 0;
}; //ORB
}; // CORBA
シングル・スレッドORB、および認識されないマルチスレッド・コードを実行するマルチスレッドORBをサポートするには、perform_work
とwork_pending
の2つのオペレーションをORBインタフェースに含めます。これらのオペレーションは、シングル・スレッド・アプリケーションでもマルチスレッド・アプリケーションでも使用できます。アプリケーションが純粋なORBクライアントの場合は、これらのオペレーションは不要です。
マルチスレッド・サーバー・アプリケーションをサポートするには、get_ctx
、set_ctx
、clear_ctx
、およびinform_thread_exit
の4つのオペレーションをORBインタフェースへの拡張として含めます。
以下のセクションでは、ORBの各メンバー関数について説明します。
このメソッドでコンテキストが不要になったことを示します。このメソッドは、マルチスレッド・サーバー・アプリケーションの開発をサポートします。
void clear_ctx()
このメソッドは、スレッドがコンテキストの使用を終了した後、アプリケーション管理のスレッドによって呼び出されます。このメソッドは、当該スレッドとコンテキストとの関連付けを解除します。
注意: | clear_ctx メソッドは、Oracle Tuxedoシステムが管理しているスレッド内からは呼び出さないでください。Oracle Tuxedoシステムでは、適切にコンテキストを伝播し、管理しているスレッドを自動的にクリーンアップします。Oracle Tuxedoシステムが管理しているスレッドでこのメソッドを呼び出した場合、BAD_PARAM 例外がスローされます。 |
CORBA::ORB::get_ctx
CORBA::ORB::set_ctx
void CORBA::ORB::create_context_list(
CORBA::ContextList_out List);
List
このメンバー関数は、コンテキスト文字列のリストを作成して返します。コンテキスト文字列のリストには、動的起動インタフェース(DII)で使用可能な形式でRequestオペレーションを指定する必要があります。このリストが不要になったときは、CORBA::release
メンバー関数でリストを解放しなければなりません。
void CORBA::ORB::create_environment (
CORBA::Environment_out New_env);
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::release
void CORBA::ORB::create_exception_list(
CORBA::ExceptionList_out List);
List
このメンバー関数は、動的起動インタフェース(DII)で使用可能な形式で例外のリストを作成して返します。このリストが不要になったときは、CORBA::release
メンバー関数でリストを解放しなければなりません。
void CORBA::ORB::create_list (
CORBA::Long NumItem,
CORBA::NVList_out List);
NumItem
List
このメンバー関数は、指定の項目数を事前に割り当ててリストを作成します。リスト項目は、CORBA::NVList_add_item
メンバー関数を使用して順番にリストに追加できます。このリストが不要になったときは、CORBA::release
メンバー関数でリストを解放しなければなりません。
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::release
void CORBA::ORB::create_named_value (
NameValue_out NewNamedVal);
NewNamedVal
このメンバー関数は、NamedValueオブジェクトを作成します。これは、NamedValueオブジェクトが必要なリクエストの結果の引数を取得するために使用します。このメンバー関数を呼び出すと、NVListオブジェクトを作成するのに余計な手順を省くことができます。
NamedValueオブジェクトが不要になったときは、CORBA::release
メンバー関数でNamedValueオブジェクトを解放しなければなりません。
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::release
void CORBA::ORB::create_operation_list (
CORBA::OperationDef_ptr Oper,
CORBA::NVList_out List);
Oper
List
このメンバー関数は、動的起動インタフェース(DII)で使用可能な形式で、指定されたオペレーションの引数のリストを作成して返します。このリストが不要になったときは、CORBA::release
メンバー関数でリストを解放しなければなりません。
CORBA::OBB::create_list
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::release
指定された初期状態で特定の型のポリシー・オブジェクトの新しいインスタンスを作成します。
void CORBA::ORB::create_policy (
in PolicyType type,
in any val);
type
PolicyType
値は、BiDirPolicy::BIDIRECTIONAL_POLICY_TYPE
のみです。
val
PolicyError
このオペレーションは、指定された初期状態で特定の型のポリシー・オブジェクトの新しいインスタンスを作成するために呼び出します。ポリシーの要求された型と内容を解釈できなかったために、create_policy
が新しいポリシー・オブジェクトのインスタンス化に失敗した場合、適切な理由によりポリシー・エラー例外が発生します。(以下の例外を参照。)
リモート・クライアントではIIOPを使用しているため、コールバックを使用してBidirectionalPolicy
引数をリモート・クライアントに指定します。この引数は、コールバックを使用するネイティブ・クライアント、またはOracle Tuxedoサーバーには使用しません。これは、Oracle Tuxedoドメイン内部のマシンが個別に通信するためです。
GIOP 1.2より前では、双方向ポリシーはTCP/IPを使用するIIOPでは利用できませんでした。GIOP 1.0および1.1の通信は一方向のため、リクエストがクライアントからサーバーに送信され、レスポンスがサーバーからクライアントに送信されるだけでした。サーバーがリクエストをクライアント・マシンに戻す、つまりコールバックする場合、サーバー・マシンでは別の一方向の接続を確立する必要がありました(ここでいう「接続」とは、オペレーティング・システムのリソースのことであり、物理的な個別のワイヤや通信パスのことではありません。接続ではリソースを使用するので、接続数を最小限にすることが求められます)。
最新のOracle Tuxedo C++ソフトウェアでは、GIOP 1.2をサポートしています。これにより、リクエストの送信と受信の両方でTCP/IP接続を再利用できるようになりました。接続を再利用することにより、リモート・クライアントがOracle Tuxedoドメインにコールバック・リファレンスを送信するときにリソースを節約できます。共同クライアント/サーバーでは、接続でOracle Tuxedoドメインにリクエストを送信します。その際、コールバックのリクエストに接続を再利用することができます。接続を再利用しない場合、コールバックリクエストでは別の接続を確立しなければなりません。
接続の再利用を可能にするために、ORB/POAが用意されています。ORB/POAは、コールバック・オブジェクト参照を作成します。このオブジェクト参照のサーバー(特にコールバックの場合は、リファレンスの作成元)では、セキュリティを考慮して再利用を無効にすることができます。つまり、このマシンのコールバック・サーバーではセキュリティを要求としますが、リモート・サーバーではセキュリティを必要としないため、このマシンからリモート・サーバーにクライアントのリクエストを送信接続する際はセキュリティは不要になります。このように、接続ベースで部分的にセキュリティが確立されるので、別の接続を使用する場合に限って受信時のセキュリティを確立することができます。リモート・サーバーでセキュリティが必要な場合、またはそのセキュリティに相互認証がある場合、通常はローカル・サーバーで接続の再利用を有効にしても安全と認識されます。
プロセスがサーバー(この場合、共同クライアント/サーバー)として機能してオブジェクト参照を作成する場合は、常に接続の再利用はサーバー・エンドで行われます。そのため、接続を再利用することをORBに通知する必要があります。これは、オブジェクト参照を作成するPOAのポリシーを設定することによって行います。デフォルトのポリシーでは、再利用は無効になっています。したがって、再利用するためのポリシー・オブジェクトを指定しない限り、POAでは再利用ができません。
このデフォルトでは、CORBAバージョン2.3より前に記述されたコードとの下位互換性が維持されています。このようなコードでは、再利用が可能であることは認識されないので、再利用に関するセキュリティの実装を考慮する必要はありません。ただし、変更が加えられていないコードでは、ユーザーがセキュリティを考慮して明示的にポリシーを転換しないかぎり、引き続き再利用は無効のままになります。
再利用を有効にするには、create_policy
オペレーションを使用して再利用を可能にするポリシー・オブジェクトを作成し、そのポリシー・オブジェクトをPOA作成用のポリシー・リストの一部として使用します。
#include <BiDirPolicy_c.h>
BiDirPolicy::BidirectionalPolicy_var bd_policy;
CORBA::Any allow_reuse;
allow_reuse <<= BiDirPolicy::BOTH;
CORBA::Policy_var generic_policy =
orb->create_policy( BiDirPolicy::BIDIRECTIONAL_POLICY_TYPE,
allow_reuse );
bd_policy = BiDirPolicy::BidirectionalPolicy::_narrow(
generic_policy );
上記の例では、create_poa
オペレーションに渡されたPolicyListの中にbd_policy
を挿入しています。
void destroy();
このメソッドを使用すると、ORBに関連付けられたリソースを再利用できるようORBを破棄できます。ORBを破棄した場合、同じORB IDでORB_init
を別に呼び出すと、新しく作成されたORBのリファレンスが返されます。現在呼び出しているスレッドからアプリケーションでORB::destroy
メソッドを呼び出した場合、Oracle Tuxedoシステムでは、OMGマイナー・コード3のBAD_INV_ORDER
システム例外が発生します。これは、ブロッキングによってデッドロックが発生するためです。
現在のスレッドと関連付けられているコンテキストを取り出します。このメソッドは、マルチスレッド・サーバー・アプリケーションの開発をサポートします。
CORBA::ORB::Ctx get_ctx()
CORBA::ORB::Ctx
このメソッドを使用すると、現在のスレッドに関連付けられているコンテキストを取り出すことができます。このコンテキストは、アプリケーションによって作成および管理されるほかのスレッドを初期化するのに使用できます。
オブジェクトがスレッドを作成すると、ORBのこのオペレーションを呼び出して、スレッドに渡すことができるシステム・コンテキスト情報を取得します。このオペレーションは、すでにコンテキストを持っているスレッドから呼び出される必要があります。たとえば、メソッドがディスパッチされたスレッドには、すでにコンテキストがあります。
thread.context = TP::orb()->get_ctx();
CORBA::ORB::set_ctx
CORBA::ORB::clear_ctx
void CORBA::ORB::get_default_context
(
CORBA::Context_out
ContextObj);
ContextObj
このメンバー関数は、デフォルト・コンテキストへのリファレンスを返します。このコンテキスト・リファレンスが不要になったときは、CORBA::release
メンバー関数でコンテキスト・リファレンスを解放しなければなりません。
CORBA::Context::get_one_value
CORBA::Context::get_values
void CORBA::ORB::get_next_response (
CORBA::Request_out RequestObj);
RequestObj
このメンバー関数は、次に完了するリクエストへのリファレンスを返します。完了したリクエストがない場合、関数はリクエストが完了するまで待機します。このメンバー関数は、キューの次のリクエストを返します。これと対照的にCORBA::Request::get_response
メンバー関数は、特定のリクエストが完了するまで待機します。このリクエストが不要になったときは、CORBA::release
メンバー関数でリクエストを解放しなければなりません。
CORBA::ORB::poll_next_response
CORBA::Request::get_reponse
アプリケーション管理のスレッドに関連付けられたリソースが解放可能であることを、Oracle Tuxedoシステムに通知します。このメソッドは、マルチスレッド・サーバー・アプリケーションの開発をサポートします。
void CORBA::ORB::inform_thread_exit(CORBA::TID threadId
)
threadId
このメソッドは、次の状態をOracle Tuxedoシステムに通知します。
注意: | このオペレーションは、アプリケーションが作成および管理するスレッドに対してのみ呼び出します。Oracle Tuxedoシステムによって管理されるディスパッチ・スレッドを指定するときは、このメソッドを呼び出さないでください。 |
pOrb->inform_thread_exit(thread.threadId);
初期リファレンス・メカニズムで利用可能なリファレンスがどのオブジェクトにあるかを判別します。
typedef string ObjectId;
typedef sequence ObjectId
ObjectIdList;
ObjectIdList list_initial_services ();
ObjectId
list_initial_services ()
このオペレーションは、初期リファレンス・メカニズムで利用可能なリファレンスがどのオブジェクトにあるかを判別するために、アプリケーションで使用されます。このオペレーションは、ObjectId
のシーケンスであるObjectIdList
を返します。ObjectId
には文字列型が付きます。
初期化時に利用可能にする必要のある各オブジェクトには、それを表す文字列値が割り当てられます。また、IDの定義に加えて、返されているオブジェクトの型が必ず定義されます。たとえば、InterfaceRepository
は型Repository
のオブジェクトを返し、NameService
はCosNamingContext
オブジェクトを返します。
CORBA::ORB::resolve_initial_references
char * CORBA::ORB::object_to_string (
CORBA::Object_ptr ObjRef);
ObjRef
このメンバー関数は、オブジェクト参照の文字列表現を生成します。呼出し側のプログラムでは、文字列のメモリーが不要になったら、CORBA::string_free
メンバー関数で解放する必要があります。
CORBA::Object_ptr op = TP::create_object_reference(
"IDL:Teller:1.0", "MyTeller");
char* objstr = TP::orb()->object_to_string(op);
CORBA::ORB::string_to_object
CORBA::string_free
void CORBA::ORB::perform_work ();
None.
ORBが停止した後に、work_pending
およびperform_work()
を呼び出すと、BAD_INV_ORDER
例外が発生します。アプリケーションでは、この例外を検出して、いつポーリング・ループを終了するかを判定します。
このオペレーションは、メイン・スレッドによって呼び出された場合にORBがサーバー関連の作業を実行できるようにします。それ以外の場合は、何の処理も行いません。
work_pending()
およびperform_work()
オペレーションを使用すると、ORBなどのアクティビティのメイン・スレッドを多重化する単純なポーリング・ループを記述できます。このようなループは主に、シングル・スレッドのサーバーで必要になります。マルチスレッドのサーバーでポーリング・ループが必要になるのは、メイン・スレッドの使用が必要なほかのコードとORBの両方がある場合のみです。このようなポーリング・ループについては、以下の例を参照してください。
// C++
for (;;) {
if (orb->work_pending()) {
orb->perform_work();
}
//ほかの作業を実行させるか、
//またはスリープ状態にする
}
CORBA::Boolean CORBA::ORB::poll_next_response ();
このメンバー関数は、完了したリクエストが未処理(保留中)かどうかを報告します。これは、報告をするだけでリクエストを削除するわけではありません。完了したリクエストが未処理の場合、次にCORBA::ORB::get_next_response
メンバー関数を呼び出すと、直ちにリクエストが確実に返されます。完了したリクエストに未処理のものがない場合、直ちにCORBA::ORB::poll_next_response
メンバー関数が返されます(ブロッキング)。
完了したリクエストが未処理の場合、関数はCORBA_TRUE
を返します。
完了したリクエストに未処理のものがない場合、関数はCORBA_FALSE
を返します。
Object resolve_initial_references ( in ObjectId identifier )
raises (InvalidName);
identifier
このオペレーションは、初期サービスのオブジェクト参照を取得するためにアプリケーションで使用されます。インタフェースはネーミング・サービスの解決方法によって異なります。つまり、ObjectId
(文字列)をより複雑なネーミング・サービスの構成(名前の構成要素の文字列のペアを含んだ構造体のシーケンス)に置き換えるかどうかで異なります。この簡素化の方法を実行すると、ネームスペースは1つのコンテキストに減ります。
ObjectId
は、リファレンスが必要なオブジェクトを識別する文字列です。初期リファレンスを取得するインタフェースの簡素さを維持するには、限定したオブジェクトのセットのみに、上記の方法で見つかったリファレンスを格納します。ORB識別子とは異なり、ObjectId
ネームスペースには慎重な管理が必要になります。これを達成するため、OMGは、将来、このインタフェースを介してアプリケーションで必要になるサービスを定義し、それらのサービスの名前を指定します。
現在、予約されているObjectId
は、RootPOA
、POACurrent
、InterfaceRepository
、NameService
、TradingService
、SecurityCurrent
、TransactionCurrent
、およびDynAnyFactory
です。
アプリケーションでは、resolve_initial_references
から返されるオブジェクト参照をObjectId
でリクエストされた型に限定します。たとえば、InterfaceRepository
の場合、返されるオブジェクトはRepository
型に限定されます。
CORBA::ORB::list_initial_services
void CORBA::ORB::send_multiple_requests_deferred (
const CORBA::ORB::RequestSeq & Reqs);
Reqs
このメンバー関数は、オペレーションが完了するのを待機せずにリクエストのシーケンスを送信し、呼出し側に制御を返します。呼出し側は、CORBA::ORB::poll_ next_response
、CORBA::ORB::get_next_response
、またはCORBA::Rquest::get_response
、あるいはこれら3つをすべて使用して、オペレーションが完了したかどうか、および出力引数が更新されたかどうかを判別できます。
CORBA::Request::get_response
CORBA::ORB::get_next_response
CORBA::ORB::send_multiple_requests_oneway
void CORBA::ORB::send_multiple_requests_oneway (
const CORBA::RequestSeq & Reqs);
Reqs
このメンバー関数は、オペレーションが完了するのを待機せずにリクエストのシーケンスを送信し、呼出し側に制御を返します。呼出し側は、レスポンスを待機せず、更新する出力引数も指定しません。
CORBA::ORB::send_multiple_requests_deferred
現在のスレッドのコンテキストを設定します。このメソッドは、マルチスレッド・サーバー・アプリケーションの開発をサポートします。
void set_ctx(CORBA::ORB::Ctx aContext
)
aContext
このメソッドは、現在のアプリケーション管理スレッドのコンテキストを設定します。指定するコンテキスト・パラメータは、Oracle Tuxedoシステムによって管理されている実行済みのスレッド、または初期化済みのアプリケーション管理スレッドですでに取得されています。
注意: | set_ctx メソッドは、Oracle Tuxedoシステムが管理しているスレッドでは呼び出さないでください。Oracle Tuxedoシステムでは、管理しているスレッドに対して適切にコンテキストを自動的に伝達します。Oracle Tuxedoシステムが管理しているスレッドで、このメソッドがアプリケーションによって呼び出された場合、BAD_PARAM 例外がスローされます。 |
TP::orb()->set_ctx(thread->context);
CORBA::ORB::get_ctx()
CORBA::ORB::clear_ctx()
CORBA::ORB::object_to_string
オペレーションによって生成された文字列を変換し、対応するオブジェクト参照を返します。
C++バインディング
Object string_to_object ( in string str );
str
このオペレーションは、CORBA::ORB::object_to_string
オペレーションによって生成された文字列を変換するためにアプリケーションで使用され、対応するオブジェクト参照を返します。
確実にORBでオブジェクト参照の文字列形式を認識できるようにするには、文字列を生成する際にそのORBのobject_to_string
オペレーションを使用する必要があります。string_to_object
オペレーションでは、IORのURL、corbaloc、corbalocs、およびcorbanamesの各形式をオブジェクト参照に変換できます。変換に失敗した場合、string_to_object
オペレーションによって、次のいずれかのマイナー・コードのBAD_PARAM
標準例外が発生します。
ORBに完全準拠する場合、obj
がオブジェクトの有効なリファレンスであり、2つのオペレーションが同じORBで実行されると、string_to_object(object_to_string(obj))
は同じオブジェクトの有効なリファレンスを返します。ORBがサポートするIOPに完全準拠する場合は、2つのオペレーションが異なるORBで実行されても設定は同じままになります。
サーバー関連の作業を実行するためにORBでメイン・スレッドが必要かどうかを示す値を返します。
CORBA::boolean CORBA::ORB::work_pending ();
このオペレーションは、サーバー関連の作業を実行するためにORBでメイン・スレッドが必要かどうかを示す値を返します。
結果がTRUE
の場合は、サーバー関連の作業を実行するためにORBでメイン・スレッドが必要であることを示します。結果がFALSE
の場合は、ORBでメイン・スレッドが不要であることを示します。
ORB初期化メンバー関数のC++へのマッピングは次のとおりです。
class CORBA {
<appl-name> [-ORBid {BEA_IIOP | BEA_TOBJ} \
static CORBA::ORB_ptr ORB_init(int& argc, char** argv,
const char* orb_identifier = 0,
const char* -ORBport nnn);
[-ORBInitRef <ObjectID>=<ObjectURL> [*]]
[-ORBDefaultInitRef <ObjectURL>]
[-ORBport port-number] \
[-ORBsecurePort port-number] \
[-ORBminCrypto {0 | 40 | 56 | 128}] \
[-ORBmaxCrypto {0 | 40 | 56 | 128}] \
[-ORBmutualAuth] \
[-ORBpeerValidate {detect | warn | none}] \
[appl-options]
};
static CORBA::ORB_ptr ORB_init(int& argc, char** argv,
const char* orb_identifier = 0);
argc
argv
orb_identifier
orb_identifier
パラメータを指定すると、リモート・クライアントが“BEA_IIOP"
で明示的に指定され、「Tobj_Bootstrap」で定義されるネイティブ・クライアントが“BEA_TOBJ"
で明示的に指定されます。
このメンバー関数は、ORBのオペレーションを初期化して、ORBへのポインタを返します。ORBでプログラミングする場合は、CORBA::release
メンバー関数を使用して、CORBA::ORB_ptr
ORB_init
から返されたORBポインタに割り当てられたリソースを解放します。
返されたORBは、クライアントのタイプ(リモートまたはネイティブ)の処理方法とサーバーのポート番号の処理方法を指定する2つの情報で初期化されています。クライアントのタイプは、orb_identifier
引数、argv引数、またはシステム・レジストリで指定できます。サーバーのポート番号は、argv
引数で指定できます。
通常、引数argc
とargv
は、メイン・プログラムに渡されたパラメータと同じです。C++での指定のように、これらのパラメータには、クライアントを起動したコマンドラインの文字列トークンが格納されます。2つのORBオプションは、以下の例で示すように、トークンのペアをそれぞれ使用してコマンドラインで指定できます。
ORB_init
関数は、次の手順でORBのクライアントのタイプを判別します。
orb_identifier
引数が指定されている場合、ORB_init
は、文字列が"BEA_IIOP"
か"BEA_TOBJ"
かによって、クライアントのタイプがネイティブかリモートかを判別します。orb_identifier
文字列がある場合、argv
の -ORBid
パラメータはすべて無視または削除されます。orb_identifier
が指定されていないか、または明示的にゼロに指定されている場合、ORB_init
はargc/argv
のエントリを確認します。argv
に"-ORBid"
のエントリがある場合、次のエントリは、リモートまたはネイティブを表す"BEA_IIOP"
か"BEA_TOBJ"
かのどちらかになります。このエントリのペアが出現するのは、コマンドラインに"-ORBid BEA_IIOP"
または"-ORBid BEA_TOBJ"
のどちらかがある場合です。argc/argv
で指定されていない場合、ORB_init
は、システム・レジストリ(BEA_IIOP
またはBEA_TOBJ
)のデフォルトのクライアントのタイプを使用します。システム・レジストリは、Oracle Tuxedoのインストール時に初期化されています。Oracle Tuxedoリモート共同クライアント/サーバーの場合、IIOPをサポートするために、サーバーに対して作成されたオブジェクト参照にホストとポートを定義する必要があります。一時オブジェクト参照の場合、ORBで動的に任意のポートを取得できます。しかし、これは永続オブジェクト参照には適用できません。永続的なリファレンスの場合、ORBの再起動後に同じポートを指定する必要があります。つまり、ORBでは、オブジェクト参照が作成されたのと同じポートでリクエストを受け付けなければなりません。このように、特定のポートを使用するようにORBを構成する方法は複数あります。
通常、システム管理者は、動的範囲ではなくポート番号の「ユーザー」範囲からクライアントのポート番号を割り当てます。これにより、共同クライアント/サーバーでポートの競合を防ぐことができます。
ポート番号を指定するためにORB_init
は、argv
パラメータの"-ORBport"
トークンとそれに続く数値のトークンを検索します。たとえば、クライアントの実行可能ファイルの名前がsherryの場合、コマンドラインでは次のようにサーバーのポート937に指定します。
C++の場合、argv
パラメータの処理順序がアプリケーションでは重要になります。アプリケーションで認識されないargv
パラメータをアプリケーションで確実に処理不要にするには、ORB初期化関数を呼び出してから、残りのパラメータを処理する必要があります。したがって、ORB_init
を呼び出した後、argv
およびargc
パラメータは、ORBで認識された引数を削除するために変更されています。この際に重要なのは、ORB_init
関数が、argv
リストのパラメータの参照の順序変更または削除しかできない点です。この制限が設けられたのは、argv
リストの一部の解放を試行したり、パラメータのargv
リストの拡張を試行したりすることで発生する可能性のあるメモリー管理上の問題を防ぐためです。このような理由から、argv
は、char**&
ではなくchar**
として渡されます。
注意: | CORBA::ORB_init から返されたポインタに割り当てられたリソースを解放するには、CORBA::release メンバー関数を使用します。 |
Oracle TuxedoのCORBAオブジェクトにアクセスしたり、CORBAオブジェクトを提供するために、Oracle Tuxedo CORBA C++ ORBに基づいてアプリケーションを構成します。
<appl-name> [-ORBid {BEA_IIOP | BEA_TOBJ} \
[-ORBInitRef <ObjectID>=<ObjectURL> [*]]
[-ORBDefaultInitRef <ObjectURL>]
[-ORBport port-number] \
[-ORBsecurePort port-number] \
[-ORBminCrypto {0 | 40 | 56 | 128}] \
[-ORBmaxCrypto {0 | 40 | 56 | 128}] \
[-ORBmutualAuth] \
[-ORBpeerValidate {detect | warn | none}] \
[appl-options]
Oracle Tuxedo CORBA C++ ORBは、Oracle Tuxedoに組み込まれているライブラリです。このライブラリを使用すると、IIOPまたはIIOP-SSLを使用してOracle Tuxedoのオブジェクトにアクセスしたり、このオブジェクトを提供するためのCORBAベースのアプリケーションを開発できます。また、ORBのコマンドラインのオプションを使用すると、カスタマイズが可能になります。
[– ORBid {BEA_IIOP | BEA_TOBJ}]
BEA_IIOP
は、IIOPまたはIIOP-SSLプロトコルで通信するクライアント環境とサーバー環境をサポートするように、ORBが構成されることを明示的に指定します。 値BEA_TOBJ
は、Oracle Tuxedoドメイン内でTGIOPプロトコルでのみ通信可能なネイティブ・クライアント環境をサポートするように、ORBが構成されることを明示的に指定します。 上記のパラメータを指定しない場合、ORBは、ORB自身がデプロイされ、その環境で使用するように構成される環境を検出します。
[– ORBInitRef
ObjectId
=
ObjectURL
]
-ORBInitRef
では、初期サービスに対して任意のオブジェクト参照を指定できます。ObjectID
は、CORBA仕様で定義されるサービスの既知のオブジェクトIDを表します。このメカニズムにより、ORBのインストール時に定義しなかった、新しい初期サービスのObject IDでORBを構成できます。ObjectURL
には、CORBA仕様で定義するCORBA::ORB::string_to_object
オペレーションでサポートされている任意のURLスキームを指定できます。URLの構文に誤りがある場合、または実装で定義された方法が無効と判定された場合、CORBA::ORB_init
によって表14-2にリストするCORBA::BAD_PARAM
標準例外が生成されます。
[– ORBDefaultInitRef <ObjectURL>]
-ORBDefaultInitRef
は、-ORBInitRef
を使用して明示的に指定されていない初期参照の解決をサポートします。また、現在のTobj_Bootstrap
オブジェクトに指定されているIIOPリスナー・アドレスと同様の機能を備えています。 – ORBInitRef
引数とは異なり、-ORBDefaultInitRef
では、「/ (スラッシュ)」と文字列化したオブジェクト・キーを追加した後に、初期オブジェクト参照を識別するための新規URLを形成するURLが必要になります。たとえば、デフォルトの初期参照引数として次が指定された場合を考えます。-ORBDefaultInitRef corbaloc:555objs.com
サービスへの初期参照を取得するためのORB::resolve_initial_references(“NotificationService”)
への呼出しは、次の新規URLとなります。corbaloc:555objs.com/NotificationService
ORB::resolve_initial_references
オペレーションの実装は、新規構築URLを抽出し、サービスへの初期参照を取得するためにCORBA::ORB::string_to_object
を呼び出します。 -ORBDefaultInitRef
引数の値として指定されたURLは、複数の場所を含むことができます。これは、Tobj_Bootstrap
オブジェクトで使用される場所のリストに提供されている機能とほぼ同じです。この場合、ORBではURLの構文規則に基づいてURLの場所を処理します。たとえば、デフォルトの初期参照引数として次が指定された場合を考えます。-ORBDefaultInitRef corbaloc:555objs.com,555Backup.com
サービスへの初期参照を取得するためのORB::resolve_initial_references(“NameService”)
への呼出しは、次の新規URLのいずれかとなります。corbaloc:555objs.com/NameService
または、corbaloc:555Backup.com/NameService
結果のURLは、サービスへの初期参照を取得するためにCORBA::ORB::string_to_object
へ渡されます。
[– ORBminCrypto [0 | 40 | 56 | 128]]
[– ORBmaxCrypto [0 | 40 | 56 | 128]]
– ORBmaxCrypto
または– ORBmaxCrypto
オプションは、国際版または米国/カナダ版のOracle Tuxedoセキュリティ・アドオン・パッケージがインストールされている場合にのみ使用できます。
[– ORBmutualAuth]
– ORBmutualAuth
オプションは、国際版または米国/カナダ版のOracle Tuxedoセキュリティ・アドオン・パッケージがインストールされている場合にのみ使用できます。
[– ORBpeerValidate {detect | warn | none}]
detect
の場合、Oracle Tuxedo CORBA ORBは、接続に使用されるオブジェクト参照で指定されたホストがピアのデジタル証明書で指定されたドメイン名と一致するかを確認します。照合に失敗した場合、ORBはピアの認証を拒否し、接続を破棄します。このチェックによって、介在者の攻撃から保護します。 値がwarn
の場合、Oracle Tuxedo CORBA ORBは、接続に使用されるオブジェクト参照で指定されたホストがピアのデジタル証明書で指定されたドメイン名と一致するかを確認します。照合に失敗した場合、ORBはユーザー・ログにメッセージを書き込み、接続処理を続行します。 値がnoneの場合、Oracle Tuxedo CORBA ORBは、ピアの検証を行わずに接続処理を続行します。 – ORBpeerValidate
オプションは、国際版または米国/カナダ版のOracle Tuxedoセキュリティ・アドオン・パッケージがインストールされている場合にのみ使用できます。 値を指定しない場合は、デフォルトのdetect
が指定されます。
[– ORBport port-number]
port-number
には、Oracle Tuxedo CORBA ORBプロセスがリクエストの受信をリスニングするTCPポート番号を指定します。port-number
には、0から65535までの数字を指定します。
[– ORBsecurePort port-number]
port-number
には、Oracle Tuxedo CORBA ORBプロセスがリクエストの受信をリスニングするTCPポート番号を指定します。port-number
には、0から65535までの数字を指定します。 Oracle Tuxedo CORBA ORBへの接続に安全なものだけを有効にするには、– ORBport
と– ORBsecurePort
で指定するポート番号を同じ値に構成します。 – ORBsecurePort
オプションは、国際版または米国/カナダ版のOracle Tuxedoセキュリティ・アドオン・パッケージがインストールされている場合にのみ使用できます。
Oracle Tuxedo CORBA ORBは、UNIXおよびMicrosoft Windowsオペレーティング・システム上でOracle Tuxedoに組み込まれているクライアントまたはサーバーとしてサポートされています。また、Windows XPオペレーティング上でOracle Tuxedoに組み込まれているクライアントとしてもサポートされています。
Oracle Tuxedo CORBA ORBは、TCP/IP接続でGIOPプロトコル・バージョン1.0、1.1、または1.2をサポートする、ORB準拠のすべてのIIOPと相互運用できます。また、Oracle Tuxedo CORBA ORBは、オブジェクト参照でTAG_SSL_SEC_TRANS
タグ付きコンポーネントの使用をサポートし、Secure Sockets Layer・プロトコルのバージョン3をサポートする、ORB準拠のすべてのIIOP-SSLと相互運用できます。
ChatClient – ORBid BEA_IIOP – ORBport 2100
-ORBDefaultInitRef corbaloc:piglet:1900
-ORBInitRef TraderService=corbaloc:owl:2530
– ORBsecurePort 2100
-ORBminCrypto 40
– ORBmaxCrypto 128
TechTopics
java – DORBDefaultInitRef=corbalocs:piglet:1900
.....-DORBInitRef=TraderService=corbaloc:owl:2530
-Dorg.omg.CORBA.ORBPort=1948
-classpath=%CLASSPATH% client
ポリシーは、オペレーションに関連するORBに特定の選択を通知するオブジェクトです。この情報には、CORBAモジュールで定義されたPolicyインタフェースから生成されたインタフェースを使用する、構造化された方法でアクセスします。
注意: | 以下のCORBA::Policy オペレーションおよび構造体は、通常の場合、プログラマにとっては必須ではありません。通常、生成されたインタフェースには、仕様に関連する情報が格納されています。ポリシー・オブジェクトは、特定のファクトリ、またはCORBA::create_policy オペレーションを使用することで作成できます。 |
ポリシー・オブジェクトのC++へのマッピングは次のとおりです。
class CORBA
{
class Policy
{
public:
copy();
void destroy();
}; //Policy
typedef sequence<Policy>PolicyList;
}; // CORBA
PolicyList
には、その他のC++シーケンス・マッピングと同じものを使用します。シーケンスの使用方法については、「シーケンス」を参照してください。
POA PolicyおよびCORBA::ORB::create_policy
CORBA::Policy::copy();
このオペレーションは、ポリシー・オブジェクトをコピーします。コピーでは、ポリシーとドメインまたはオブジェクトとの間にあった関係は保持されません。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
void CORBA::Policy::destroy();
ポリシー・オブジェクトが破棄できないと判定された場合、CORBA::NO_PERMISSION
例外が発生します。
このオペレーションは、ポリシー・オブジェクトを破棄します。破棄の可否を判定するのはポリシー・オブジェクトです。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
PortableServerメンバー関数のC++へのマッピングは次のとおりです。
// C++
class PortableServer
{
public:
class LifespanPolicy;
class IdAssignmentPolicy;
class POA::find_POA
class reference_to_id
class POAManager;
class POA;
class Current;
class virtual ObjectId
class ServantBase};
ObjectId
ObjectId
値は、POAまたは実装で割り当ておよび管理できます。ObjectId
値はリファレンスによってカプセル化されるので、クライアントからは隠ぺいされます。ObjectId
には標準の形式がないため、POAでは未解釈のオクテット・シーケンスとして管理されます。
ObjectId * activate_object (
Servant p_servant);
p_servant
指定のサーバントがすでにアクティブ・オブジェクト・マップにある場合、ServantAlreadyActive
例外が発生します。
注意: | POAでサポートされていないポリシーを使用する場合、ほかの例外も発生する可能性があります。 |
このオペレーションは、ObjectId
を生成し、ObjectId
および指定のサーバントをアクティブ・オブジェクト・マップに入れることにより、個別のオブジェクトを明示的にアクティブ化します。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
次の例では、最初の構造体がユーザー定義のコンストラクタでサーバントを作成します。2番目の構造体は、オブジェクトでのリクエストの処理にサーバントが使用可能であることをPOAに通知します。POAは、そのオブジェクト用に作成したObjectId
を返します。3番目の文は、POAにIMPLICIT_ACTIVATION
ポリシー(Oracle Tuxedoソフトウェアのバージョン4.2でのみサポートされているポリシー)があると想定し、オブジェクトへのリファレンスを返します。これにより、このリファレンスは呼出し用にクライアントで処理が可能になります。クライアントがリファレンスを呼び出すと、作成されたばかりのサーバントにリクエストが返されます。
MyFooServant* afoo = new MyFooServant(poa,27);
PortableServer::ObjectId_var oid =
poa->activate_object(afoo);
Foo_var foo = afoo->_this();
指定のObjectId
で個別のオブジェクトをアクティブ化します。
void activate_object_with_id (
const ObjectId & id,
Servant p_servant);
id
p_servant
ObjectId
値で示されたCORBAオブジェクトがPOAですでにアクティブ化されている場合、ObjectAlreadyActive
例外が発生します。
サーバントがすでにアクティブ・オブジェクト・マップにある場合、ServantAlreadyActive
例外が発生します。
注意: | POAでサポートされていないポリシーを使用する場合、ほかの例外も発生する可能性があります。 |
POAにSYSTEM_IDポリシーがあり、ObjectId
値をシステムが生成しなかったり、POAに対して生成されなかったことを検出した場合、BAD_PARAMシステム例外が発生する可能性があります。こういった無効のObjectId
値をすべて検出するのに、ORBは特に必要ではありません。ただし、POAに対してシステムによって以前に生成されたObjectId
値を持つSYSTEM_IDポリシーがPOAにある場合、または以前にインスタンス化した同じPOAについてPERSISTENTポリシーがPOAにある場合、移植可能なアプリケーションではPOAのactivate_object_with_idを呼び出さないでください。
このオペレーションは、アクティブ・オブジェクト・マップで指定のObjectId
と指定のサーバントとを関連付けます。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
MyFooServant* afoo = new MyFooServant(poa, 27);
PortableServer::ObjectId_var oid =
PortableServer::string_to_ObjectId("myLittleFoo");
poa->activate_object_with_id(oid.in(), afoo);
Foo_var foo = afoo->_this();
IdAssignmentPolicyインタフェースを持つオブジェクトを取得します。これにより、ユーザーはPOA::create_POAオペレーションにオブジェクトを渡すことができます。
IdAssignmentPolicy_ptr
PortableServer::POA::create_id_assignment_policy (
PortableServer::
IdAssignmentPolicyValue value)
value
ObjectId
がアプリケーションによってのみ割り当てられることを示すPortableServer::USE
R_IDか、またはObjectId
がシステムによってのみ割り当てられることを示すPortableServer::
SYSTEM_IDのどちらかです。
POA::create_id_assignment_policyオペレーションは、IdAssignmentPolicyインタフェースを持つオブジェクトを取得します。このポリシーにPOA::create_POAオペレーションが渡されると、このポリシーは作成されるPOAのObjectId
をアプリケーションが生成するか、ORBが生成するかを指定します。指定可能な値は次のとおりです。
IdAssignmentPolicyがPOA作成時に指定されない場合、SYSTEM_IDがデフォルトに指定されます。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
LifespanPolicyインタフェースを持つオブジェクトを取得します。これにより、ユーザーはPOA::create_POAオペレーションにオブジェクトを渡すことができます。
LifespanPolicy_ptr
PortableServer::POA::create_lifespan_policy (
PortableServer::
LifespanPolicyPolicyValue value)
value
ObjectId
がアプリケーションによってのみ割り当てられることを示すPortableServer::USE
R_IDか、またはObjectId
がシステムによってのみ割り当てられることを示すPortableServer::
SYSTEM_IDのどちらかです。
POA::create_lifespan_policy
オペレーションでLifespanPolicy
インタフェースを持つオブジェクトを取得します。このオブジェクトは、POA::create_POA
オペレーションに渡され、作成されたPOAで実装されるオブジェクトの寿命を指定します。指定可能な値は次のとおりです。
TRANSIENT
- POAで実装されたオブジェクトは、最初に作成されたときのプロセスの有効期間を延ばすことができません。POAが非アクティブ化されると、そのPOAから生成されたオブジェクト参照を使用した場合、OBJECT_NOT_EXIST
例外が発生します。 PERSISTENT
- POAで実装されたオブジェクトは、最初に作成されたときのプロセスの有効期間を延ばすことができます。 LifespanPolicy
オブジェクトがPOA::create_POA
に渡されない場合、寿命ポリシーのデフォルトはTRANSIENT
に設定されます。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
POA_ptr
PortableServer::create_POA (
const char * adapter_name,
POAManager_ptr a_POAManager,
const CORBA::PolicyList & policies)
adapter_name
a_POAManager
policies
IMP_LIMIT
このオペレーションは、新しいPOAを対象のPOAの子として作成します。指定する名前は一意でなければなりません。この名前で同じ親POAを持つほかのPOAと新しいPOAとを識別します。
a_POAManagerパラメータがNULLの場合、新しいPortableServer::POAManager
オブジェクトが作成され、新しいPOAに関連付けられます。それ以外の場合、指定したPOAManagerオブジェクトは新しいPOAに関連付けられます。POAManagerオブジェクトは、属性名the_POAManagerを使用して取得できます。
指定したポリシー・オブジェクトはPOAに関連付けられ、その動作の制御に使用されます。ポリシー・オブジェクトは、このオペレーションが戻り値を返す前にコピーされます。したがって、アプリケーションではPOAの使用中にいつでもポリシー・オブジェクトを破棄できます。ポリシーは、親POAから継承されません。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
この例では、子POAは親POAと同じマネージャを使用します。この場合、子POAの状態は親と同じになります。たとえば、親がアクティブ化されていれば、子もアクティブ化されます。
CORBA::PolicyList policies(2);
policies.length (1);
policies[0] = rootPOA->create_lifespan_policy(
PortableServer::LifespanPolicy::TRANSIENT);
PortableServer::POA_ptr poa =
rootPOA->create_POA("my_little_poa",
rootPOA->the_POAManager, policies);
この例では、新しいPOAがルートPOAの子として作成されています。
CORBA::PolicyList policies(2);
policies.length (1);
policies[0] = rootPOA->create_lifespan_policy(
PortableServer::LifespanPolicy::TRANSIENT);
PortableServer::POA_ptr poa =
rootPOA->create_POA("my_little_poa",
PortableServer::POAManager::_nil(), policies);
POA生成のObjectId
値と指定のインタフェース・リポジトリIDをカプセル化するオブジェクト参照を作成します。
CORBA::Object_ptr create_reference (
const char * intf)
intf
このオペレーションには、値SYSTEM_IDを持つLifespanPolicyが必要です。このLifespanPolicyがない場合、PortableServer::Wro
ngPolicy例外が発生します。
create_referenceオペレーションは、POA生成のObjectId
値と指定のインタフェース・リポジトリIDをカプセル化するオブジェクト参照を作成します。このオペレーションは、POAに関連付けられた情報およびオペレーションのパラメータからのリファレンスを構成するために必要な情報を収集します。このオペレーションは、リファレンスを作成するだけで、リファレンスとアクティブ化されたサーバントとを関連付けるわけではありません。これにより、生成されたObjectId
を使用して、そのリファレンスの以降のリクエストをPOAに返すことができます。生成されたObjectId
値を取得するには、作成したリファレンスでPOA::reference_to_idを呼び出します。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
指定のObjectId
とインタフェース・リポジトリID値をカプセル化するオブジェクト参照を作成します。
CORBA::Object_ptr create_reference_with_id (
const ObjectId & oid,
const char * intf)
oid
intf
POAにSYSTEM_ID値を持つLifespanPolicyがあり、ObjectId
がシステムまたはPOAによって生成されなかったことをそのPOAが検出した場合、BAD_PARAMシステム例外が発生します。
create_referenceオペレーションは、指定のObjectId
とインタフェース・リポジトリID値をカプセル化するオブジェクト参照を作成します。このオペレーションは、POAに関連付けられた情報およびオペレーションのパラメータからのリファレンスを構成するために必要な情報を収集します。このオペレーションは、リファレンスを作成するだけで、リファレンスとアクティブ化されたサーバントとを関連付けるわけではありません。作成したリファレンスは、クライアントに渡されます。これにより、そのリファレンスの以降のリクエストで、指定のObjectId
を持つ同じPOAに呼出しを返すことができます。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
PortableServer::ObjectId_var oid =
PortableServer::string_to_ObjectId("myLittleFoo");
CORBA::Object_var obj = poa->create_reference_with_id(
oid.in(), "IDL:Foo:1.0");
Foo_var foo = Foo::_narrow(obj);
アクティブ・オブジェクト・マップからObjectId
を削除します。
void deactivate_object (
const ObjectId & oid)
oid
指定のObjectId
に関連付けられたアクティブ化されたオブジェクトがない場合、ObjectNotActive例外が発生します。
このオペレーションは、oidパラメータで指定されたObjectId
およびそのサーバントの関連付けをアクティブ・オブジェクト・マップから削除します。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
void destroy (
CORBA::Boolean etherealize_objects,
CORBA::Boolean wait_for_completion)
etherealize_objects
wait_for_completion
このオペレーションは、POAおよびすべての下位POAを破棄します。POAとその名前は、同じプロセスで後から再作成できます。ただし、POAManager::deactivateオペレーションで同じプロセスによる関連付けられたPOAの再作成を無効にしている場合は除きます。
POAが破棄された場合、実行を開始したリクエストについては、完了するまで処理が続行されます。実行を開始していないリクエストについては、それが新しく受け取られ、POAがないような状態で処理されます。そのため、リクエストは拒否され、OBJECT_NON_EXIST
例外が発生します。
wait_for_completionパラメータがTRUE
の場合、プロセス内のリクエストがすべて完了し、etherealizeの呼出しがすべて完了した後にのみ、destroyオペレーションは戻り値を返します。それ以外の場合、destroyオペレーションはPOAの破棄後に戻り値を返します。
注意: | このリリースのOracle Tuxedoでは、マルチスレッドをサポートしていません。そのため、オブジェクト呼出しのコンテキストで呼出しを行う場合、wait_for_completion はTRUE に指定しないでください。この指定を行うと、POAはそれが実行中のときに自身を解放できなくなります。 |
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
void find_POA( in string adapter_name, in boolean activate_it);
adapter_name
active_it
AdapterNonExistent
POAに指定の名前を持つ子POAがある場合、その子POAを返します。指定の名前を持つ子POAが存在せず、activate_it
パラメータの値がFALSE
の場合、AdapterNonExistent
例外が発生します。
指定のreference
によってカプセル化されたObjectId
値を返します。
ObjectId reference_to_id(in Object reference);
WrongAdapter
このオペレーションは、指定のreference
によってカプセル化されたObjectId
値を返します。このオペレーションを実行中のPOAによってリファレンスが作成された場合にのみ、このオペレーションは有効です。リファレンスで示されたオブジェクトがアクティブ化されているかどうかは、このオペレーションの成否には関係ありません。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
指定のreference
によってカプセル化されたObjectId
値を返します。
POAManager_ptr the_POAManager ();
この属性は読取り専用で、POAに関連付けられたPOAマネージャを識別します。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
poa->the_POAManager()->activate();
この文では、POAのPOAManagerの状態をアクティブ化に設定します。POAManagerは、POAでリクエストを受け付けるときに必要になります。POAには親があるので、ルートPOAではありません。POAの親のPOAManagerもすべて、この文でアクティブ化状態にして有効にする必要があります。
サーバントに関連付けられたPOAへのオブジェクト参照を返します。
class PortableServer
{
class ServantBase
{
public:
virtual POA_ptr _default_POA();
}
}
C++サーバントはすべて、PortableServer::ServantBase
から継承するので、_default_POA
関数も継承します。このバージョンのOracle Tuxedoでは、通常、_default_POA
を使用する必要はありません。
この関数のデフォルトの実装では、このプロセスのデフォルトORBのルートPOAへのオブジェクト参照を返します。これは、ORB::resolve_initial_references("RootPOA")
を呼び出したときの戻り値と同じです。C++サーバントは、この定義をオーバーライドして目的に応じたPOAを返すことができます。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
CORBA::Currentから生成されるPortableServer::Currentインタフェースは、メソッドが呼び出されたオブジェクトのIDにアクセスしてメソッド実装を提供します。
呼び出されるオブジェクトをそのコンテキストで識別するObjectId
を返します。
ObjectId * get_object_id ();
特にありません。
POAディスパッチ・オペレーションのコンテキストの外部で呼び出された場合、PortableServer::
NoContext例外が発生します。
このオペレーションは、呼び出されるオブジェクトをそのコンテキストで識別するPortableServer::ObjectId
を返します。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
このオペレーションは、呼び出されるオブジェクトをそのコンテキストで識別するObjectId
を返します。
呼び出されるオブジェクトをそのコンテキストで実装するPOAへのリファレンスを返します。
POA_ptr get_POA ();
特にありません。
POAディスパッチ・オペレーションのコンテキストの外部で呼び出された場合、PortableServer::
NoContext例外が発生します。
このオペレーションは、呼び出されるオブジェクトをそのコンテキストで実装するPOAへのリファレンスを返します。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
このオペレーションは、呼び出されるオブジェクトをそのコンテキストで実装するPOAへのリファレンスを返します。
各POAオブジェクトには、関連付けられたPOAManagerオブジェクトがあります。POAManagerは、1つまたは複数のPOAオブジェクトと関連付けることができます。POAManagerは、関連付けられたPOAの処理状態をカプセル化します。POAマネージャのオペレーションを使用すると、アプリケーションでPOAのリクエストをキューに登録したり、破棄したり、POAを非アクティブ化したりできます。
POAマネージャは、暗黙的に作成および破棄されます。POAの作成時にPOAManagerオブジェクトを明示的に指定しないかぎり、POAManagerはPOAの作成時に作成され、自動的にPOAに関連付けられます。POAManagerオブジェクトは、関連付けられたPOAがすべて破棄されたときに暗黙的に破棄されます。
POAManagerには、アクティブ化、非アクティブ化、保持、破棄の4つの処理状態があります。この処理状態によって、関連付けられたPOAの機能、およびPOAが受け取ったリクエストを破棄するかどうかが決まります。
POAManagerは保持状態で作成されます。この状態では、POAManagerがアクティブ化状態に移行するまで、POAの呼出しはすべてキューに登録されます。このバージョンのOracle Tuxedoでは、アクティブ化または非アクティブ化にだけ状態を移行することができます。したがって、このバージョンでは、保持状態に戻したり、破棄状態に移行したりすることができません。
void activate();
POAManagerの状態が非アクティブ化のときにこのオペレーションを発行すると、PortableServer::POAManager::AdapterInactive
例外が発生します。
このオペレーションは、POAManagerの状態をアクティブ化に変更します。状態をアクティブ化に移行すると、関連付けられたPOAはリクエストを処理できるようになります。
注意: | POAによるリクエストの処理では、すべての親POAにもアクティブ化状態のPOAManagerがなければなりません。 |
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
void deactivate (
CORBA::Boolean etherealize_objects,
CORBA::Boolean wait_for_completion);
etherealize_objects
FALSE
に設定する必要があります。
wait_for_completion
TRUE
に指定すると、deactivateオペレーションは、プロセス内のリクエストがすべて完了した後にのみ戻り値を返します。この引数をFALSE
に指定すると、deactivateオペレーションは、関連付けられたPOAの状態の変更後に戻り値を返します。
POAマネージャの状態が非アクティブ化のときに発行すると、PortableServer::POAManager::AdapterInactive
例外が発生します。
このオペレーションは、POAManagerの状態を非アクティブ化に変更します。状態を非アクティブ化に移行すると、関連付けられたPOAは、未実行のリクエストおよびすべての新しいリクエストを拒否します。
注意: | このリリースのOracle Tuxedoでは、マルチスレッドをサポートしていません。そのため、オブジェクト呼出しのコンテキストで呼出しを行う場合、wait_for_completion はTRUE に指定しないでください。したがって、POAManagerが現在実行中の場合、POAManagerは非アクティブ化に設定できません。 |
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
CORBA::Policyから生成されたインタフェースは、POAに適用するポリシーを指定するためにPOA::create_POAオペレーションで使用されます。ポリシー・オブジェクトは、ルートPOAと同様に既存のPOAのファクトリ・オペレーションを作成します。ポリシー・オブジェクトは、POAの作成時に指定します。既存のPOAではポリシーは変更できません。ポリシーは、親POAから継承されません。
create_POAオペレーションにオブジェクトの寿命を指定します。
POA::create_lifespan_policyオペレーションでLifespanPolicyインタフェースを持つオブジェクトを取得します。このオブジェクトは、POA::create_POAオペレーションに渡され、作成されたPOAで実装されるオブジェクトの寿命を指定します。指定可能な値は次のとおりです。
永続オブジェクトには、それに関連付けられたPOA (永続オブジェクトを作成したPOA)があります。ORBが永続オブジェクトでリクエストを受け取ると、POAの名前とそのすべての上位オブジェクトを基準にして、一致するPOAを検索します。
POAの名前は、その包含スコープ(親POA)内で一意でなければなりません。移植可能なプログラムでは、自身のPOAの名前とほかのプロセスで使用されるPOAの名前が競合しないことを前提にしています。
LifespanPolicyオブジェクトがcreate_POAに渡されない場合、寿命ポリシーのデフォルトはTRANSIENTに設定されます。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
作成されたPOAのObjectIds
の生成元をアプリケーションにするか、ORBにするかを指定します。
POA::create_id_assignment_policyオペレーションでIdAssignmentPolicyインタフェースを持つオブジェクトを取得します。このオブジェクトは、POA::create_POAオペレーションに渡され、作成されたPOAのObjectId
の生成元をアプリケーションにするか、ORBにするかを指定します。指定可能な値は次のとおりです。
IdAssignmentPolicyがPOA作成時に指定されない場合、SYSTEM_IDがデフォルトに指定されます。
注意: | この関数がサポートされるのは、共同クライアント/サーバーのみです。 |
これらのメンバー関数のC++へのマッピングは次のとおりです:
// C++
class Request
{
public:
Object_ptr target() const;
const char *operation() const;
NamedValue_ptr result();
NVList_ptr arguments();
Environment_ptr env();
ExceptionList_ptr exceptions();
ContextList_ptr contexts();
void ctx(Context_ptr);
Context_ptr ctx() const
// argument manipulation helper functions
Any &add_in_arg();
Any &add_in_arg(const char* name);
Any &add_inout_arg():
Any &add_inout_arg(const char* name);
Any &add_out_arg():
Any &add_out_arg(const char* name);
void set_return_type(TypeCode_ptr tc);
Any &return_value();
void invoke();
void send_oneway();
void send_deferred();
void get_response();
Boolean poll_response();
};
注意: | add_*_arg 、set_return_type 、およびreturn_value メンバー関数は、属性ベースのアクセサの使用を簡略化するものとして追加されます。 |
以下のセクションでは、これらのメンバー関数について説明します。
CORBA::NVList_ptr CORBA::Request::arguments () const;
このメンバー関数は、リクエストの引数リストを取り出します。argumentsには、input
またはoutput
、あるいはその両方を指定できます。
関数が成功した場合、戻り値はリクエストのオペレーションの引数リストへのポインタです。返された引数リストはRequestオブジェクト参照が所有するため、解放しないでください。
void CORBA::Request::ctx (
CORBA::Context_ptr CtxObject);
CtxObject
このメンバー関数は、オペレーションのContextオブジェクトを設定します。
void CORBA::Request::get_response ();
このメンバー関数は、特定のリクエストのレスポンスを取り出します。CORBA::Request::send_deferred
関数またはCORBA::Request::send_multiple_requests
関数の呼出し後に使用されます。リクエストが完了していない場合、CORBA::Request::get_response
関数によってリクエストが完了するまでブロックされます。
void CORBA::Request::invoke ();
このメンバー関数は、オブジェクト・リクエスト・ブローカ(ORB)を呼び出して、適切なサーバー・アプリケーションにリクエストを送信します。
const char * CORBA::Request::operation () const;
このメンバー関数は、リクエスト用のオペレーションを取り出します。
関数が成功した場合、戻り値はオブジェクト用のオペレーションへのポインタです。値には0 (ゼロ)を指定できます。返されたメモリーはRequestオブジェクトが所有するため、解放しないでください。
CORBA::Boolean CORBA::Request::poll_response ();
このメンバー関数は、リクエストが完了したかどうか、完了後すぐに戻り値が返されたかどうかを判別します。このメンバー関数を使用すると、リクエストの状態をチェックできます。また、CORBA::Request::get_response
の呼出しがブロックするかどうかの判別にも使用できます。
関数が成功した場合、戻り値は、レスポンスが完了済みのときはCORBA_TRUE
、レスポンスが未完了のときはCORBA_FALSE
になります。
CORBA::ORB::get_next_response
CORBA::ORB::poll_next_response
CORBA::ORB::send_multiple_requests
CORBA::Request::get_response
CORBA::Request::send_deferred
CORBA::NamedValue_ptr CORBA::Request::result ();
関数が成功した場合、戻り値はオペレーションの結果へのポインタです。返された結果はRequestオブジェクトが所有するため、解放しないでください。
CORBA::Environment_ptr CORBA::Request::env ();
関数が成功した場合、戻り値はオペレーションの環境へのポインタです。返された環境はRequestオブジェクトが所有するため、解放しないでください。
CORBA::context_ptr CORBA::Request::ctx ();
このメンバー関数は、リクエストのコンテキストを取り出します。
関数が成功した場合、戻り値はオペレーションのコンテキストへのポインタです。返されたコンテキストはRequestオブジェクトが所有するため、解放しないでください。
CORBA::ContextList_ptr CORBA::Request::contexts ();
このメンバー関数は、リクエストのコンテキスト・リストを取り出します。
関数が成功した場合、戻り値はオペレーションのコンテキスト・リストへのポインタです。返されたコンテキスト・リストはRequestオブジェクトが所有するため、解放しないでください。
CORBA::ExceptionList_ptr CORBA::Request::exceptions ();
関数が成功した場合、戻り値はリクエストの例外リストへのポインタです。返された例外リストはRequestオブジェクトが所有するため、解放しないでください。
CORBA::Object_ptr CORBA::Request::target () const;
このメンバー関数は、リクエストのターゲット・オブジェクト参照を取り出します。
関数が成功した場合、戻り値はオペレーションのターゲット・オブジェクトへのポインタです。戻り値はRequestオブジェクトが所有するため、解放しないでください。
void CORBA::Request::send_deferred ();
このメンバー関数は、遅延同期リクエストを開始します。この関数は、レスポンスが要求されたときにCORBA::Request::get_response
関数と共に使用します。
CORBA::ORB::get_next_response
CORBA::ORB::poll_next_response
CORBA::ORB::send_multiple_requests
CORBA::Request::get_response
CORBA::Request::poll_response
CORBA::Request::send_oneway
void CORBA::Request::send_oneway ();
このメンバー関数は一方向のリクエストを開始します。この関数では、レスポンスは要求されません。
CORBA::ORB::send_multiple_requests
CORBA::Request::send_deferred
// C++
namespace CORBA {
static char * string_alloc(ULong len);
static char * string_dup (const char *);
static void string_free(char *);
...
}
注意: | C++では、char の静的配列はchar* に移行が進んでいます。したがって、String_var に静的配列を割り当てる際は注意が必要になります。これは、String_var では、string_alloc で割り当てられたデータをポインタが指すことを前提としており、最終的にはstring_free でデータを解放しようとするためです。このような動作に対応するために、ANSI/ISO C++では、文字列リテラルが char* からconst char* に変更されています。ただし、ほどんどのC++コンパイラではこの変更を実装していないため、移植可能なプログラムを作成する際は、上記の注意事項に留意しなければなりません。 |
以下のセクションでは、文字列に割り当てられるメモリーを管理する各関数について説明します。
char * CORBA::string_alloc(ULong len);
len
このメンバー関数は、文字列用のメモリーを動的に割り当てます。割当てが実行できなかった場合は、nilポインタを返します。また、len+1
文字を割り当てるので、結果として得られた文字列には後続のNULL文字を保持するのに十分なスペースを確保できます。このメンバー関数で割り当てられたメモリーを解放するには、CORBA::string_free
メンバー関数を呼び出します。
関数が成功した場合、戻り値は文字列オブジェクト用に新しく割り当てられたメモリーへのポインタです。関数が失敗した場合、戻り値はnilポインタです。
char* s = CORBA::string_alloc(10);
CORBA::string_free
CORBA::string_dup
char * CORBA::string_dup (const char * Str);
Str
このメンバー関数は、NULL文字も含め文字列引数のコピーを保持するのに十分なメモリーを割り当ててから、そのメモリーに文字列引数をコピーし、新しい文字列へのポインタを返します。
関数が成功した場合、戻り値は新しい文字列へのポインタです。関数が失敗した場合、戻り値はnilポインタです。
char* s = CORBA::string_dup("hello world");
CORBA::string_free
CORBA::string_alloc
void CORBA::string_free(char * Str);
Str
このメンバー関数は、CORBA::string_alloc()
またはCORBA::string_dup()
メンバー関数で文字列に割り当てられたメモリーの割当てを解除します。この関数にnilポインタを渡すと、すべてのアクションが実行されなくなります。
この関数では、CORBA例外はスローされない場合があります。
char* s = CORBA::string_dup("hello world");
CORBA::string_free(s);
CORBA::string_alloc
CORBA::string_dup
C++では、制限付きワイド文字列型と無制限ワイド文字列型は共にCORBA::WChar*
にマッピングします。また、CORBAモジュールでは、WString_var
およびWString_out
クラスを定義します。これらの各クラスは、同じメンバー関数に、対応する文字列として同じセマンティクスを提供します。ただし、これらのクラスがワイド文字列およびワイド文字を扱う場合は例外です。
ワイド文字列の動的な割り当てまたは割当て解除は、次の関数で実行します。
// C++
namespace CORBA {
// ...
WChar *wstring_alloc(ULong len);
WChar *wstring_dup(const WChar* ws);
void wstring_free(WChar*);
};
上記のメンバー関数は、ワイド文字列を処理する点を除いて、文字列型の同じ関数として同じセマンティクスを持っています。
一般的なマッピング実装では、C++入出力ストリームでWString_var
およびWString_out
を直接使用するために、オーバーロードされたoperator<<
(挿入)とoperator>>
(抽出)の演算子が提供されます。
これらのメンバー関数については、「文字列」の対応する関数を参照してください。
リスト14-1では、ワイド文字列およびワイド文字を使用したサンプル・コードを示します。
// Get a string from the user:
cout << "String?";
char mixed[256]; // this should be big enough!
char lower[256];
char upper[256];
wchar_t wmixed[256];
cin >> mixed;
// Convert the string to a wide char string,
// because this is what the server will expect.
mbstowcs(wmixed, mixed, 256);
// Convert the string to upper case:
CORBA::WString_var v_upper = CORBA::wstring_dup(wmixed);
v_simple->to_upper(v_upper.inout());
wcstombs(upper, v_upper.in(), 256);
cout << upper << endl;
// Convert the string to lower case:
CORBA::WString_var v_lower = v_simple->to_lower(wmixed);
wcstombs(lower, v_lower.in(), 256);
cout << lower << endl;
// Everything succeeded:
return 0;
TypeCodeのコンストラクタは定義しません。ただし、マッピング・インタフェース、および各ベース・タイプと各定義済みOMG IDL型には、実装でTypeCode擬似オブジェクト参照(TypeCode_ptr
)へのアクセスが提供されます(この擬似オブジェクト参照は_tc_<type>
という形式で、この形式は、Any
での型を設定したり、equal
の引数として使用したりできます)。これらのTypeCodeリファレンス定数の名前では、<type>
は定義したスコープの範囲内にある型のローカル名を参照します。各C++ _tc_<type>
定数は、一致した型と同じスコープ・レベルで定義します。
ほかのサーバーレス・オブジェクトと同様に、TypeCodeへのC++マッピングには_nil()
オペレーションがあります。このオペレーションは、TypeCodeへのnilオブジェクト参照を返します。また、作成された型に埋め込まれたTypeCodeリファレンスの初期化にも使用できます。ただし、nil TypeCodeリファレンスは、引数としてオペレーションに渡すことができません。これは、TypeCodes
がオブジェクト参照ではなく値として渡されるためです。
これらのメンバー関数のC++へのマッピングは次のとおりです:
class CORBA
{
class TypeCode
{
public:
class Bounds { ... };
class BadKind { ... };
Boolean equal(TypeCode_ptr) const;
TCKind kind() const;
Long param_count() const;
Any *parameter(Long) const;
RepositoryId id () const;
}; // TypeCode
}; // CORBA
TypeCodeには、次の特別なメモリー管理規則があります。
以下のセクションでは、これらのメンバー関数について説明します。
2つのTypeCodeオブジェクトが同じかどうかを判別します。
CORBA::Boolean CORBA::TypeCode::equal (
CORBA::TypeCode_ptr TypeCodeObj) const;
TypeCodeObj
このメンバー関数は、TypeCodeオブジェクトが入力パラメータのTypeCodeObj
と同じかどうかを判別します。
TypeCodeオブジェクトがTypeCodeObj
パラメータと同じ場合、CORBA_TRUE
が返されます。
TypeCodeオブジェクトがTypeCodeObj
パラメータと同じでない場合、CORBA_FALSE
が返されます。
CORBA::RepositoryId CORBA::TypeCode::id () const;
TypeCodeオブジェクト参照に格納されているデータの種類を取り出します。
CORBA::TCKind CORBA::TypeCode::kind () const;
このメンバー関数は、CORBA::TypeCode
クラスのkind
属性を取り出します。この属性は、TypeCodeオブジェクト参照に格納されているデータの種類を指定します。
メンバー関数が成功した場合、TypeCodeオブジェクト参照に格納されているデータの種類を戻します。TypeCodeの種類とそのパラメータの一覧は、表14-3を参照してください。
TypeCodeオブジェクト参照のパラメータ数を取り出します。
CORBA::Long CORBA::TypeCode::param_count () const;
このメンバー関数は、CORBA::TypeCode
クラスのパラメータ属性を取り出します(この属性は、TypeCodeオブジェクト参照のパラメータ数を指定します)。各種のパラメータの一覧は、表14-3を参照してください。
関数が成功した場合、TypeCodeオブジェクト参照に格納されているパラメータ数を返します。
CORBA::Any * CORBA::TypeCode::parameter (
CORBA::Long Index) const;
Index
このメンバー関数は、索引入力引数で指定されたパラメータを取り出します。各種のパラメータの一覧は、表14-3を参照してください。
メンバー関数が成功した場合、戻り値は索引入力引数で指定されたパラメータへのポインタです。
Oracle Tuxedoソフトウェアでは、例外のスローと捕捉をサポートしています。
注意: | 例外コンストラクタを誤って使用すると、データ・メンバーが初期化されなくなります。reason フィールド付きで定義する例外は、データ・メンバーを初期化するコンストラクタを使用して作成する必要があります。デフォルトのコンストラクタを使用した場合は、そのデータ・メンバーは初期化されず、例外の破棄時にシステムによって存在しないデータの破棄が試行されます。 |
注意: | 例外を作成する際は、できる限り完全にデータ・フィールドを初期化するコンストラクタを使用するようにしてください。例外を最も簡単に識別するには、OMG IDL定義を確認します。この定義には、データ・メンバーに関する追加の定義が記述されています。 |
CORBA::SystemException::SystemException ()
CORBA::SystemException::SystemException (
const CORBA::SystemException & Se)
CORBA::SystemException::SystemException(
CORBA::ULong Minor, CORBA::CompletionStatus Status)
orbminor.h
ファイルにあります。
CORBA::SystemException::~SystemException ()
CORBA::SystemException CORBA::SystemException::operator =
const CORBA::SystemException Se)
CORBA::CompletionStatus CORBA::SystemException::completed()
CORBA::SystemException::completed(
CORBA::CompletionStatus Completed)
CORBA::ULong CORBA::SystemException::minor()
CORBA::SystemException::minor (CORBA::ULong Minor)
CORBA::SystemException * CORBA::SystemException::_narrow (
CORBA::Exception_ptr Exc)
CORBA::UserException * CORBA::UserException::_narrow(
CORBA::Exception_ptr Exc)
ここでは、ORBに対して定義される標準例外について説明します。標準例外の例外識別子は、インタフェース仕様に関係なくオペレーション呼出しの結果として返されます。標準例外は、raises
式には示されません。
標準例外の処理の複雑さを抑制するには、標準例外のセットを制御可能なサイズに抑えます。この制約により、類似する例外を数多く列挙するのではなく、同等のクラス定義の例外だけに限定することができます。
たとえば、動的なメモリー割当てができないために、さまざまなポイントでオペレーション呼出しが失敗することがあります。その際、動的なメモリー割当ての失敗に対応する1つの例外が定義されます。つまり、マーシャルまたはマーシャル解除、クライアント、オブジェクト実装ネットワーク・パケットの割り当てなど、メモリー割当ての失敗で例外が発生するさまざまな要因に対応する、複数の異なる例外を列挙するといったことは行いません。各標準例外には、例外のサブカテゴリを指定するマイナー・コードが含まれています。マイナー・コードの値の割当ては、各ORB実装で行います。
また、標準例外にはcompletion_status
コードも含まれています。このコードは、次のいずれかの値を取ります。
CORBA::COMPLETED_YES
CORBA::COMPLETED_NO
CORBA::COMPLETED_MAYBE
次の表に、標準例外の説明を示します。クライアントは、この一覧にはないシステム例外の処理を準備しておく必要があります。これは、将来のバージョンの仕様で標準例外の定義が追加される可能性があるため、およびORB実装で非標準のシステム例外が発生する可能性があるためです。例外の詳細については、『メッセージ』を参照してください。
表14-4に例外を定義します。
削除済みのオブジェクトを呼び出すと、常にCORBA::OBJECT_NOT_EXIST
例外が発生します。この場合、「困難な」フォルトとして報告されます。この例外を受け取った場合は、このオブジェクト参照のすべてのコピーの削除、およびほかの適切な「最終リカバリ」手順の実行が許可(推奨)されます。
CORBA::TRANSACTION_REQUIRED
例外は、リクエストではNULLトランザクション・コンテキストを登録したにもかかわらず、アクティブなトランザクションが要求されたことを示します。
CORBA::TRANSACTION_ROLLEDBACK
例外は、リクエストに関連付けられたトランザクションがロールバック済みか、またはロールバックとしてマークされていたことを示します。したがって、要求されたオペレーションは実行できなかったか、または実行されていません。これは、トランザクションでこれ以降の計算が無意味になるためです。
CORBA::INVALID_TRANSACTION
は、リクエストが無効なトランザクション・コンテキストを登録したことを示します。たとえば、リソースを登録しようとしたときにエラーが発生した場合に、この例外が発生します。
ExceptionList
メンバー関数を使用すると、Requestが呼び出されたときに発生するユーザー定義例外すべてのTypeCodeのリストを、クライアント・アプリケーションまたはサーバー・アプリケーションで提供できるようになります。Requestメンバー関数については、「Requestメンバー関数」を参照してください。
これらのメンバー関数のC++へのマッピングは次のとおりです:
class CORBA
{
class ExceptionList
{
public:
Ulong count ();
void add(TypeCode_ptr tc);
void add_consume(TypeCode_ptr tc);
TypeCode_ptr item(Ulong index);
Status remove(Ulong index);
}; // ExceptionList
}// CORBA
Ulong count ();
関数が成功した場合、戻り値はリスト内の項目数です。リストを作成したばかりで、ExceptionListオブジェクトを追加していない場合は、0 (ゼロ)が返されます。
名前の付いていない項目でExceptionListオブジェクトを作成します。これは、flags
属性のみを設定したオブジェクトです。
void add(TypeCode_ptr tc);
tc
メンバー関数が失敗した場合、CORBA::NO_MEMORY
例外がスローされます。
このメンバー関数は、名前の付いていない項目でExceptionListオブジェクトを作成します。これは、flags属性のみを設定したオブジェクトです。
ExceptionListオブジェクトは動的に拡張するので、そのサイズをアプリケーションで追跡する必要はありません。
関数が成功した場合、戻り値は新しく作成されたExceptionListオブジェクトへのポインタです。
CORBA::ExceptionList::add_consume
CORBA::ExceptionList::count
CORBA::ExceptionList::item
CORBA::ExceptionList::remove
void add_consume(TypeCode_ptr tc);
tc
このメンバー関数は、ExceptionListオブジェクトを作成します。
ExceptionListオブジェクトは動的に拡張するので、そのサイズをアプリケーションで追跡する必要はありません。
関数が成功した場合、戻り値は新しく作成されたExceptionListオブジェクトへのポインタです。
CORBA::ExceptionList::add
CORBA::ExceptionList::count
CORBA::ExceptionList::item
CORBA::ExceptionList::remove
渡された索引に基づいてExceptionListオブジェクトへのポインタを取り出します。
TypeCode_ptr item(ULong index);
index
関数が失敗した場合、BAD_PARAM
例外がスローされます。
このメンバー関数は、渡された索引に基づいてExceptionListオブジェクトへのポインタを取り出します。関数では、ゼロを基数にした索引を使用します。
関数が成功した場合、戻り値はExceptionListオブジェクトへのポインタです。
CORBA::ExceptionList::add
CORBA::ExceptionList::remove
CORBA::ExceptionList::add_consume
CORBA::ExceptionList::count
CORBA::ExceptionList::remove
指定された索引の項目を削除し、関連付けられたメモリーをすべて解放してから、リストの残りの項目を順序付けし直します。
Status remove(ULong index);
Index
関数が失敗した場合、BAD_PARAM
例外がスローされます。
このメンバー関数は、指定された索引の項目を削除し、関連付けられたメモリーをすべて解放してから、リストの残りの項目を順序付けし直します。
CORBA::ExceptionList::add
CORBA::ExceptionList::add_consume
CORBA::ExceptionList::count
CORBA::ExceptionList::item
![]() ![]() ![]() |