📄 cospropertyservice_i.cpp
字号:
{
// Empty.
}
//======================================================================
// Makes default sized hash_table_.
TAO_PropertySetDef::TAO_PropertySetDef (void)
{
}
// Constructor that the factory uses.
TAO_PropertySetDef::TAO_PropertySetDef (const CosPropertyService::PropertyTypes allowed_property_types,
const CosPropertyService::PropertyDefs allowed_property_defs
ACE_ENV_ARG_DECL)
: TAO_PropertySet(allowed_property_types,
allowed_property_defs.length ()
ACE_ENV_ARG_PARAMETER)
{
// Set the length of the allowed property names.
this->allowed_property_names_.length (allowed_property_defs.length ());
// Copy the allowed properties' names to the sequence.
for (CORBA::ULong ni = 0; ni < allowed_property_defs.length (); ni++)
this->allowed_property_names_[ni] =
allowed_property_defs[ni].property_name;
// Define the allowed properties in the hash table.
ACE_TRY
{
this->define_properties_with_modes (allowed_property_defs
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
ACE_RE_THROW;
}
ACE_ENDTRY;
ACE_CHECK;
}
// Constructor that the factory uses.
TAO_PropertySetDef::TAO_PropertySetDef (const CosPropertyService::PropertyDefs initial_property_defs
ACE_ENV_ARG_DECL)
{
this->define_properties_with_modes (initial_property_defs
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
// Destructor.
TAO_PropertySetDef::~TAO_PropertySetDef (void)
{
}
// Return the sequence that is there in side.
void
TAO_PropertySetDef::get_allowed_property_types (CosPropertyService::PropertyTypes_out property_types
ACE_ENV_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// Copy contents of the sequence.
ACE_NEW (property_types,
CosPropertyService::PropertyTypes (this->allowed_property_types_));
}
void
TAO_PropertySetDef::get_allowed_properties (CosPropertyService::PropertyDefs_out property_defs
ACE_ENV_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// We have all the names, get the values and the modes from the Hash
// Table and return.
// Allocate memory.
ACE_NEW (property_defs,
CosPropertyService::PropertyDefs (this->allowed_property_names_.length ()));
// Get the modes and property values for all these property
// names. Some may not be there in the Hash Table, probably got
// deleted because of their modes were not safe.
// @@ TO DO.
}
// Check for name's validity. If name not there define it. If it is
// there and if type is equal and if mode allows define it else raise
// exception.
void
TAO_PropertySetDef::define_property_with_mode (const char *property_name,
const CORBA::Any &property_value,
CosPropertyService::PropertyModeType property_mode
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
CosPropertyService::InvalidPropertyName,
CosPropertyService::ConflictingProperty,
CosPropertyService::UnsupportedTypeCode,
CosPropertyService::UnsupportedProperty,
CosPropertyService::UnsupportedMode,
CosPropertyService::ReadOnlyProperty))
{
// Check the names validity.
if (property_name == 0)
ACE_THROW (CosPropertyService::InvalidPropertyName());
// Is this type allowed?
if (is_type_allowed (property_value.type ()) != 1)
ACE_THROW (CosPropertyService::UnsupportedTypeCode());
// Is this property allowed?
if (is_property_allowed (property_name) != 1)
ACE_THROW (CosPropertyService::UnsupportedProperty());
// Is this a valid mode.
if (property_mode == CosPropertyService::undefined)
ACE_THROW (CosPropertyService::UnsupportedMode());
// Try to bind the Property.
CosProperty_Hash_Key hash_key (property_name);
CosProperty_Hash_Value hash_value (property_value,
property_mode);
COSPROPERTY_HASH_ENTRY *entry_ptr;
int ret = this->hash_table_.bind (hash_key, hash_value, entry_ptr);
//CosProperty_Hash_Value old_value;
//CosProperty_Hash_Key old_key;
switch (ret)
{
case 0:
break;
case 1:
// Property name exists.
// Is the pointer valid.
if (entry_ptr == 0)
ACE_THROW (CORBA::UNKNOWN ());
// If type is not the same, raise exception.
if (entry_ptr->int_id_.pvalue_.type () != property_value.type ())
ACE_THROW (CosPropertyService::ConflictingProperty());
// If mode is read only, raise exception.
if ((entry_ptr->int_id_.pmode_ == CosPropertyService::read_only) ||
(entry_ptr->int_id_.pmode_ == CosPropertyService::fixed_readonly))
ACE_THROW (CosPropertyService::ReadOnlyProperty());
// If current mode is fixed_normal, but the new mode is not
// fixed, reject it.
if ((entry_ptr->int_id_.pmode_ ==
CosPropertyService::fixed_normal) &&
(property_mode < CosPropertyService::fixed_normal))
ACE_THROW (CosPropertyService::UnsupportedMode());
// Everything is fine. Overwrite the value.
if (this->hash_table_.rebind (hash_key,
hash_value) > 0)
{
break;
}
default:
// Error. ret is -1 or rebind returned other than 1.
ACE_THROW (CORBA::UNKNOWN ());
}
return;
}
// Define one by one. If any excceptions raised, build
// MultipleExceptions sequence and raise that.
void
TAO_PropertySetDef::define_properties_with_modes (const CosPropertyService::PropertyDefs &property_defs
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
CosPropertyService::MultipleExceptions))
{
// Get the length.
CORBA::ULong sequence_length = property_defs.length ();
// Define multiple exceptions object.
CosPropertyService::MultipleExceptions multi_ex;
// Try defining the propdefs one by one.
for (CORBA::ULong i = 0; i < sequence_length; i++)
{
ACE_TRY
{
// Define the property.
this->define_property_with_mode (property_defs[i].property_name,
property_defs[i].property_value,
property_defs[i].property_mode
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCH (CosPropertyService::InvalidPropertyName, ex)
{
CORBA::ULong len = multi_ex.exceptions.length ();
multi_ex.exceptions.length (len + 1);
multi_ex.exceptions[len].reason =
CosPropertyService::invalid_property_name;
multi_ex.exceptions[len].failing_property_name =
property_defs[i].property_name;
}
ACE_CATCH (CosPropertyService::ConflictingProperty, ex)
{
CORBA::ULong len = multi_ex.exceptions.length ();
multi_ex.exceptions.length (len + 1);
multi_ex.exceptions[len].reason =
CosPropertyService::conflicting_property;
multi_ex.exceptions[len].failing_property_name =
property_defs[i].property_name;
}
ACE_CATCH (CosPropertyService::ReadOnlyProperty, ex)
{
CORBA::ULong len = multi_ex.exceptions.length ();
multi_ex.exceptions.length (len + 1);
multi_ex.exceptions[len].reason =
CosPropertyService::read_only_property;
multi_ex.exceptions[len].failing_property_name =
property_defs[i].property_name;
}
ACE_CATCH (CosPropertyService::UnsupportedTypeCode, ex)
{
CORBA::ULong len = multi_ex.exceptions.length ();
multi_ex.exceptions.length (len + 1);
multi_ex.exceptions[len].reason =
CosPropertyService::unsupported_type_code;
multi_ex.exceptions[len].failing_property_name =
property_defs[i].property_name;
}
ACE_CATCH (CosPropertyService::UnsupportedProperty, ex)
{
CORBA::ULong len = multi_ex.exceptions.length ();
multi_ex.exceptions.length (len + 1);
multi_ex.exceptions[len].reason =
CosPropertyService::unsupported_property;
multi_ex.exceptions[len].failing_property_name =
property_defs[i].property_name;
}
ACE_CATCH (CosPropertyService::UnsupportedMode, ex)
{
CORBA::ULong len = multi_ex.exceptions.length ();
multi_ex.exceptions.length (len + 1);
multi_ex.exceptions[len].reason =
CosPropertyService::unsupported_mode;
multi_ex.exceptions[len].failing_property_name =
property_defs[i].property_name;
}
ACE_CATCH (CORBA::SystemException, sysex)
{
ACE_RE_THROW;
}
ACE_ENDTRY;
ACE_CHECK;
}
// Raise the multi exception if needed.
if (multi_ex.exceptions.length () > 0)
ACE_THROW (CosPropertyService::MultipleExceptions (multi_ex));
}
// Get the mode of a property. Raises InvalidpropertyName,
// PropertyNotFound exceptions.
CosPropertyService::PropertyModeType
TAO_PropertySetDef::get_property_mode (const char *property_name
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
CosPropertyService::PropertyNotFound,
CosPropertyService::InvalidPropertyName))
{
// Check for the name's validity.
if (property_name == 0)
ACE_THROW_RETURN (CosPropertyService::InvalidPropertyName(),
CosPropertyService::undefined);
// Find the property in the hash table.
CosProperty_Hash_Key hash_key (property_name);
CosProperty_Hash_Value hash_value;
int ret = this->hash_table_.find (hash_key, hash_value);
switch (ret)
{
case 0:
// Property found.
return hash_value.pmode_;
default:
// Error or property is not found.
ACE_THROW_RETURN (CosPropertyService::PropertyNotFound(),
CosPropertyService::undefined);
}
}
// Batch operation for getting the property. Invoke get_property_mode
// for each name.
// Return value False indicates that properties with *undefined* modes
// have failed due to PropertyNotFound or InvalidPropertyName exception.
// Returning False in case of *Nothing to retun* or New is
// failing. The caller has to check the out parameter whether it is
// Nil or no, before doing something with it.
CORBA::Boolean
TAO_PropertySetDef::get_property_modes (const CosPropertyService::PropertyNames &property_names,
CosPropertyService::PropertyModes_out property_modes
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// Allocate memory for the out parameter.
ACE_NEW_RETURN (property_modes,
CosPropertyService::PropertyModes,
1);
// Validate the length of names sequence.
CORBA::ULong sequence_length = property_names.length ();
if (sequence_length == 0)
return 1;
// Set the length of the sequence.
property_modes->length (sequence_length);
// Intialize thre return value.
CORBA::Boolean ret = 1;
// Invoking get_property_mode for each name.
CosPropertyService::PropertyModeType mode;
for (CORBA::ULong i = 0; i < sequence_length; i++)
{
ACE_TRY
{
// Invoke get_property_mode for this name.
mode = this->get_property_mode (property_names[i]
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Store the mode in the out sequence.
property_modes[i].property_name = property_names[i];
property_modes[i].property_mode = mode;
}
ACE_CATCHANY
{
// Return value becomes false.
ret = 1;
// Assign this property to the out parameter with undefined
// mode.
property_modes[i].property_name = property_names[i];
property_modes[i].property_mode = CosPropertyService::undefined;
}
ACE_ENDTRY;
ACE_CHECK_RETURN (0);
}
return ret;
}
// Changing the mode of the property.
// "Normal" to anything is possible.
// "Readonly" mode to "Fixed-Readonly" is possible. Others not possible.
// "Fixed-Normal" to "Fixed-Readonly" is possible. Other things are impossible.
// "Fixed-Readonly" to anything is *not* possible.
void
TAO_PropertySetDef::set_property_mode (const char *property_name,
CosPropertyService::PropertyModeType property_mode
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
CosPropertyService::InvalidPropertyName,
CosPropertyService::PropertyNotFound,
CosPropertyService::UnsupportedMode))
{
// Check the names validity.
if (property_name == 0)
ACE_THROW (CosPropertyService::InvalidPropertyName());
// Trying to set to undefined mode is not allowed.
if (property_mode == CosPropertyService::undefined)
ACE_THROW (CosPropertyService::UnsupportedMode());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -