同期型呼び出しをするクライアントアプリケーションの処理の流れとコードの例を示します。
//
// "Client.cpp"
//
#include <stdio.h>
#include <iostream>
using namespace std;
#include <corba.h>
#include <tscadm.h>
#include <tscproxy.h>
#include <tscexcept.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ユーザプロキシのメソッド呼び出し
// (サーバ側のオブジェクトの呼び出し)
////////
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);
}
////////
// 6, TSCユーザプロキシの削除
////////
delete my_proxy;
////////
// 7, 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);
}
////////
// 8, 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);
};
//
// "callService.cpp"
//
#include <stdio.h>
#include <iostream>
using namespace std;
#include <corba.h>
#include <tscadm.h>
#include <tscproxy.h>
#include <tscexcept.h>
#include "ABCfile_TSC_c.hh"
#define SEND_MESSAGE_LENGTH (256)
#define ERR_FORMAT
"EC=%d,DC=%d,PC=%d,CS=%d,MC1=%d,MC2=%d,MC3=%d,MC4=%d¥n"
void callService(ABC_TSCprxy_ptr abc)
{
////////
// サービスの呼び出し
////////
// in引数の準備
sampleOctetSeq req_data;
req_data.length(SEND_MESSAGE_LENGTH);
for(int i=0; i<SEND_MESSAGE_LENGTH; ++i)
{
req_data[i] = (unsigned char)(i%256);
};
// out引数の準備
sampleOctetSeq_var res_data;
try
{
// サーバのメソッドの呼び出し
abc->call(req_data, res_data.out());
}
catch(TSCSystemException& se)
{
// 例外処理
fprintf(stderr, ERR_FORMAT,
se.getErrorCode(), se.getDetailCode(),
se.getPlaceCode(), se.getCompletionStatus(),
se.getMaintenanceCode1(), se.getMaintenanceCode2(),
se.getMaintenanceCode3(), se.getMaintenanceCode4());
throw;
}
}