summaryrefslogtreecommitdiff
path: root/TAO/DevGuideExamples/AMH_AMI/inner_cb.cpp
blob: 6ce5e71297661f907b561265c48daa18f5c8d78a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "amh_ami_pch.h"
#include "inner_cb.h"
#include <iostream>
// Implementation skeleton constructor
Inner_callback_i::Inner_callback_i (PortableServer::POA_ptr p,
                                    AMH_MiddleResponseHandler_ptr rh)
  : poa_(PortableServer::POA::_duplicate (p)),
    response_handler_ (AMH_MiddleResponseHandler::_duplicate (rh))
{
}

// Implementation skeleton destructor
Inner_callback_i::~Inner_callback_i (void)
{
  std::cout << "Inner_callback_i destroying" << std::endl;

}

void
Inner_callback_i::answer (const char * ami_return_val)
{
  std::cout << "Inner_callback_i::answer called, return_val = "
       << ami_return_val << std::endl;
  this->response_handler_->get_the_answer (ami_return_val);

  std::cout << "inner_callback_i deactivating self" << std::endl;
  PortableServer::ObjectId_var oid = this->poa_->servant_to_id(this);
  this->poa_->deactivate_object (oid.in());
}

void
Inner_callback_i::answer_excep (Messaging::ExceptionHolder* excep_holder)
{
  // Here, we need to extract the exception from this holder, and package
  // it in another so the AMH response handler may forward it on.
  try
    {
      excep_holder->raise_exception();
    }
  catch(const CORBA::Exception& ex)
    {
      CORBA::Exception *local_ex = ex._tao_duplicate();
      AMH_MiddleExceptionHolder amh_excep_holder (local_ex);
      this->response_handler_->get_the_answer_excep (&amh_excep_holder);
    }
  catch(...)
    {
      std::cout
        << "inner_callback_i::answer_excep got an unknown exception"
        << std::endl;

      CORBA::Exception *unknown_ex = new CORBA::UNKNOWN;
      AMH_MiddleExceptionHolder amh_excep_holder (unknown_ex);
      this->response_handler_->get_the_answer_excep (&amh_excep_holder);
    }

  std::cout << "inner_callback_i deactivating self" << std::endl;
  PortableServer::ObjectId_var oid = this->poa_->servant_to_id(this);
  this->poa_->deactivate_object (oid.in());
}