Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

付録F 動的スケルトンインタフェースのプログラミング> F.2 C++言語の開発> F.2.1 Basic Object Adapter : BOA

F.2.1.4 ゲートウェイの処理

 ゲートウェイでは、以下に示す処理を行います。

ゲートウェイの実装例を以下に示します。

  static void
  dsi(
      CORBA::Object_ptr          obj, 
      CORBA::ServerRequest_ptr   request, 
      CORBA::Environment         &ev ) 
  {
      CORBA::RepositoryId dsi_op_name; 

      try {
          // (1) メソッドの解析
          dsi_op_name = request->op_name( ev ); 
          if( strcmp( dsi_op_name, "calculate" ) == 0 ) {
              method_calculate( request ); 
          }
          CORBA::string_free( dsi_op_name ); 
      }
      // (5) 例外情報の設定
      catch ( ODdemo::calculator::ZEROPARAM &_zeroparam ) {
          CORBA::Any *_any = new CORBA::Any( _tc_ODdemo_calculator_ZEROPARAM, &_zeroparam );
          request->exception( _any, ev );
      }
      catch ( CORBA::Exception e ){
          // 例外発生時の処理を記述してください。
          // 復帰情報あるいは例外情報を設定してください
      }
      return; 
  }

  void
  method_calculate( CORBA::ServerRequest_ptr request )
  throw( CORBA::Exception ) 
  {
      try {
          // (2) パラメタの組立て
          // パラメタリストの生成
          CORBA::NVList_ptr    arg_list;
          orb->create_list( 2, arg_list, *env ); 

          CORBA::Any p1, p2;

          CORBA::Long l;

          // パラメタ情報の登録
          l = 0;
          p1 <<= l;
          arg_list->add_value(
                              "a",
                              p1,
                              CORBA::ARG_IN,
                              *env );
          p2 <<= l;
          arg_list->add_value(
                              "b",
                              p2,
                              CORBA::ARG_IN,
                              *env );

          // (3) パラメタの解析
          request->params(
                         arg_list,
                         *env );

          CORBA::NamedValue_ptrnvp1, nvp2;

          nvp1 = arg_list->item(0,*env);
          nvp2 = arg_list->item(1,*env);

          CORBA::Any *r1, *r2;
          r1 = nvp1->value(*env);
          r2 = nvp2->value(*env);

          CORBA::Long a,b; 
           (*r1) >>= a;
           (*r2) >>= b;
          cout << " a = [" << a << "] b = [" << b << "]" << endl;

          if ( b == 0 ){
              ODdemo::calculator::ZEROPARAM excep = ODdemo::calculator::ZEROPARAM();
              throw( excep );
          }

          // (4) 復帰情報の設定
          ODdemo::calculator::result *res =
              new ODdemo::calculator::result();
          res->add_result = a+b;
          res->subtract_result = a-b;
          res->multiple_result = a*b;
          res->divide_result = (CORBA::Float)a/b;

          CORBA::Any *tmp_any = new CORBA::Any;
          tmp_any->replace( _tc_ODdemo_calculator_result, 
                               (void *)res, CORBA_TRUE );
          request->result( tmp_any, *env );
      }
      catch ( ODdemo::calculator::ZEROPARAM &_zeroparam ) {
          throw( _zeroparam );
      }
      catch( CORBA::Exception e ) {
          throw( e );
      }
  }

(1)メソッドの解析

 CORBA::ServerRequest::op_name()を発行して、メソッド名の解析を行います。

(2)パラメタの組立て

(3)パラメタの解析

 CORBA::ServerRequest::params()を発行して、パラメタの解析を行います。この結果、アプリケーションに渡すパラメタ値が取得されます。

(4)復帰情報の設定

 CORBA::ServerRequest::result()を発行して、復帰情報の設定を行います。

(5)例外情報の設定

 CORBA::ServerRequest::exception()を発行して、例外情報の設定を行います。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005