2.2.1 同期型呼び出しをするクライアントアプリケーションの例(C++)

同期型呼び出しをするクライアントアプリケーションの処理の流れとコードの例を示します。

<この項の構成>
(1) サービス利用処理の流れ
(2) サービス利用処理のコード
(3) TSCユーザプロキシを呼び出すコード

(1) サービス利用処理の流れ

  1. TPBrokerの初期化処理
  2. TPBroker OTMの初期化処理
  3. TSCデーモンへの接続
  4. TSCユーザプロキシの生成および各種設定
  5. TSCユーザプロキシのメソッド呼び出し(サーバ側のオブジェクトの呼び出し)
  6. TSCユーザプロキシの削除
  7. TSCデーモンへの接続解放
  8. TPBroker OTMの終了処理

(2) サービス利用処理のコード

//
// "Client.cpp"
//
#include <stdio.h>
#include <iostream.h>

#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);

};

(3) TSCユーザプロキシを呼び出すコード

//
// "callService.cpp"
//
#include <stdio.h>
#include <iostream.h>

#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*  res_data;

 try
 {
   // サーバのメソッドの呼び出し
   abc->call(req_data, res_data);
 }
 catch(TSCSystemException& se)
 {
   // 例外処理
   fprintf(stderr, ERR_FORMAT,
      se.getErrorCode(), se.getDetailCode(),
      se.getPlaceCode(), se.getCompletionStatus(),
      se.getMaintenanceCode1(), se.getMaintenanceCode2(),
      se.getMaintenanceCode3(), se.getMaintenanceCode4());
   throw;
 }

}