![]() ![]() ![]() ![]() |
この付録では、インターセプタの実装を開始する際に使用できる次のコードを示します。
このコードを使用する場合は、YourInterceptor
を実装しているインターセプタの名前に置き換えてください。
#if defined(WIN32)
#include <windows.h>
#endif
#include <ctype.h>
#include "YourInterceptor
.h"
// クラスのクリーンアップ -- 推奨
class Cleanup
{
public:
Cleanup() {}
~Cleanup()
{
// <<<ここにコードを記入する>>>
}
};
static Cleanup CleanupOnImageExit;
#define SECURITY_BUFFSIZE 100
#if defined(WIN32)
// 標準 DLL 処理の提案
BOOL WINAPI DllMain( HANDLE hDLL,
DWORD dwReason,
LPVOID lpReserved )
{
switch( dwReason )
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
// オペレーションが正常に実行されたという情報を返す
return( TRUE );
}
#endif /* WIN32 */
/*************************************************************
関数名:YourInterceptor
Init
機能説明:
初期化中に ORB によって呼び出される初期化ルーチンです。
このルーチンは、サポートしている RequestLevelInterceptor
クラスのインスタンスを作成して返します。
注意 : インターセプタ ライブラリは、複数の初期化エントリ ポイントを
指定することによって、複数セットのインターセプタをサポートできます。
この場合、各初期化エントリを個別に ORB に登録する必要があります。
また、1 種類のインターセプタのみを指定することもできます。つまり、
クライアントのみ、またはターゲットのみを指定できます。
***************************************************************/
#ifdef WIN32
extern "C" __declspec(dllexport) void __cdecl
#else
extern "C" void
#endifYourInterceptor
Init(
CORBA::ORB_ptr TheORB,
RequestLevelInterceptor::ClientRequestInterceptor ** ClientPtr,
RequestLevelInterceptor::TargetRequestInterceptor ** TargetPtr,
CORBA::Boolean * RetStatus)
{
// <<<ここにコードを記入する>>>
}
/*************************************************************
関数名:YourInterceptor
Client constructor
機能説明:
***************************************************************/YourInterceptor
Client::YourInterceptor
Client(CORBA::ORB_ptr TheOrb)
{
// この次の行は有用だが、絶対に必要なものではない
m_orb = TheOrb;
// <<<ここにコードを記入する>>>
}
/*************************************************************
関数名:YourInterceptor
Client::shutdown
機能説明:
shutdown オペレーションは、インターセプタの
実装に、インターセプタが停止中である
ことを通知するために、ORB によって使用されます。
ORB は、オペレーションから ORB に制御が返されると、
インターセプタのインスタンスを破棄します。
***************************************************************/
Interceptors::ShutdownReturnStatusYourInterceptor
Client::shutdown(
Interceptors::ShutdownReason reason,
CORBA::Exception_ptr & excep_val)
{
// 次の各行は、単なる提案例。必要に応じて置換する
Interceptors::ShutdownReturnStatus ret_status = Interceptors::SHUTDOWN_NO_EXCEPTION;
switch (reason)
{
case Interceptors::ORB_SHUTDOWN:
// <<<ここにコードを記入する>>>
break;
case Interceptors::CONNECTION_ABORTED:
// <<<ここにコードを記入する>>>
break;
case Interceptors::RESOURCES_EXCEEDED:
// <<<ここにコードを記入する>>>
break;
}
return ret_status;
}
/*************************************************************
関数名:YourInterceptor
Client::id
機能説明:
id アクセサ オペレーションは、ベンダによって割り当てられたインターセプタの
ID を文字列値として取得するために ORB によって使用されます。この属性は、
主に ORB によって呼び出されたインターセプタのオペレーションのデバッグ
とトレーシングに使用されます。
***************************************************************/
CORBA::StringYourInterceptor
Client::id()
{
// <<<ここにコードを記入する>>>
// 次の行は、想定される有用な実装
return CORBA::string_dup("YourInterceptor
Client");
}
/*************************************************************
関数名:YourInterceptor
Client::exception_occurred
機能説明:
例外が発生すると、exception_occurred オペレーションが要求レベルの
インターセプタの実装に対して呼び出されます。
これは、そのインターセプタの <xxx>_response メソッドの代わりに
呼び出されるものです。ORB がこのオペレーションを呼び出すことにより、
インターセプタの実装は、管理していた、
ある要求に固有の一切の状態を、クリーンアップできるようになります。
***************************************************************/
voidYourInterceptor
Client::exception_occurred (
const RequestLevelInterceptor::ReplyContext & reply_context,
CORBA::Exception_ptr excep_val)
{
// <<<ここにコードを記入する>>>
}
/*************************************************************
関数名:YourInterceptor
Client::client_invoke
機能説明:
このオペレーションは、ターゲット オブジェクトが異なる
アドレス領域にあるか、同じアドレス領域にあるかに関係なく、
呼び出しがターゲット オブジェクトに送信されると ORB に
よって呼び出されます。
***************************************************************/
Interceptors::InvokeReturnStatusYourInterceptor
Client::client_invoke (
const RequestLevelInterceptor::RequestContext & request_context,
RequestLevelInterceptor::ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr request_arg_stream,
CORBA::DataOutputStream_ptr reply_arg_stream,
CORBA::Exception_ptr & excep_val)
{
// 次の行は提案例。以下の最終行と関連して機能する
Interceptors::InvokeReturnStatus ret_status = Interceptors::INVOKE_NO_EXCEPTION;
// <<<ここにコードを記入する>>>
return ret_status;
}
/*************************************************************
関数名:YourInterceptor
Client::client_response
機能説明:
このオペレーションは、開始プロセスがターゲット
オブジェクトと異なるアドレス領域にあるか、同じアドレス
領域にあるかに関係なく、呼び出しへの応答が要求の
開始プロセスによって受信されると ORB によって
呼び出されます。
***************************************************************/
Interceptors::ResponseReturnStatusYourInterceptor
Client::client_response (
const RequestLevelInterceptor::ReplyContext & reply_context,
RequestLevelInterceptor::ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr arg_stream,
CORBA::Exception_ptr & excep_val)
{
// 次の行は提案例。以下の最終行と関連して機能する
// これ以外の一般的な使用方法の提案については、例を参照
Interceptors::ResponseReturnStatus ret_status = Interceptors::RESPONSE_NO_EXCEPTION;
// <<<ここにコードを記入する>>>
return ret_status;
}
/*************************************************************
関数名 :YourInterceptor
Target constructor
機能説明 :
この関数は、ターゲット インターセプタのインスタンスを構成します。
この例では、セキュリティ インターセプタの実装に
使用できるデータ メンバーを示します。
***************************************************************/YourInterceptor
Target::YourInterceptor
Target(CORBA::ORB_ptr TheOrb) :
m_orb(TheOrb), // 提案例
m_security_current(0), // セキュリティ インターセプタの提案例
m_attributes_to_get(0) // セキュリティ インターセプタの提案例
{
// <<<ここにコードを記入する>>>
}
/*************************************************************
関数名 :YourInterceptor
Target::shutdown
機能説明 :
shutdown オペレーションは、インターセプタの
実装に、インターセプタが停止中である
ことを通知するために、ORB によって使用されます。
ORB は、オペレーションから ORB に制御が返されると、
インターセプタのインスタンスを破棄します。
***************************************************************/
Interceptors::ShutdownReturnStatusYourInterceptor
Target::shutdown(
Interceptors::ShutdownReason reason,
CORBA::Exception_ptr & excep_val)
{
// <<<ここにコードを記入する>>>
// 次の各行は、単なる提案例。必要に応じて置換する
Interceptors::ShutdownReturnStatus ret_status = Interceptors::SHUTDOWN_NO_EXCEPTION;
switch (reason)
{
case Interceptors::ORB_SHUTDOWN:
// <<<ここにコードを記入する>>>
break;
case Interceptors::CONNECTION_ABORTED:
// <<<ここにコードを記入する>>>
break;
case Interceptors::RESOURCES_EXCEEDED:
// <<<ここにコードを記入する>>>
break;
}
return ret_status;
}
/*************************************************************
関数名 :YourInterceptor
Target::id
機能説明 :
id アクセサ オペレーションは、ベンダによって割り当てられたインターセプタの
ID を文字列値として取得するために ORB によって使用されます。この属性は、
主に ORB によって呼び出されたインターセプタのオペレーションのデバッグ
とトレーシングに使用されます。
***************************************************************/
CORBA::StringYourInterceptor
Target::id()
{
// <<<ここにコードを記入する>>>
// 次の行は、想定される有用な実装
return CORBA::string_dup("YourInterceptor
Target");
}
/*************************************************************
関数名 :YourInterceptor
Target::exception_occurred
機能説明 :
例外が発生すると、exception_occurred オペレーションが要求レベルの
インターセプタの実装に対して呼び出されます。
これは、そのインターセプタの <xxx>_response メソッドの代わりに
呼び出されるものです。ORB がこのオペレーションを呼び出すことにより、
インターセプタの実装は、管理していた、
ある要求に固有の一切の状態を、クリーンアップできるようになります。
***************************************************************/
voidYourInterceptor
Target::exception_occurred (
const RequestLevelInterceptor::ReplyContext & reply_context,
CORBA::Exception_ptr excep_val)
{
// <<<ここにコードを記入する>>>
}
/*************************************************************
関数名 :YourInterceptor
Target::target_invoke
機能説明 :
このオペレーションは、ターゲット オブジェクトが
異なるアドレス領域にあるか、
同じアドレス領域にあるかに関係なく、
呼び出しがターゲット オブジェクトによって
受信されると ORB によって呼び出されます。
***************************************************************/
Interceptors::InvokeReturnStatusYourInterceptor
Target::target_invoke (
const RequestLevelInterceptor::RequestContext & request_context,
RequestLevelInterceptor::ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr request_arg_stream,
CORBA::DataOutputStream_ptr reply_arg_stream,
CORBA::Exception_ptr & excep_val)
{
// 次の行は提案例。以下の最終行と関連して機能する
Interceptors::InvokeReturnStatus ret_status = Interceptors::INVOKE_NO_EXCEPTION;
// <<<ここにコードを記入する>>>
return ret_status;
}
/*************************************************************
関数名 :YourInterceptor
Target::target_response
機能説明 :
このオペレーションは、開始プロセスがターゲット
オブジェクトと異なるアドレス領域にあるか、同じアドレス
領域にあるかに関係なく、呼び出しへの応答が要求の
開始プロセスに送信されると ORB によって
呼び出されます。
***************************************************************/
Interceptors::ResponseReturnStatusYourInterceptor
Target::target_response (
const RequestLevelInterceptor::ReplyContext & reply_context,
RequestLevelInterceptor::ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr arg_stream,
CORBA::Exception_ptr & excep_val)
{
// 次の行は提案例。以下の最終行と関連して機能する
Interceptors::ResponseReturnStatus ret_status = Interceptors::RESPONSE_NO_EXCEPTION;
// <<<ここにコードを記入する>>>
return ret_status;
}
/*************************************************************
関数名 :YourInterceptor
Target destructor
機能説明 :
***************************************************************/YourInterceptor
Target::~YourInterceptor
Target()
{
// <<<ここにコードを記入する>>>
}
#include <CORBA.h>
#include <RequestLevelInterceptor.h>
#include <security_c.h> // セキュリティ用
classYourInterceptor
Client : public virtual RequestLevelInterceptor::ClientRequestInterceptor
{
private:
YourInterceptor
Client() {}
CORBA::ORB_ptr m_orb;
public:
YourInterceptor
Client(CORBA::ORB_ptr TheOrb);
~YourInterceptor
Client() {}
Interceptors::ShutdownReturnStatus shutdown(
Interceptors::ShutdownReason reason,
CORBA::Exception_ptr & excep_val);
CORBA::String id();
void exception_occurred (
const RequestLevelInterceptor::ReplyContext & reply_context,
CORBA::Exception_ptr excep_val);
Interceptors::InvokeReturnStatus client_invoke (
const RequestLevelInterceptor::RequestContext & request_context,
RequestLevelInterceptor::ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr request_arg_stream,
CORBA::DataOutputStream_ptr reply_arg_stream,
CORBA::Exception_ptr & excep_val);
Interceptors::ResponseReturnStatus client_response (
const RequestLevelInterceptor::ReplyContext & reply_context,
RequestLevelInterceptor::ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr arg_stream,
CORBA::Exception_ptr & excep_val);
};
classYourInterceptor
Target : public virtual RequestLevelInterceptor::TargetRequestInterceptor
{
private:
YourInterceptor
Target() {}
CORBA::ORB_ptr m_orb;
SecurityLevel1::Current_ptr m_security_current; // セキュリティ用
Security::AttributeTypeList * m_attributes_to_get; // セキュリティ用
public:
YourInterceptor
Target(CORBA::ORB_ptr TheOrb);
~YourInterceptor
Target();
Interceptors::ShutdownReturnStatus shutdown(
Interceptors::ShutdownReason reason,
CORBA::Exception_ptr & excep_val);
CORBA::String id();
void exception_occurred (
const RequestLevelInterceptor::ReplyContext & reply_context,
CORBA::Exception_ptr excep_val);
Interceptors::InvokeReturnStatus target_invoke (
const RequestLevelInterceptor::RequestContext & request_context,
RequestLevelInterceptor::ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr request_arg_stream,
CORBA::DataOutputStream_ptr reply_arg_stream,
CORBA::Exception_ptr & excep_val);
Interceptors::ResponseReturnStatus target_response (
const RequestLevelInterceptor::ReplyContext & reply_context,
RequestLevelInterceptor::ServiceContextList_ptr service_context,
CORBA::DataInputStream_ptr arg_stream,
CORBA::Exception_ptr & excep_val);
};
![]() ![]() ![]() |