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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
// $Id$
#include "Dynamic_Property.h"
TAO_DP_Dispatcher::TAO_DP_Dispatcher(const char* name)
{
}
TAO_DP_Dispatcher::~TAO_DP_Dispatcher (void)
{
for (Handler_Map::iterator handler_iter (this->handlers_);
! handler_iter.done ();
handler_iter++)
{
Handler_Info& handler_info = (*handler_iter).int_id_;
if (handler_info.free_on_delete_)
delete handler_info.handle_;
}
}
int
TAO_DP_Dispatcher::
register_handler(const char* name,
TAO_DP_Evaluation_Handler* handler,
CORBA::Boolean release_on_delete)
{
TAO_String_Hash_Key prop_name(name);
// Set up the handler to receive evaluations for prop_name
Handler_Info handler_info;
handler_info.handle_ = handler;
handler_info.free_on_delete_ = release_on_delete;
return (this->handlers_.bind (prop_name, handler_info) != 0) ? -1 : 0;
}
CosTradingDynamic::DynamicProp*
TAO_DP_Dispatcher::
construct_dynamic_prop (const char* name,
CORBA::TypeCode_ptr returned_type,
const CORBA::Any& extra_info)
{
CosTradingDynamic::DynamicProp* dp_struct = 0;
ACE_NEW_RETURN (dp_struct, CosTradingDynamic::DynamicProp, 0);
TAO_TRY
{
CosTradingDynamic::DynamicPropEval* dp_eval = this->_this (TAO_TRY_ENV);
#if defined TAO_HAS_DYNAMIC_PROPERTY_BUG
CORBA::ORB_ptr orb = TAO_ORB_Core_instance ()-> orb ();
dp_struct->eval_if = orb->object_to_string (dp_eval, TAO_TRY_ENV);
#else
dp_struct->eval_if = dp_eval;
#endif /* TAO_HAS_DYNAMIC_PROPERTY_BUG */
TAO_CHECK_ENV;
dp_struct->returned_type =
CORBA::TypeCode::_duplicate (returned_type);
dp_struct->extra_info = extra_info;
}
TAO_CATCHANY
{
return 0;
}
TAO_ENDTRY;
return dp_struct;
}
TAO_DP_Evaluation_Handler*
TAO_DP_Dispatcher::remove_handler (const char* name)
{
Handler_Info handler_info;
TAO_String_Hash_Key prop_name (name);
TAO_DP_Evaluation_Handler* handler = 0;
if (this->handlers_.unbind (prop_name, handler_info) == 0)
handler = handler_info.handle_;
return handler;
}
CORBA::Any*
TAO_DP_Dispatcher::evalDP(const char* name,
CORBA::TypeCode_ptr returned_type,
const CORBA::Any& extra_info,
CORBA::Environment& _env)
TAO_THROW_SPEC ((CORBA::SystemException,
CosTradingDynamic::DPEvalFailure))
{
CORBA::Any* result = 0;
Handler_Info handler_info;
TAO_String_Hash_Key prop_name(name);
if (this->handlers_.find (prop_name, handler_info) == 0)
{
TAO_DP_Evaluation_Handler* handler = handler_info.handle_;
result = handler->evalDP (extra_info, returned_type, _env);
TAO_CHECK_ENV_RETURN (_env, result);
if (! returned_type->equal(result->type(), _env))
{
TAO_THROW_RETURN (CosTradingDynamic::DPEvalFailure
(name, returned_type, extra_info),
result);
}
}
else
{
TAO_THROW_RETURN (CosTradingDynamic::DPEvalFailure
(name, returned_type, extra_info),
result);
}
return result;
}
|