Borland(R) Enterprise Server VisiBroker(R) デベロッパーズガイド

[目次][索引][前へ][次へ]

24.5 クライアントアプリケーションのサンプル

コードサンプル24-4および24-5に,Borland Enterprise Server VisiBrokerをインストールしたディレクトリのexamples/vbe/dynanyに入っているクライアントアプリケーションを示します。クライアントアプリケーションはDynStructインタフェースを使って,動的にStructType構造体を生成します。

DynStructインタフェースは,NameValuePairオブジェクトのシーケンスを使って,構造体メンバとメンバに対応する値を表現します。名前・値の各ペアは,構造体のメンバ名を含む文字列と,構造体メンバの値を含むAnyオブジェクトで構成されています。

通常の方法でVisiBroker ORBを初期化し,PrintManagerオブジェクトにバインドしたあと,クライアントは次の動作をします。

  1. 空のDynStructを適切な型で生成します。
  2. 構造体メンバを含むための,NameValuePairオブジェクトのシーケンスを生成します。
  3. 構造体メンバの各値用にAnyオブジェクトを生成し,初期化します。
  4. 各NameValuePairを,適切なメンバ名と値で初期化します。
  5. DynStructオブジェクトをNameValuePairシーケンスで初期化します。
  6. PrinterManager::printAnyメソッド(C++)またはPrinterManager.printAnyメソッド(Java)を呼び出し,通常のAnyに変換したDynStructを渡します。

DynAnyオブジェクトまたはその派生型の一つをオペレーション要求のパラメタとして渡す前に,DynAny::to_anyメソッド(C++)またはDynAny.to_anyメソッド(Java)を使って,これをAnyに変換しておいてください。

コードサンプル24-4 DynStructを使用したクライアントアプリケーションのサンプル(C++)
 
// Client.C
 
#include "Printer_c.hh"
#include "dynany.h"
 
int main(int argc, char* const* argv) {
   try {
   // Initialize the ORB.
   CORBA::ORB_ptr orb = CORBA::ORB_init(argc, argv);
   DynamicAny::DynAnyFactory_var factory =
      DynamicAny::DynAnyFactory::_narrow(
            orb->resolve_initial_references(
                  "DynAnyFactory"));
   // Get the manager Id
   PortableServer::ObjectId_var managerId =
         PortableServer::string_to_ObjectId("PrinterManager");
   // Locate an account manager. Give the full POA name 
   // and the servant ID.
   Printer::PrinterManager_ptr manager = 
         Printer::PrinterManager::_bind(
               "/serverPoa", managerId);
 
   DynamicAny::NameValuePairSeq seq(3);
   seq.length(3);
 
   CORBA::Any strAny,enumAny,floatAny;
   strAny <<= "String";
   enumAny <<= Printer::second;
   floatAny <<= (CORBA::Float)864.50;
 
   CORBA::NameValuePair nvpairs[3];
 
   nvpairs[0].id = CORBA::string_dup("str");
   nvpairs[0].value = strAny;
 
   nvpairs[1].id = CORBA::string_dup("e");
   nvpairs[1].value = enumAny;
 
   nvpairs[2].id = CORBA::string_dup("fl");
   nvpairs[2].value = floatAny;
 
   seq[0] = nvpairs[0];
   seq[1] = nvpairs[1];
   seq[2] = nvpairs[2];
 
   // Create Dynamic struct
   DynamicAny::DynStruct_var info =
      DynamicAny::DynStruct::_narrow(
      factory->create_dyn_any_from_type_code(
            Printer::_tc_StructType));
 
   info->set_members(seq);
      manager->printAny(*(info->to_any()));
      manager->shutdown();
   }
   catch(const CORBA::Exception& e) {
      cerr << "Caught " << e << "Exception" << endl;
   }
}

コードサンプル24-5 DynStructを使用したクライアントアプリケーションのサンプル(Java)
 
// Client.java
 
import org.omg.DynamicAny.*;
 
public class Client {
 
   public static void main(String[ ] args) {
      try {
         // Initialize the ORB.
         org.omg.CORBA.ORB orb =
                          org.omg.CORBA.ORB.init(args, null);
 
         DynAnyFactory factory = DynAnyFactoryHelper.narrow(
            orb.resolve_initial_references("DynAnyFactory"));
 
         // Locate a printer manager.
         Printer.PrinterManager manager =
            Printer.PrinterManagerHelper.bind(orb,
                                           "PrinterManager");
 
         // Create Dynamic struct
         DynStruct info =
            DynStructHelper.narrow(factory.
               create_dyn_any_from_type_code(
                  Printer.StructTypeHelper.type()));
 
         // Create our NameValuePair sequence (array)
         NameValuePair[ ] NVPair = new NameValuePair[3];
 
         // Create and initialize Dynamic Struct data as any's
         org.omg.CORBA.Any str_any = orb.create_any();
         str_any.insert_string("String");
         org.omg.CORBA.Any e_any = orb.create_any();
         Printer.EnumTypeHelper.insert(
                             e_any, Printer.EnumType.second);
         org.omg.CORBA.Any fl_any = orb.create_any();
         fl_any.insert_float((float)864.50);
 
         NVPair[0] = new NameValuePair("str", str_any);
         NVPair[1] = new NameValuePair("e", e_any);
         NVPair[2] = new NameValuePair("fl", fl_any);
 
         // Initialize the Dynamic Struct
         info.set_members(NVPair);
 
         manager.printAny(info.to_any());
 
         manager.shutdown();
      }
      catch (Exception e){
         e.printStackTrace();
      }
   }
}