TSCContextを利用するクライアントアプリケーションの処理の流れとコードの例を示します。太字で示しているコードは,同期型呼び出しのコードと異なる部分です。
//
// "Client.cpp"
//
#include <stdio.h>
#include <iostream>
using namespace std;
#include <corba.h>
#include <tscadm.h>
#include <tscproxy.h>
#include <tscexcept.h>
#include <tsccontext.h>
#include "ABCfile_TSC_c.hh"
#define ERR_FORMAT
"EC=%d,DC=%d,PC=%d,CS=%d,MC1=%d,MC2=%d,MC3=%d,MC4=%d¥n"
extern void callService(ABC_TSCprxy_ptr abc);
int main(int argc, char** argv)
{
////////
// 1, TPBrokerの初期化処理
////////
CORBA::ORB_ptr orb = 0;
try
{
// ORBの初期化
orb = CORBA::ORB_init(argc, argv);
}
catch(CORBA::SystemException& se)
{
// 例外処理
cerr << se << endl;
exit(1);
}
////////
// 2, TPBroker OTMの初期化処理
////////
try
{
// TSCの初期化
TSCAdm::initClient(argc, argv, orb);
}
catch(TSCSystemException& se)
{
// 例外処理
fprintf(stderr, ERR_FORMAT,
se.getErrorCode(), se.getDetailCode(),
se.getPlaceCode(), se.getCompletionStatus(),
se.getMaintenanceCode1(), se.getMaintenanceCode2(),
se.getMaintenanceCode3(), se.getMaintenanceCode4());
exit(1);
}
////////
// 3, TSCデーモンへの接続
////////
TSCDomain_ptr tsc_domain = 0;
try
{
tsc_domain = new TSCDomain(0, 0);
}
catch(TSCSystemException& se)
{
// 例外処理
fprintf(stderr, ERR_FORMAT,
se.getErrorCode(), se.getDetailCode(),
se.getPlaceCode(), se.getCompletionStatus(),
se.getMaintenanceCode1(), se.getMaintenanceCode2(),
se.getMaintenanceCode3(), se.getMaintenanceCode4());
try
{
TSCAdm::endClient();
}
catch(TSCSystemException& se)
{
exit(1);
}
exit(1);
}
TSCClient_ptr tsc_client = 0;
try
{
tsc_client = TSCAdm::getTSCClient(tsc_domain,
TSCAdm::TSC_ADM_REGULATOR);
}
catch(TSCSystemException& se)
{
// 例外処理
fprintf(stderr, ERR_FORMAT,
se.getErrorCode(), se.getDetailCode(),
se.getPlaceCode(), se.getCompletionStatus(),
se.getMaintenanceCode1(), se.getMaintenanceCode2(),
se.getMaintenanceCode3(), se.getMaintenanceCode4());
try
{
TSCAdm::endClient();
}
catch(TSCSystemException& se)
{
exit(1);
}
exit(1);
}
////////
// 4, TSCユーザプロキシの生成および各種設定
////////
// ユーザ定義IDLインタフェース"ABC"用のTSCProxy生成
ABC_TSCprxy_ptr my_proxy = 0;
try
{
my_proxy = new ABC_TSCprxy(tsc_client);
}
catch(TSCSystemException& se)
{
// 例外処理
fprintf(stderr, ERR_FORMAT,
se.getErrorCode(), se.getDetailCode(),
se.getPlaceCode(), se.getCompletionStatus(),
se.getMaintenanceCode1(), se.getMaintenanceCode2(),
se.getMaintenanceCode3(), se.getMaintenanceCode4());
try
{
TSCAdm::releaseTSCClient(tsc_client);
TSCAdm::endClient();
}
catch(TSCSystemException& se)
{
exit(1);
}
exit(1);
}
////////
// 5, TSCコンテキストへのユーザデータの設定
////////
// TSCコンテキストの取得
TSCContext_ptr ctx = my_proxy->_TSCContext();
// ユーザIDの取得
ctx->setUserData((unsigned char*)"UserID:1111", 12,
TSC_FALSE);
////////
// 6, TSCユーザプロキシのメソッド呼び出し
// (サーバ側のオブジェクトの呼び出し)
////////
try
{
callService(my_proxy);
}
catch(TSCSystemException& se)
{
// 例外処理
fprintf(stderr, ERR_FORMAT,
se.getErrorCode(), se.getDetailCode(),
se.getPlaceCode(), se.getCompletionStatus(),
se.getMaintenanceCode1(), se.getMaintenanceCode2(),
se.getMaintenanceCode3(), se.getMaintenanceCode4());
try
{
delete my_proxy;
TSCAdm::releaseTSCClient(tsc_client);
TSCAdm::endClient();
}
catch(TSCSystemException& se)
{
exit(1);
}
exit(1);
}
////////
// 7, TSCユーザプロキシの削除
////////
delete my_proxy;
////////
// 8, TSCデーモンへの接続解放
////////
try
{
TSCAdm::releaseTSCClient(tsc_client);
}
catch(TSCSystemException& se)
{
// 例外処理
fprintf(stderr, ERR_FORMAT,
se.getErrorCode(), se.getDetailCode(),
se.getPlaceCode(), se.getCompletionStatus(),
se.getMaintenanceCode1(), se.getMaintenanceCode2(),
se.getMaintenanceCode3(), se.getMaintenanceCode4());
try
{
TSCAdm::endClient();
}
catch(TSCSystemException& se)
{
exit(1);
}
exit(1);
}
////////
// 9, TPBroker OTMの終了処理
////////
try
{
TSCAdm::endClient();
}
catch(TSCSystemException& se)
{
// 例外処理
fprintf(stderr, ERR_FORMAT,
se.getErrorCode(), se.getDetailCode(),
se.getPlaceCode(), se.getCompletionStatus(),
se.getMaintenanceCode1(), se.getMaintenanceCode2(),
se.getMaintenanceCode3(), se.getMaintenanceCode4());
exit(1);
}
exit(0);
};
同期型呼び出しの場合と同様です。「2.2.1(3) TSCユーザプロキシを呼び出すコード」を参照してください。