📄 cospropertyservice_i.cpp
字号:
// Find the property from 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);
//CosProperty_Hash_Value old_value;
//CosProperty_Hash_Key old_key;
// Act acc to the ret value.
switch (ret)
{
case 0:
// Property found.
// If the new mode is the same as the old one, nothing to do.
if (hash_value.pmode_ == property_mode)
return;
// Check for legality of the mode change.
switch (hash_value.pmode_)
{
case CosPropertyService::normal:
// Set the new mode and update the hash table.
hash_value.pmode_ = property_mode;
if (this->hash_table_.rebind (hash_key,
hash_value) != 1)
// Return values 0 and -1 are not possible.
ACE_THROW (CORBA::UNKNOWN ());
break;
case CosPropertyService::read_only:
// Read_only to fixed read only alone is possible.
if (property_mode != CosPropertyService::fixed_readonly)
ACE_THROW (CosPropertyService::UnsupportedMode());
else
{
// Change the mode and update hash table.
hash_value.pmode_ = property_mode;
if (this->hash_table_.rebind (hash_key,
hash_value) != 1)
// Return values 0 and -1 are not possible.
ACE_THROW (CORBA::UNKNOWN ());
}
break;
case CosPropertyService::fixed_normal:
// Fixed_normal to fixed_readonly alone is possible.
if (property_mode != CosPropertyService::fixed_readonly)
ACE_THROW (CosPropertyService::UnsupportedMode());
else
{
// Change the mode and update the hash table.
hash_value.pmode_ = property_mode;
if (this->hash_table_.rebind (hash_key,
hash_value) != 1)
// Return values 0 and -1 are not possible.
ACE_THROW (CORBA::UNKNOWN ());
}
break;
default:
// Fixed_readonly to any mode is not possible.
ACE_THROW (CosPropertyService::UnsupportedMode());
}
break;
case -1:
default:
// Error or property not found in the Hash Table.
ACE_THROW (CosPropertyService::PropertyNotFound());
}
}
// Batch operation for setting the property. Raises
// MultipleExceptions. Set the properties one by one, catch
// exceptions if any and keep them as in the multiple exceptions
// sequence and return.
void
TAO_PropertySetDef::set_property_modes (const CosPropertyService::PropertyModes &property_modes
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
CosPropertyService::MultipleExceptions))
{
// Get the length of the sequence.
CORBA::ULong sequence_length = property_modes.length ();
// Multiple exception variable to keep track of exceptions.
CosPropertyService::MultipleExceptions multi_ex;
// Set modes one by one.
for (CORBA::ULong i = 0; i < sequence_length; i++)
{
ACE_TRY
{
this->set_property_mode (property_modes[i].property_name,
property_modes[i].property_mode
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCH (CosPropertyService::PropertyNotFound, ex)
{
// Put this exception in the multiple exception.
CORBA::ULong len = multi_ex.exceptions.length ();
multi_ex.exceptions.length (len + 1);
multi_ex.exceptions[len].reason =
CosPropertyService::property_not_found;
multi_ex.exceptions[len].failing_property_name =
property_modes[i].property_name;
}
ACE_CATCH (CosPropertyService::InvalidPropertyName, ex)
{
// Put this exception in the multiple exception.
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_modes[i].property_name;
}
ACE_CATCH (CosPropertyService::UnsupportedMode, ex)
{
// Put this exception in the multiple exception.
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_modes[i].property_name;
}
ACE_CATCH (CORBA::SystemException, systex)
{
ACE_RE_THROW;
}
ACE_ENDTRY;
ACE_CHECK;
}
// Raise the multi_ex, if needed.
if (multi_ex.exceptions.length () > 0)
ACE_THROW (CosPropertyService::MultipleExceptions (multi_ex));
}
//======================================================================
// Constructor. Construct the iterator from the PropertySet object.
TAO_PropertyNamesIterator::TAO_PropertyNamesIterator (TAO_PropertySet &property_set)
: iterator_ (property_set.hash_table_)
{
}
// Destructor.
TAO_PropertyNamesIterator::~TAO_PropertyNamesIterator (void)
{
}
// Resets the position in an iterator to the first property name, if
// one exists.
void
TAO_PropertyNamesIterator::reset (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
this->iterator_ = this->iterator_.map ().begin ();
}
// The next_one operation returns true if an item exists at the
// current position in the iterator with an output parameter of a
// property name. A return of false signifies no more items in the
// iterator.
CORBA::Boolean
TAO_PropertyNamesIterator::next_one (CORBA::String_out property_name
ACE_ENV_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
COSPROPERTY_HASH_ENTRY *entry_ptr;
if (this->iterator_.next (entry_ptr) != 0)
{
property_name =
CORBA::string_dup (entry_ptr->ext_id_.pname_.in ());
this->iterator_.advance ();
return 1;
}
else
return 0;
}
CORBA::Boolean
TAO_PropertyNamesIterator::next_n (CORBA::ULong how_many,
CosPropertyService::PropertyNames_out property_names
ACE_ENV_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// Allocate memory for the out parameter.
ACE_NEW_RETURN (property_names,
CosPropertyService::PropertyNames,
0);
COSPROPERTY_HASH_ENTRY *entry_ptr = 0;
if (this->iterator_.next (entry_ptr) == 0 || how_many == 0)
return 0;
CORBA::ULong size = ACE_static_cast (CORBA::ULong,
this->iterator_.map ().current_size ());
CORBA::ULong len = 0;
if (how_many <= size)
len = how_many;
else
len = size;
property_names->length (len);
for (CORBA::ULong ni = 0;
ni < property_names->length ();
ni++, this->iterator_.advance ())
if (this->iterator_.next (entry_ptr) != 0)
property_names [ni] =
CORBA::string_dup (entry_ptr->ext_id_.pname_.in ());
return 1;
}
void
TAO_PropertyNamesIterator::destroy (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// Remove self from POA. Because of reference counting, the POA
// will automatically delete the servant when all pending requests
// on this servant are complete.
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;
}
//======================================================================
TAO_PropertiesIterator::TAO_PropertiesIterator (TAO_PropertySet &property_set)
: iterator_ (property_set.hash_table_)
{
}
TAO_PropertiesIterator::~TAO_PropertiesIterator (void)
{
}
void
TAO_PropertiesIterator::reset (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
this->iterator_ = this->iterator_.map ().begin ();
}
CORBA::Boolean
TAO_PropertiesIterator::next_one (CosPropertyService::Property_out aproperty
ACE_ENV_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
COSPROPERTY_HASH_ENTRY *entry_ptr;
if (this->iterator_.next (entry_ptr) != 0)
{
aproperty = new CosPropertyService::Property;
aproperty->property_name = entry_ptr->ext_id_.pname_;
aproperty->property_value = entry_ptr->int_id_.pvalue_;
this->iterator_.advance ();
return 1;
}
else
{
aproperty = new CosPropertyService::Property;
return 0;
}
}
CORBA::Boolean
TAO_PropertiesIterator::next_n (CORBA::ULong how_many,
CosPropertyService::Properties_out nproperties
ACE_ENV_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// Allocate memory for the out parameter.
ACE_NEW_RETURN (nproperties,
CosPropertyService::Properties,
0);
COSPROPERTY_HASH_ENTRY *entry_ptr = 0;
if (this->iterator_.next (entry_ptr) == 0 || how_many == 0)
return 0;
CORBA::ULong size = ACE_static_cast (CORBA::ULong,
this->iterator_.map ().current_size ());
CORBA::ULong len;
if (how_many <= size)
len = how_many;
else
len = size;
nproperties->length (len);
for (CORBA::ULong ni = 0;
ni < nproperties->length ();
ni++,
this->iterator_.advance ())
{
if (this->iterator_.next (entry_ptr) != 0)
{
nproperties [ni].property_name = entry_ptr->ext_id_.pname_;
nproperties [ni].property_value =
entry_ptr->int_id_.pvalue_;
}
else
break;
}
return 1;
}
void
TAO_PropertiesIterator::destroy (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// Remove self from POA. Because of reference counting, the POA
// will automatically delete the servant when all pending requests
// on this servant are complete.
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;
}
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Hash_Map_Entry<CosProperty_Hash_Key, CosProperty_Hash_Value>;
template class ACE_Hash<CosProperty_Hash_Key>;
template class ACE_Equal_To<CosProperty_Hash_Key>;
template class ACE_Hash_Map_Manager<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Null_Mutex>;
template class ACE_Hash_Map_Manager_Ex<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Hash<CosProperty_Hash_Key>, ACE_Equal_To<CosProperty_Hash_Key>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Iterator<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Null_Mutex>;
template class ACE_Hash_Map_Iterator_Ex<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Hash<CosProperty_Hash_Key>, ACE_Equal_To<CosProperty_Hash_Key>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Iterator_Base_Ex<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Hash<CosProperty_Hash_Key>, ACE_Equal_To<CosProperty_Hash_Key>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Reverse_Iterator<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Null_Mutex>;
template class ACE_Hash_Map_Reverse_Iterator_Ex<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Hash<CosProperty_Hash_Key>, ACE_Equal_To<CosProperty_Hash_Key>, ACE_Null_Mutex>;
template class TAO_Unbounded_Sequence<TAO_PropertySet*>;
template class TAO_Unbounded_Sequence<TAO_PropertySetDef*>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
#pragma instantiate ACE_Hash_Map_Entry<CosProperty_Hash_Key, CosProperty_Hash_Value>
#pragma instantiate ACE_Hash<CosProperty_Hash_Key>
#pragma instantiate ACE_Equal_To<CosProperty_Hash_Key>
#pragma instantiate ACE_Hash_Map_Manager<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Manager_Ex<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Hash<CosProperty_Hash_Key>, ACE_Equal_To<CosProperty_Hash_Key>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Iterator<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Iterator_Ex<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Hash<CosProperty_Hash_Key>, ACE_Equal_To<CosProperty_Hash_Key>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Hash<CosProperty_Hash_Key>, ACE_Equal_To<CosProperty_Hash_Key>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Reverse_Iterator<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<CosProperty_Hash_Key, CosProperty_Hash_Value, ACE_Hash<CosProperty_Hash_Key>, ACE_Equal_To<CosProperty_Hash_Key>, ACE_Null_Mutex>
#pragma instantiate TAO_Unbounded_Sequence<TAO_PropertySet*>
#pragma instantiate TAO_Unbounded_Sequence<TAO_PropertySetDef*>
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -