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

第4章 アプリケーションの開発(C++言語)> 4.2 サーバアプリケーションのプログラミング(Basic Object Adapter:BOA)> 4.2.2 動的スケルトンインタフェース

4.2.2.4 ゲートウェイの処理

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

(1)メソッドの解析

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

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

      try {
          dsi_op_name = request->op_name( ev ); 
          if( strcmp( dsi_op_name, "calculate" ) == 0 ) {
              method_calculate( request ); 
          }
          CORBA::string_free( dsi_op_name ); 
      }
      catch ( CORBA::Exception e ){
          CORBA::Any p;
          ev.exception( &e );
          request->exception( &p, ev );
      }
      return; 
  }

(2)パラメタの組立て

 CORBA::ORB::create_list()により、サーバアプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクト(NVList)を生成します。このとき、パラメタとして、何個のパラメタを格納するかを指定します。結果として、リストオブジェクトのオブジェクトリファレンスが返されます。

  CORBA::NVList_ptr      arg_list; 

  orb->create_list( 2, arg_list, *env );

 CORBA::NVList::add_item()により、サーバアプリケーションに渡すパラメタをリストオブジェクトに設定します。パラメタとして、CORBA::NVListオブジェクトリファレンス、サーバアプリケーションのパラメタの名前、型、値および長さを設定します。

  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)パラメタの解析

 CORBA::ServerRequest::params()を発行して、パラメタの解析を行います。

  request->params(
          arg_list, 
          *env );

(4)復帰情報の設定

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

  CORBA::NamedValue_ptr  nvp1, 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; 

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

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

Copyright 2005 FUJITSU LIMITED