
#line 319 "matrix.w"

#line 200 "matrix.w"
#include <vector>
#include <iostream.h>
using namespace std;
#pragma warning (disable : 4786)
#include <omniORB2/CORBA.h>
#include "omnithread.h"
#line 319 "matrix.w"


#line 213 "matrix.w"
#include "matrix.h"
#line 320 "matrix.w"


#line 490 "matrix.w"
#include "namebind.cpp"

#line 321 "matrix.w"


int main( int argc, char *argv[] )
{
  
#line 232 "matrix.w"
  cout << "Initializing..." << endl;
  CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, "omniORB2");
  CORBA::BOA_var boa = orb->BOA_init(argc, argv, "omniORB2_BOA");
#line 325 "matrix.w"

  vector<Matrix_var> client;
  
#line 339 "matrix.w"
  int j;
  for (j = 1; j <= 2; ++j) {
    cout << "j = " << j << endl;
    try {
      CORBA::Object_var obj = getObjectReference(orb, "test", argv[j]);
      client.push_back(Matrix::_narrow(obj));
      if (CORBA::is_nil(client[j-1])) {
        cerr << "Cannot invoke on a nil object reference.\n" << endl;
        return 1;
      }
      assert(!CORBA::is_nil(client[j - 1]));
    }
    catch(CORBA::COMM_FAILURE& ex) {
      cerr << "Caught system exception COMM_FAILURE, unable to contact the "
           << "object." << endl;
      return 1;
    }
    catch(omniORB::fatalException& ex) {
    cerr << "Caught omniORB2 fatalException. This indicates a bug is caught "
         << "within omniORB2.\nPlease send a bug report.\n"
         << "The exception was thrown in file: " << ex.file() << "\n"
         << "                            line: " << ex.line() << "\n"
         << "The error message is: " << ex.errmsg() << endl;
      return 1;
    }
    catch(...) {
      cerr << "Caught a system exception." << endl;
    }
  }
#line 327 "matrix.w"

  const int N = 20;
  
#line 373 "matrix.w"
  Column c;
  c.length(N);
  for (int i = 0; i < N; ++i) 
    c[i] = 3;
#line 329 "matrix.w"

  cout << "Computing the matrix-vector product..." << endl;
  vector<Column*> result(2);
  
#line 390 "matrix.w"
  
#line 397 "matrix.w"
  CORBA::Request_var _req = client[0]->_request( "block_product" );
  _req->add_in_arg( "first" ) <<= (CORBA::ULong)0;
  _req->add_in_arg( "last" ) <<= (CORBA::ULong)(N/2);
  _req->add_in_arg( "c" ) <<= c;
  _req->set_return_type(_tc_Column);
  _req->send_deferred();
#line 390 "matrix.w"
  
  
#line 405 "matrix.w"
  result[1] = client[1]->block_product(N/2, N, c);
#line 391 "matrix.w"
  
  
#line 408 "matrix.w"
  _req->get_response();
#line 392 "matrix.w"
  
  
#line 411 "matrix.w"
  if(_req->env()->exception()) {
    CORBA::Exception *_ex = _req->env()->exception();
    /* Following is from MICO version, needs to be ported to omniORB
    CORBA::UnknownUserException *_uuex = 
       CORBA::UnknownUserException::_downcast( _ex );
    if(_uuex) {
      mico_throw( CORBA::UNKNOWN() );
    } else {
      mico_throw( *_ex );
    }
    */
  }
#line 393 "matrix.w"
  
  
#line 425 "matrix.w"
  _req->return_value() >>= result[0];
#line 394 "matrix.w"
  
#line 332 "matrix.w"

  
#line 428 "matrix.w"
  cout << "The result: " << endl;
  for (j = 0; j < 2; ++j) {
    for (int k = 0; k < result[j]->length(); ++k)
      cout << (*result[j])[k] << " ";
  }
#line 333 "matrix.w"

  cout << endl;
  return 0;
}