📄 trader_utils.cpp
字号:
// If the property name is in the map, delegate evaluation to our
// superclass. Otherwise, throw an exception.
if (this->table_.find (prop_name, index) == 0)
{
prop_value =
this->TAO_Property_Evaluator::property_value (index
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
}
return prop_value;
}
CORBA::TypeCode_ptr
TAO_Property_Evaluator_By_Name::property_type (const char* property_name)
{
int index = 0;
TAO_String_Hash_Key prop_name (property_name);
CORBA::TypeCode_ptr prop_type = CORBA::TypeCode::_nil();
// If the property name is in the map, delegate evaluation to our
// superclass. Otherwise, throw an exception.
if (this->table_.find (prop_name, index) == 0)
prop_type = this->TAO_Property_Evaluator::property_type (index);
return prop_type;
}
const CosTrading::Property*
TAO_Property_Evaluator_By_Name::get_property (const char* property_name)
{
int index = 0;
CosTrading::Property* property = 0;
TAO_String_Hash_Key prop_name (property_name);
if (this->table_.find (prop_name, index) == 0)
property = (CosTrading::Property *) &this->props_[index];
return property;
}
TAO_Dynamic_Property::~TAO_Dynamic_Property (void)
{
}
CosTradingDynamic::DynamicProp*
TAO_Dynamic_Property::
construct_dynamic_prop (const char* name,
CORBA::TypeCode_ptr returned_type,
const CORBA::Any& extra_info)
{
ACE_UNUSED_ARG (name);
CosTradingDynamic::DynamicProp* dp_struct = 0;
ACE_NEW_RETURN (dp_struct,
CosTradingDynamic::DynamicProp,
0);
if (this->prop_.in () == CosTradingDynamic::DynamicPropEval::_nil ())
{
// Seth, we need a way to either propagate exceptions out.
ACE_DECLARE_NEW_CORBA_ENV;
this->prop_ = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
this->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
}
dp_struct->eval_if =
CosTradingDynamic::DynamicPropEval::_duplicate (this->prop_.in ());
dp_struct->returned_type =
CORBA::TypeCode::_duplicate (returned_type);
dp_struct->extra_info = extra_info;
return dp_struct;
}
void
TAO_Dynamic_Property::destroy (void)
{
if (this->prop_.in () != CosTradingDynamic::DynamicPropEval::_nil ())
{
// @@ Seth, we need a way to propagate exceptions out.
ACE_DECLARE_NEW_CORBA_ENV;
PortableServer::POA_var poa = this->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
PortableServer::ObjectId_var id =
poa->servant_to_id (this
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
poa->deactivate_object (id.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
}
const char* TAO_Policies::POLICY_NAMES[] =
{
"starting_trader",
"exact_type_match",
"hop_count",
"link_follow_rule",
"match_card",
"return_card",
"search_card",
"use_dynamic_properties",
"use_modifiable_properties",
"use_proxy_offers",
"request_id"
};
TAO_Policies::TAO_Policies (TAO_Trader_Base& trader,
const CosTrading::PolicySeq& policies
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CosTrading::Lookup::IllegalPolicyName,
CosTrading::DuplicatePolicyName))
: trader_ (trader)
{
for (int i = 0; i < TAO_NUM_POLICIES; i++)
this->policies_[i] = 0;
for (CORBA::ULong j = 0; j < policies.length (); j++)
{
const char *pol_name = (const char *) policies[j].name;
size_t length = (pol_name == 0) ? 0 : ACE_OS::strlen (pol_name);
int index = -1;
if (length < ACE_OS::strlen (POLICY_NAMES[HOP_COUNT]))
ACE_THROW (CosTrading::Lookup::IllegalPolicyName (pol_name));
switch (pol_name[0])
{
case 'e':
index = EXACT_TYPE_MATCH;
break;
case 'h':
index = HOP_COUNT;
break;
case 'l':
index = LINK_FOLLOW_RULE;
break;
case 'm':
index = MATCH_CARD;
break;
case 'r':
if (pol_name[2] == 't')
index = RETURN_CARD;
else if (pol_name[2] == 'q')
index = REQUEST_ID;
break;
case 's':
if (pol_name[1] == 't')
index = STARTING_TRADER;
else if (pol_name[1] == 'e')
index = SEARCH_CARD;
break;
case 'u':
if (pol_name[4] == 'd')
index = USE_DYNAMIC_PROPERTIES;
if (pol_name[4] == 'm')
index = USE_MODIFIABLE_PROPERTIES;
if (pol_name[4] == 'p')
index = USE_PROXY_OFFERS;
}
// Match the name of the policy, and insert its value into the
// vector.
if (index == -1 || ACE_OS::strcmp (POLICY_NAMES[index], pol_name) != 0)
ACE_THROW (CosTrading::Lookup::IllegalPolicyName (pol_name));
else if (this->policies_[index] != 0)
ACE_THROW (CosTrading::DuplicatePolicyName (pol_name));
else
this->policies_[index] = (CosTrading::Policy *) &(policies[j]);
}
}
TAO_Policies::~TAO_Policies (void)
{
}
CORBA::ULong
TAO_Policies::ulong_prop (POLICY_TYPE pol
ACE_ENV_ARG_DECL) const
ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch))
{
CORBA::ULong return_value = 0, max_value = 0;
const TAO_Import_Attributes_i& import_attrs =
this->trader_.import_attributes ();
// Discover the default values for each of the possible cardinality
// policies.
switch (pol)
{
case SEARCH_CARD:
return_value = import_attrs.def_search_card ();
max_value = import_attrs.max_search_card ();
break;
case MATCH_CARD:
return_value = import_attrs.def_match_card ();
max_value = import_attrs.max_match_card ();
break;
case RETURN_CARD:
return_value = import_attrs.def_return_card ();
max_value = import_attrs.max_return_card ();
break;
case HOP_COUNT:
return_value = import_attrs.def_hop_count ();
max_value = import_attrs.max_hop_count ();
break;
default:
break;
}
if (this->policies_[pol] != 0)
{
// Extract the desired policy value.
const CosTrading::Policy* policy = this->policies_[pol];
const CosTrading::PolicyValue& value = policy->value;
CORBA::TypeCode_var type = value.type ();
CORBA::Boolean equal_ulong = type->equal (CORBA::_tc_ulong ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (return_value);
if (!equal_ulong)
ACE_THROW_RETURN (CosTrading::Lookup::PolicyTypeMismatch (*policy),
return_value);
else
value >>= return_value;
if (max_value < return_value)
return_value = max_value;
}
return return_value;
}
CORBA::ULong
TAO_Policies::search_card (ACE_ENV_SINGLE_ARG_DECL) const
ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch))
{
return this->ulong_prop (SEARCH_CARD ACE_ENV_ARG_PARAMETER);
}
CORBA::ULong
TAO_Policies::match_card (ACE_ENV_SINGLE_ARG_DECL) const
ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch))
{
return this->ulong_prop (MATCH_CARD ACE_ENV_ARG_PARAMETER);
}
CORBA::ULong
TAO_Policies::return_card (ACE_ENV_SINGLE_ARG_DECL) const
ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch))
{
return this->ulong_prop (RETURN_CARD ACE_ENV_ARG_PARAMETER);
}
CORBA::Boolean
TAO_Policies::boolean_prop (POLICY_TYPE pol
ACE_ENV_ARG_DECL) const
ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch))
{
CORBA::Boolean def_value = 1,
return_value = 1;
const TAO_Support_Attributes_i& support_attrs =
this->trader_.support_attributes ();
switch (pol)
{
case USE_MODIFIABLE_PROPERTIES:
def_value = support_attrs.supports_modifiable_properties ();
break;
case USE_DYNAMIC_PROPERTIES:
def_value = support_attrs.supports_dynamic_properties ();
break;
case USE_PROXY_OFFERS:
def_value = support_attrs.supports_proxy_offers ();
break;
case EXACT_TYPE_MATCH:
def_value = 0;
break;
default:
break;
}
if (this->policies_[pol] != 0)
{
const CosTrading::Policy* policy = this->policies_[pol];
const CosTrading::PolicyValue& value = policy->value;
CORBA::TypeCode_var type = value.type ();
CORBA::Boolean equal_boolean =
type->equal (CORBA::_tc_boolean ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (return_value);
if (!equal_boolean)
ACE_THROW_RETURN (CosTrading::Lookup::PolicyTypeMismatch (*policy),
return_value);
else
value >>= CORBA::Any::to_boolean (return_value);
if (def_value == 0 &&
pol != EXACT_TYPE_MATCH)
return_value = 0;
}
else
return_value = def_value;
return return_value;
}
CORBA::Boolean
TAO_Policies::use_modifiable_properties (ACE_ENV_SINGLE_ARG_DECL) const
ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch))
{
return this->boolean_prop (USE_MODIFIABLE_PROPERTIES ACE_ENV_ARG_PARAMETER);
}
CORBA::Boolean
TAO_Policies::use_dynamic_properties (ACE_ENV_SINGLE_ARG_DECL) const
ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch))
{
return this->boolean_prop (USE_DYNAMIC_PROPERTIES ACE_ENV_ARG_PARAMETER);
}
CORBA::Boolean
TAO_Policies::use_proxy_offers (ACE_ENV_SINGLE_ARG_DECL) const
ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch))
{
return this->boolean_prop (USE_PROXY_OFFERS ACE_ENV_ARG_PARAMETER);
}
CORBA::Boolean
TAO_Policies::exact_type_match (ACE_ENV_SINGLE_ARG_DECL) const
ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch))
{
return this->boolean_prop (EXACT_TYPE_MATCH ACE_ENV_ARG_PARAMETER);
}
CosTrading::TraderName*
TAO_Policies::starting_trader (ACE_ENV_SINGLE_ARG_DECL) const
ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch,
CosTrading::Lookup::InvalidPolicyValue))
{
CosTrading::TraderName* trader_name = 0;
if (this->policies_[STARTING_TRADER] != 0)
{
CosTrading::Policy* policy = this->policies_[STARTING_TRADER];
CosTrading::PolicyValue& value = policy->value;
CORBA::TypeCode_var type = value.type ();
CORBA::Boolean equal_tradername =
type->equal (CosTrading::_tc_TraderName ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (trader_name);
CORBA::Boolean equal_linknameseq =
type->equal (CosTrading::_tc_LinkNameSeq ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (trader_name);
if (!equal_tradername ||
!equal_linknameseq)
ACE_THROW_RETURN (CosTrading::Lookup::PolicyTypeMismatch (*policy),
trader_name);
else
value >>= trader_name;
}
return trader_name;
}
CosTrading::FollowOption
TAO_Policies::link_follow_rule (ACE_ENV_SINGLE_ARG_DECL) const
ACE_THROW_SPEC ((CosTrading::Lookup::PolicyTypeMismatch))
{
CosTrading::FollowOption return_value =
this->trader_.import_attributes ().def_follow_policy ();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -