📄 etcl_filter.cpp
字号:
// ETCL_Filter.cpp,v 1.7 2003/07/06 21:41:58 pradeep Exp
#include "ETCL_Filter.h"
#if ! defined (__ACE_INLINE__)
#include "ETCL_Filter.inl"
#endif /* __ACE_INLINE__ */
ACE_RCSID(Notify, TAO_Notify_ETCL_Filter, "ETCL_Filter.cpp,v 1.7 2003/07/06 21:41:58 pradeep Exp")
#include "ace/Auto_Ptr.h"
#include "tao/debug.h"
#include "Notify_Constraint_Visitors.h"
TAO_Notify_ETCL_Filter::TAO_Notify_ETCL_Filter (void)
:constraint_expr_ids_ (0)
{
}
TAO_Notify_ETCL_Filter::~TAO_Notify_ETCL_Filter ()
{
ACE_TRY_NEW_ENV
{
this->remove_all_constraints (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
if (TAO_debug_level)
ACE_DEBUG ((LM_DEBUG, "Error in Filter dtor\n"));
// @@ eat exception.
}
ACE_ENDTRY;
if (TAO_debug_level > 1)
ACE_DEBUG ((LM_DEBUG, "Filter Destroyed\n"));
}
char*
TAO_Notify_ETCL_Filter::constraint_grammar (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((
CORBA::SystemException
))
{
return CORBA::string_dup ("ETCL");
}
void
TAO_Notify_ETCL_Filter::add_constraints_i (const CosNotifyFilter::ConstraintInfoSeq& constraint_info_seq
ACE_ENV_ARG_DECL
)
ACE_THROW_SPEC ((
CORBA::SystemException,
CosNotifyFilter::InvalidConstraint
))
{
for (CORBA::ULong index = 0; index < constraint_info_seq.length (); ++index)
{
TAO_Notify_Constraint_Expr* notify_constr_expr;
ACE_NEW_THROW_EX (notify_constr_expr,
TAO_Notify_Constraint_Expr (),
CORBA::NO_MEMORY ());
auto_ptr <TAO_Notify_Constraint_Expr> auto_expr (notify_constr_expr);
const CosNotifyFilter::ConstraintExp& expr =
constraint_info_seq[index].constraint_expression;
notify_constr_expr->interpreter.
build_tree (expr.constraint_expr.in () ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
notify_constr_expr->constr_expr = expr;
CosNotifyFilter::ConstraintID cnstr_id = ++constraint_expr_ids_;
if (this->constraint_expr_list_.bind (cnstr_id, notify_constr_expr) == -1)
ACE_THROW (CORBA::INTERNAL ());
if (TAO_debug_level > 1)
ACE_DEBUG ((LM_DEBUG, "Added constraint to filter %x\n", this, expr.constraint_expr.in ()));
auto_expr.release ();
}
}
CosNotifyFilter::ConstraintInfoSeq*
TAO_Notify_ETCL_Filter::add_constraints (const CosNotifyFilter::ConstraintExpSeq& constraint_list
ACE_ENV_ARG_DECL
)
ACE_THROW_SPEC ((
CORBA::SystemException,
CosNotifyFilter::InvalidConstraint
))
{
ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
CORBA::INTERNAL ());
ACE_CHECK_RETURN (0);
CORBA::ULong constraint_length = constraint_list.length ();
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG, "constraint_length = %d\n",
constraint_length));
// Create the list that goes out.
CosNotifyFilter::ConstraintInfoSeq* infoseq_ptr;
ACE_NEW_THROW_EX (infoseq_ptr,
CosNotifyFilter::ConstraintInfoSeq (constraint_length),
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (0);
CosNotifyFilter::ConstraintInfoSeq_var infoseq (infoseq_ptr);
infoseq->length (constraint_length);
// Populate infoseq.
for (CORBA::ULong pop_index = 0; pop_index < constraint_length; ++pop_index)
{
infoseq[pop_index].constraint_expression =
constraint_list [pop_index];
if (TAO_debug_level > 0)
{
ACE_DEBUG ((LM_DEBUG,
"Adding constraint %d, %s\n",
pop_index,
constraint_list [pop_index].constraint_expr.in ()));
}
}
this->add_constraints_i (infoseq.in () ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
return infoseq._retn ();
}
void
TAO_Notify_ETCL_Filter::modify_constraints (const CosNotifyFilter::ConstraintIDSeq & del_list,
const CosNotifyFilter::ConstraintInfoSeq & modify_list
ACE_ENV_ARG_DECL
)
ACE_THROW_SPEC ((
CORBA::SystemException,
CosNotifyFilter::InvalidConstraint,
CosNotifyFilter::ConstraintNotFound
))
{
ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
CORBA::INTERNAL ());
ACE_CHECK;
// First check if all the ids are valid.
u_int index;
for (index = 0; index < del_list.length (); ++index)
{
if (this->constraint_expr_list_.find (del_list [index]) == -1)
{
ACE_THROW (CosNotifyFilter::ConstraintNotFound (del_list [index]));
}
}
for (index = 0; index < modify_list.length (); ++index)
{
if (this->constraint_expr_list_.find (modify_list [index].constraint_id) == -1)
{
ACE_THROW (CosNotifyFilter::ConstraintNotFound (modify_list [index].constraint_id));
}
}
// Remove previous entries and save them in case we need to reinstate them.
ACE_Array<TAO_Notify_Constraint_Expr*> constr_saved (modify_list.length ());
TAO_Notify_Constraint_Expr* constr_expr = 0;
for (index = 0; index < modify_list.length (); ++index)
{
CosNotifyFilter::ConstraintID cnstr_id =
modify_list [index].constraint_id;
if (this->constraint_expr_list_.unbind (cnstr_id, constr_expr) != -1)
{
constr_saved[index] = constr_expr;
}
}
// Now add the new entries.
// Keep a list of ids generated in this session.
ACE_TRY
{
this->add_constraints_i (modify_list
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
// Restore,
for (index = 0; index < modify_list.length (); ++index)
{
CosNotifyFilter::ConstraintID cnstr_id = ++this->constraint_expr_ids_;
if (constraint_expr_list_.bind (cnstr_id, constr_saved[index]) == -1)
ACE_THROW (CORBA::NO_RESOURCES ());
}
ACE_RE_THROW;
}
ACE_ENDTRY;
ACE_CHECK;
// Now go around deleting...
// for the del_list.
for (index = 0; index < del_list.length (); ++index)
{
if (this->constraint_expr_list_.unbind (del_list [index], constr_expr) != -1)
{
delete constr_expr;
}
}
// Delete the old constraints.
for (index = 0; index < constr_saved.max_size (); ++index)
{
delete constr_saved[index];
}
}
CosNotifyFilter::ConstraintInfoSeq*
TAO_Notify_ETCL_Filter::get_constraints (const CosNotifyFilter::ConstraintIDSeq & id_list
ACE_ENV_ARG_DECL
)
ACE_THROW_SPEC ((CORBA::SystemException,
CosNotifyFilter::ConstraintNotFound))
{
ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
CORBA::INTERNAL ());
ACE_CHECK_RETURN (0);
// Create the list that goes out.
CosNotifyFilter::ConstraintInfoSeq *infoseq_ptr;
ACE_NEW_THROW_EX (infoseq_ptr,
CosNotifyFilter::ConstraintInfoSeq (id_list.length ()),
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (0);
CosNotifyFilter::ConstraintInfoSeq_var infoseq (infoseq_ptr);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -