#include <Notify_Constraint_Visitors.h>
Collaboration diagram for TAO_Notify_Constraint_Visitor:
Public Member Functions | |
TAO_Notify_Constraint_Visitor (void) | |
Constructor. | |
int | bind_structured_event (const CosNotification::StructuredEvent &s_event) |
Put the event data into our hash map. | |
CORBA::Boolean | evaluate_constraint (TAO_ETCL_Constraint *root) |
int | visit_literal (TAO_ETCL_Literal_Constraint *) |
int | visit_identifier (TAO_ETCL_Identifier *) |
int | visit_union_value (TAO_ETCL_Union_Value *) |
int | visit_union_pos (TAO_ETCL_Union_Pos *) |
int | visit_component_pos (TAO_ETCL_Component_Pos *) |
int | visit_component_assoc (TAO_ETCL_Component_Assoc *) |
int | visit_component_array (TAO_ETCL_Component_Array *) |
int | visit_special (TAO_ETCL_Special *) |
int | visit_component (TAO_ETCL_Component *) |
int | visit_dot (TAO_ETCL_Dot *) |
int | visit_eval (TAO_ETCL_Eval *) |
int | visit_default (TAO_ETCL_Default *) |
int | visit_exist (TAO_ETCL_Exist *) |
int | visit_unary_expr (TAO_ETCL_Unary_Expr *) |
int | visit_binary_expr (TAO_ETCL_Binary_Expr *) |
int | visit_preference (TAO_ETCL_Preference *) |
Protected Types | |
enum | structured_event_field { FILTERABLE_DATA, HEADER, FIXED_HEADER, EVENT_TYPE, DOMAIN_NAME, TYPE_NAME, EVENT_NAME, VARIABLE_HEADER, REMAINDER_OF_BODY, EMPTY } |
Protected Member Functions | |
int | visit_or (TAO_ETCL_Binary_Expr *) |
int | visit_and (TAO_ETCL_Binary_Expr *) |
int | visit_twiddle (TAO_ETCL_Binary_Expr *) |
int | visit_in (TAO_ETCL_Binary_Expr *) |
int | visit_binary_op (TAO_ETCL_Binary_Expr *binary_expr, int op_type) |
CORBA::Boolean | sequence_does_contain (const CORBA::Any *any, TAO_ETCL_Literal_Constraint &item) |
CORBA::Boolean | array_does_contain (const CORBA::Any *any, TAO_ETCL_Literal_Constraint &item) |
CORBA::Boolean | struct_does_contain (const CORBA::Any *any, TAO_ETCL_Literal_Constraint &item) |
CORBA::Boolean | union_does_contain (const CORBA::Any *any, TAO_ETCL_Literal_Constraint &item) |
CORBA::Boolean | any_does_contain (const CORBA::Any *any, TAO_ETCL_Literal_Constraint &item) |
CORBA::Boolean | simple_type_match (int expr_type, CORBA::TCKind tc_kind) |
Protected Attributes | |
structured_event_field | implicit_id_ |
Storage for the type of implicit id the component has (if any). | |
ACE_Hash_Map_Manager< ACE_CString, structured_event_field, ACE_Null_Mutex > | implicit_ids_ |
ACE_Hash_Map_Manager< ACE_CString, CORBA::Any, ACE_Null_Mutex > | filterable_data_ |
Used to lookup names and values in the event's 'filterable_data' field. | |
ACE_Hash_Map_Manager< ACE_CString, CORBA::Any, ACE_Null_Mutex > | variable_header_ |
Used to lookup names and values in the event's 'variable_header' field. | |
CORBA::String_var | domain_name_ |
CORBA::String_var | type_name_ |
CORBA::String_var | event_name_ |
CORBA::Any | remainder_of_body_ |
Storage for the structured_event's 'remainder_of_body' field. | |
ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint > | queue_ |
The result of a non_boolean operation. | |
CORBA::Any_var | current_value_ |
CORBA::String_var | current_name_ |
Static Protected Attributes | |
const size_t | implicit_ids_size_ = 27 |
const size_t | filterable_data_size_ = 31 |
const size_t | variable_header_size_ = 31 |
|
Definition at line 99 of file Notify_Constraint_Visitors.h.
00100 { 00101 FILTERABLE_DATA, 00102 HEADER, 00103 FIXED_HEADER, 00104 EVENT_TYPE, 00105 DOMAIN_NAME, 00106 TYPE_NAME, 00107 EVENT_NAME, 00108 VARIABLE_HEADER, 00109 REMAINDER_OF_BODY, 00110 EMPTY 00111 }; |
|
Constructor.
Definition at line 17 of file Notify_Constraint_Visitors.cpp. References ACE_CString, ACE_Hash_Map_Manager_Ex< ACE_CString, structured_event_field, ACE_Hash< ACE_CString >, ACE_Equal_To< ACE_CString >, ACE_Null_Mutex >::bind(), DOMAIN_NAME, EVENT_NAME, EVENT_TYPE, FILTERABLE_DATA, FIXED_HEADER, HEADER, implicit_ids_, REMAINDER_OF_BODY, TYPE_NAME, and VARIABLE_HEADER.
00018 : implicit_id_ (TAO_Notify_Constraint_Visitor::EMPTY), 00019 implicit_ids_(implicit_ids_size_), 00020 filterable_data_(filterable_data_size_), 00021 variable_header_(variable_header_size_) 00022 { 00023 (void) this->implicit_ids_.bind (ACE_CString ("filterable_data", 00024 0, 00025 0), 00026 FILTERABLE_DATA); 00027 (void) this->implicit_ids_.bind (ACE_CString ("header", 00028 0, 00029 0), 00030 HEADER); 00031 (void) this->implicit_ids_.bind (ACE_CString ("remainder_of_body", 00032 0, 00033 0), 00034 REMAINDER_OF_BODY); 00035 (void) this->implicit_ids_.bind (ACE_CString ("fixed_header", 00036 0, 00037 0), 00038 FIXED_HEADER); 00039 (void) this->implicit_ids_.bind (ACE_CString ("variable_header", 00040 0, 00041 0), 00042 VARIABLE_HEADER); 00043 (void) this->implicit_ids_.bind (ACE_CString ("event_name", 00044 0, 00045 0), 00046 EVENT_NAME); 00047 (void) this->implicit_ids_.bind (ACE_CString ("event_type", 00048 0, 00049 0), 00050 EVENT_TYPE); 00051 (void) this->implicit_ids_.bind (ACE_CString ("domain_name", 00052 0, 00053 0), 00054 DOMAIN_NAME); 00055 (void) this->implicit_ids_.bind (ACE_CString ("type_name", 00056 0, 00057 0), 00058 TYPE_NAME); 00059 } |
|
Definition at line 1410 of file Notify_Constraint_Visitors.cpp. Referenced by visit_in().
01414 { 01415 const CORBA::Any *result = 0; 01416 01417 *any >>= result; 01418 01419 TAO_ETCL_Literal_Constraint element (const_cast<CORBA::Any *>(result)); 01420 return item == element; 01421 } |
|
Definition at line 1269 of file Notify_Constraint_Visitors.cpp. References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, and simple_type_match(). Referenced by visit_in().
01271 { 01272 ACE_DECLARE_NEW_CORBA_ENV; 01273 ACE_TRY 01274 { 01275 CORBA::TypeCode_var type = any->type (); 01276 CORBA::TCKind kind = TAO_DynAnyFactory::unalias (type.in () 01277 ACE_ENV_ARG_PARAMETER); 01278 ACE_TRY_CHECK; 01279 01280 // The literal and the array elements must be 01281 // of the same simple type. 01282 CORBA::Boolean match = this->simple_type_match (item.expr_type (), 01283 kind); 01284 01285 if (match == 0) 01286 return 0; 01287 01288 TAO_DynArray_i dyn_array; 01289 dyn_array.init (*any 01290 ACE_ENV_ARG_PARAMETER); 01291 ACE_TRY_CHECK; 01292 01293 DynamicAny::AnySeq_var any_seq = 01294 dyn_array.get_elements (ACE_ENV_SINGLE_ARG_PARAMETER); 01295 ACE_TRY_CHECK; 01296 01297 CORBA::ULong length = any_seq->length (); 01298 01299 for (CORBA::ULong i = 0; i < length; ++i) 01300 { 01301 TAO_ETCL_Literal_Constraint element (&any_seq[i]); 01302 01303 if (item == element) 01304 return 1; 01305 } 01306 } 01307 ACE_CATCHANY 01308 { 01309 return 0; 01310 } 01311 ACE_ENDTRY; 01312 01313 return 0; 01314 } |
|
Put the event data into our hash map.
Definition at line 62 of file Notify_Constraint_Visitors.cpp. References ACE_CString, domain_name_, event_name_, CosNotification::StructuredEvent::filterable_data, filterable_data_, CosNotification::StructuredEvent::header, CosNotification::StructuredEvent::remainder_of_body, remainder_of_body_, CORBA::string_dup(), type_name_, and variable_header_. Referenced by TAO_Notify_ETCL_Filter::match_structured().
00063 { 00064 // The two sequences contained in a structured event are 00065 // copied into hash tables so iteration is done only once. 00066 00067 CORBA::ULong length = s_event.filterable_data.length (); 00068 CORBA::ULong index = 0; 00069 00070 for (index = 0; index < length; ++index) 00071 { 00072 ACE_CString name_str (s_event.filterable_data[index].name, 0, 0); 00073 00074 int status = 00075 this->filterable_data_.bind ( 00076 name_str, 00077 s_event.filterable_data[index].value 00078 ); 00079 00080 if (status != 0) 00081 return -1; 00082 } 00083 00084 length = s_event.header.variable_header.length (); 00085 00086 for (index = 0; index < length; ++index) 00087 { 00088 ACE_CString name_str (s_event.header.variable_header[index].name, 0, 0); 00089 00090 int status = 00091 this->variable_header_.bind ( 00092 name_str, 00093 s_event.header.variable_header[index].value 00094 ); 00095 00096 if (status != 0) 00097 return -1; 00098 } 00099 00100 this->domain_name_ = 00101 CORBA::string_dup (s_event.header.fixed_header.event_type.domain_name); 00102 00103 this->type_name_ = 00104 CORBA::string_dup (s_event.header.fixed_header.event_type.type_name); 00105 00106 this->event_name_ = 00107 CORBA::string_dup (s_event.header.fixed_header.event_name); 00108 00109 this->remainder_of_body_ = s_event.remainder_of_body; 00110 00111 return 0; 00112 } |
|
Returns 1 if the event satisfies the constraint represented by the the expression tree rooted at , 0 if it doesn't. If an error occurs during the process, the traversal automatically fails. Definition at line 115 of file Notify_Constraint_Visitors.cpp. References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::is_empty(), and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::reset(). Referenced by TAO_Notify_Constraint_Interpreter::evaluate().
00118 { 00119 CORBA::Boolean result = 0; 00120 this->queue_.reset (); 00121 00122 // Evaluate the constraint in root_; 00123 if (root != 0) 00124 { 00125 if ((root->accept (this) == 0) && 00126 (! this->queue_.is_empty ())) 00127 { 00128 TAO_ETCL_Literal_Constraint top; 00129 this->queue_.dequeue_head (top); 00130 result = (CORBA::Boolean) top; 00131 } 00132 } 00133 00134 // If a property couldn't be evaluated we must return 0. 00135 return result; 00136 } |
|
Definition at line 1215 of file Notify_Constraint_Visitors.cpp. References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, and simple_type_match(). Referenced by visit_in().
01217 { 01218 ACE_DECLARE_NEW_CORBA_ENV; 01219 ACE_TRY 01220 { 01221 CORBA::TypeCode_var type = any->type (); 01222 CORBA::TypeCode_var base_type = 01223 TAO_DynAnyFactory::strip_alias (type.in () ACE_ENV_ARG_PARAMETER); 01224 ACE_TRY_CHECK; 01225 CORBA::TypeCode_var content_type = 01226 base_type->content_type (ACE_ENV_SINGLE_ARG_PARAMETER); 01227 ACE_TRY_CHECK; 01228 CORBA::TCKind kind = 01229 TAO_DynAnyFactory::unalias (content_type.in() ACE_ENV_ARG_PARAMETER); 01230 ACE_TRY_CHECK; 01231 01232 // The literal and the array elements must be 01233 // of the same simple type. 01234 CORBA::Boolean match = this->simple_type_match (item.expr_type (), 01235 kind); 01236 01237 if (match == 0) 01238 return 0; 01239 01240 TAO_DynSequence_i dyn_seq; 01241 dyn_seq.init (*any 01242 ACE_ENV_ARG_PARAMETER); 01243 ACE_TRY_CHECK; 01244 01245 DynamicAny::AnySeq_var any_seq = 01246 dyn_seq.get_elements (ACE_ENV_SINGLE_ARG_PARAMETER); 01247 ACE_TRY_CHECK; 01248 01249 CORBA::ULong length = any_seq->length (); 01250 01251 for (CORBA::ULong i = 0; i < length; ++i) 01252 { 01253 TAO_ETCL_Literal_Constraint element (&any_seq[i]); 01254 01255 if (item == element) 01256 return 1; 01257 } 01258 } 01259 ACE_CATCHANY 01260 { 01261 return 0; 01262 } 01263 ACE_ENDTRY; 01264 01265 return 0; 01266 } |
|
Definition at line 1424 of file Notify_Constraint_Visitors.cpp. Referenced by array_does_contain(), sequence_does_contain(), struct_does_contain(), and union_does_contain().
01426 { 01427 switch (expr_type) 01428 { 01429 case TAO_ETCL_STRING: 01430 if (tc_kind != CORBA::tk_string) 01431 return 0; 01432 break; 01433 case TAO_ETCL_DOUBLE: 01434 if (tc_kind != CORBA::tk_double 01435 && tc_kind != CORBA::tk_float) 01436 return 0; 01437 break; 01438 case TAO_ETCL_INTEGER: 01439 case TAO_ETCL_SIGNED: 01440 if (tc_kind != CORBA::tk_short 01441 && tc_kind != CORBA::tk_long 01442 && tc_kind != CORBA::tk_longlong) 01443 return 0; 01444 break; 01445 case TAO_ETCL_UNSIGNED: 01446 if (tc_kind != CORBA::tk_ushort 01447 && tc_kind != CORBA::tk_ulong 01448 && tc_kind != CORBA::tk_ulonglong) 01449 return 0; 01450 break; 01451 case TAO_ETCL_BOOLEAN: 01452 if (tc_kind != CORBA::tk_boolean) 01453 return 0; 01454 break; 01455 default: 01456 return 0; 01457 } 01458 return 1; 01459 } |
|
Definition at line 1317 of file Notify_Constraint_Visitors.cpp. References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, and simple_type_match(). Referenced by visit_in().
01319 { 01320 ACE_DECLARE_NEW_CORBA_ENV; 01321 ACE_TRY 01322 { 01323 TAO_DynStruct_i dyn_struct; 01324 dyn_struct.init (*any 01325 ACE_ENV_ARG_PARAMETER); 01326 ACE_TRY_CHECK; 01327 01328 DynamicAny::NameValuePairSeq_var members = 01329 dyn_struct.get_members (ACE_ENV_SINGLE_ARG_PARAMETER); 01330 ACE_TRY_CHECK; 01331 01332 CORBA::ULong length = members->length (); 01333 CORBA::TypeCode_var tc; 01334 CORBA::TCKind kind; 01335 01336 for (CORBA::ULong i = 0; i < length; ++i) 01337 { 01338 tc = members[i].value.type (); 01339 kind = TAO_DynAnyFactory::unalias (tc.in () 01340 ACE_ENV_ARG_PARAMETER); 01341 ACE_TRY_CHECK; 01342 01343 // The literal and the struct member must be 01344 // of the same simple type. 01345 CORBA::Boolean match = this->simple_type_match (item.expr_type (), 01346 kind); 01347 01348 if (match == 0) 01349 continue; 01350 01351 TAO_ETCL_Literal_Constraint element (&members[i].value); 01352 01353 if (item == element) 01354 return 1; 01355 } 01356 } 01357 ACE_CATCHANY 01358 { 01359 return 0; 01360 } 01361 ACE_ENDTRY; 01362 01363 return 0; 01364 } |
|
Definition at line 1367 of file Notify_Constraint_Visitors.cpp. References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, and simple_type_match(). Referenced by visit_in().
01369 { 01370 ACE_DECLARE_NEW_CORBA_ENV; 01371 ACE_TRY 01372 { 01373 TAO_DynUnion_i dyn_union; 01374 dyn_union.init (*any 01375 ACE_ENV_ARG_PARAMETER); 01376 ACE_TRY_CHECK; 01377 01378 DynamicAny::DynAny_var cc = 01379 dyn_union.current_component (ACE_ENV_SINGLE_ARG_PARAMETER); 01380 ACE_TRY_CHECK; 01381 01382 CORBA::Any_var member = cc->to_any (ACE_ENV_SINGLE_ARG_PARAMETER); 01383 ACE_TRY_CHECK; 01384 01385 CORBA::TypeCode_var tc = member->type (); 01386 CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in () 01387 ACE_ENV_ARG_PARAMETER); 01388 ACE_TRY_CHECK; 01389 01390 // The literal and the union member must be 01391 // of the same simple type. 01392 CORBA::Boolean match = this->simple_type_match (item.expr_type (), 01393 kind); 01394 01395 if (match == 0) 01396 return 0; 01397 01398 TAO_ETCL_Literal_Constraint element (&member.inout ()); 01399 01400 return (item == element); 01401 } 01402 ACE_CATCHANY 01403 { 01404 return 0; 01405 } 01406 ACE_ENDTRY; 01407 } |
|
Definition at line 997 of file Notify_Constraint_Visitors.cpp. References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(). Referenced by visit_binary_expr().
00998 { 00999 int return_value = -1; 01000 CORBA::Boolean result = 0; 01001 TAO_ETCL_Constraint *lhs = binary->lhs (); 01002 01003 if (lhs->accept (this) == 0) 01004 { 01005 TAO_ETCL_Literal_Constraint lhs_result; 01006 this->queue_.dequeue_head (lhs_result); 01007 result = (CORBA::Boolean) lhs_result; 01008 01009 // Short-circuiting AND. 01010 if (result == 1) 01011 { 01012 TAO_ETCL_Constraint *rhs = binary->rhs (); 01013 01014 if (rhs->accept (this) == 0) 01015 { 01016 TAO_ETCL_Literal_Constraint rhs_result; 01017 this->queue_.dequeue_head (rhs_result); 01018 result = (CORBA::Boolean) rhs_result; 01019 return_value = 0; 01020 } 01021 } 01022 else 01023 return_value = 0; 01024 } 01025 01026 if (return_value == 0) 01027 this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result)); 01028 01029 return return_value; 01030 } |
|
Definition at line 925 of file Notify_Constraint_Visitors.cpp. References visit_and(), visit_binary_op(), visit_in(), visit_or(), and visit_twiddle().
00928 { 00929 int bin_op_type = binary_expr->type (); 00930 00931 switch (bin_op_type) 00932 { 00933 case TAO_ETCL_OR: 00934 return this->visit_or (binary_expr); 00935 case TAO_ETCL_AND: 00936 return this->visit_and (binary_expr); 00937 case TAO_ETCL_LT: 00938 case TAO_ETCL_LE: 00939 case TAO_ETCL_GT: 00940 case TAO_ETCL_GE: 00941 case TAO_ETCL_EQ: 00942 case TAO_ETCL_NE: 00943 case TAO_ETCL_PLUS: 00944 case TAO_ETCL_MINUS: 00945 case TAO_ETCL_MULT: 00946 case TAO_ETCL_DIV: 00947 return this->visit_binary_op (binary_expr, 00948 bin_op_type); 00949 case TAO_ETCL_TWIDDLE: 00950 return this->visit_twiddle (binary_expr); 00951 case TAO_ETCL_IN: 00952 return this->visit_in (binary_expr); 00953 default: 00954 return -1; 00955 } 00956 } |
|
Definition at line 1033 of file Notify_Constraint_Visitors.cpp. References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(). Referenced by visit_binary_expr().
01035 { 01036 int return_value = -1; 01037 TAO_ETCL_Constraint *lhs = binary->lhs (); 01038 CORBA::Boolean result = 0; 01039 01040 // Perform an operation on the results of evaluating the left and 01041 // right branches of this subtree. 01042 if (lhs->accept (this) == 0) 01043 { 01044 TAO_ETCL_Literal_Constraint left_operand; 01045 this->queue_.dequeue_head (left_operand); 01046 TAO_ETCL_Constraint *rhs = binary->rhs (); 01047 01048 if (rhs->accept (this) == 0) 01049 { 01050 TAO_ETCL_Literal_Constraint right_operand; 01051 this->queue_.dequeue_head (right_operand); 01052 return_value = 0; 01053 01054 switch (op_type) 01055 { 01056 case TAO_ETCL_LT: 01057 result = left_operand < right_operand; 01058 this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result)); 01059 break; 01060 case TAO_ETCL_LE: 01061 result = left_operand <= right_operand; 01062 this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result)); 01063 break; 01064 case TAO_ETCL_GT: 01065 result = left_operand > right_operand; 01066 this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result)); 01067 break; 01068 case TAO_ETCL_GE: 01069 result = left_operand >= right_operand; 01070 this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result)); 01071 break; 01072 case TAO_ETCL_EQ: 01073 result = left_operand == right_operand; 01074 this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result)); 01075 break; 01076 case TAO_ETCL_NE: 01077 result = left_operand != right_operand; 01078 this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result)); 01079 break; 01080 case TAO_ETCL_PLUS: 01081 this->queue_.enqueue_head (left_operand + right_operand); 01082 break; 01083 case TAO_ETCL_MINUS: 01084 this->queue_.enqueue_head (left_operand - right_operand); 01085 break; 01086 case TAO_ETCL_MULT: 01087 this->queue_.enqueue_head (left_operand * right_operand); 01088 break; 01089 case TAO_ETCL_DIV: 01090 this->queue_.enqueue_head (left_operand / right_operand); 01091 break; 01092 default: 01093 return_value = -1; 01094 } 01095 } 01096 } 01097 01098 return return_value; 01099 } |
|
Definition at line 681 of file Notify_Constraint_Visitors.cpp. References ACE_CString, ACE_NEW_RETURN, current_value_, ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), DOMAIN_NAME, EMPTY, ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(), EVENT_NAME, ACE_Hash_Map_Manager_Ex< ACE_CString, structured_event_field, ACE_Hash< ACE_CString >, ACE_Equal_To< ACE_CString >, ACE_Null_Mutex >::find(), implicit_id_, implicit_ids_, REMAINDER_OF_BODY, and TYPE_NAME.
00684 { 00685 TAO_ETCL_Constraint *nested = component->component (); 00686 TAO_ETCL_Identifier *identifier = component->identifier (); 00687 ACE_CString component_name (identifier->value (), 00688 0, 00689 0); 00690 CORBA::Any *any_ptr = 0; 00691 00692 if (this->implicit_ids_.find (component_name, this->implicit_id_) != 0) 00693 this->implicit_id_ = TAO_Notify_Constraint_Visitor::EMPTY; 00694 00695 // If this component has no sub-component, only an identifier, then 00696 // we just visit the identifier, which puts a literal on the queue 00697 // to be handled upon returning from this method call. If there is 00698 // a sub-component, we store the literal's value in our member _var 00699 // for possible examination at a more nested level, and visit the 00700 // sub-component. If the identifier matches one of the nested field 00701 // names in CosNotification::StructuredEvent, we just visit the 00702 // nested component, if any. 00703 if (this->implicit_id_ == TAO_Notify_Constraint_Visitor::EMPTY) 00704 { 00705 if (nested == 0) 00706 { 00707 // If this is the end of the line, we put the component name 00708 // into current_value_ so visit_exist can use it. 00709 ACE_NEW_RETURN (any_ptr, 00710 CORBA::Any, 00711 -1); 00712 (*any_ptr) <<= component_name.c_str (); 00713 this->current_value_ = any_ptr; 00714 return identifier->accept (this); 00715 } 00716 else 00717 { 00718 int result = identifier->accept (this); 00719 00720 if (result != 0) 00721 return result; 00722 00723 TAO_ETCL_Literal_Constraint id; 00724 this->queue_.dequeue_head (id); 00725 ACE_NEW_RETURN (any_ptr, 00726 CORBA::Any (*(const CORBA::Any *) id), 00727 -1); 00728 this->current_value_ = any_ptr; 00729 } 00730 } 00731 00732 if (nested != 0) 00733 return nested->accept (this); 00734 else 00735 { 00736 switch (this->implicit_id_) 00737 { 00738 case TYPE_NAME: 00739 { 00740 TAO_ETCL_Literal_Constraint tn (this->type_name_.in ()); 00741 this->queue_.enqueue_head (tn); 00742 return 0; 00743 } 00744 case EVENT_NAME: 00745 { 00746 TAO_ETCL_Literal_Constraint en (this->event_name_.in ()); 00747 this->queue_.enqueue_head (en); 00748 return 0; 00749 } 00750 case DOMAIN_NAME: 00751 { 00752 TAO_ETCL_Literal_Constraint dn (this->domain_name_.in ()); 00753 this->queue_.enqueue_head (dn); 00754 return 0; 00755 } 00756 case REMAINDER_OF_BODY: 00757 { 00758 TAO_ETCL_Literal_Constraint rob (&this->remainder_of_body_); 00759 this->queue_.enqueue_head (rob); 00760 return 0; 00761 } 00762 // The above cases are the leaves of the 00763 // CosNotification::StructuredEvent "tree". Anything else and we 00764 // should have a nested component. otherwise, it's an error. 00765 default: 00766 return -1; 00767 } 00768 } 00769 } |
|
Definition at line 494 of file Notify_Constraint_Visitors.cpp. References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, current_value_, and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().
00495 { 00496 ACE_DECLARE_NEW_CORBA_ENV; 00497 ACE_TRY 00498 { 00499 // If we are here (from visit_component) the Any containing the 00500 // component as found in filterable_data_ will be in 00501 // current_value_. 00502 CORBA::TypeCode_var tc = this->current_value_->type (); 00503 CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in () 00504 ACE_ENV_ARG_PARAMETER); 00505 ACE_TRY_CHECK; 00506 00507 DynamicAny::DynAny_var member; 00508 CORBA::Boolean success = 0; 00509 CORBA::ULong slot = (CORBA::ULong) *array->integer (); 00510 00511 switch (kind) 00512 { 00513 case CORBA::tk_array: 00514 { 00515 TAO_DynEnum_i dyn_array; 00516 dyn_array.init (this->current_value_.in () 00517 ACE_ENV_ARG_PARAMETER); 00518 ACE_TRY_CHECK; 00519 00520 success = dyn_array.seek (slot 00521 ACE_ENV_ARG_PARAMETER); 00522 ACE_TRY_CHECK; 00523 00524 if (success == 0) 00525 return -1; 00526 00527 member = dyn_array.current_component (ACE_ENV_SINGLE_ARG_PARAMETER); 00528 ACE_TRY_CHECK; 00529 00530 break; 00531 } 00532 case CORBA::tk_sequence: 00533 { 00534 TAO_DynStruct_i dyn_sequence; 00535 dyn_sequence.init (this->current_value_.in () 00536 ACE_ENV_ARG_PARAMETER); 00537 ACE_TRY_CHECK; 00538 00539 success = dyn_sequence.seek (slot 00540 ACE_ENV_ARG_PARAMETER); 00541 ACE_TRY_CHECK; 00542 00543 if (success == 0) 00544 return -1; 00545 00546 member = 00547 dyn_sequence.current_component (ACE_ENV_SINGLE_ARG_PARAMETER); 00548 ACE_TRY_CHECK; 00549 00550 break; 00551 } 00552 // Enums and sequences are the only two cases handled 00553 // by Component_Array. 00554 default: 00555 return -1; 00556 } 00557 00558 CORBA::Any_var value = member->to_any (ACE_ENV_SINGLE_ARG_PARAMETER); 00559 ACE_TRY_CHECK; 00560 00561 TAO_ETCL_Constraint *comp = array->component (); 00562 00563 if (comp == 0) 00564 { 00565 TAO_ETCL_Literal_Constraint result (value.ptr ()); 00566 this->queue_.enqueue_head (result); 00567 return 0; 00568 } 00569 else 00570 { 00571 this->current_value_ = value._retn (); 00572 return comp->accept (this); 00573 } 00574 } 00575 ACE_CATCHANY 00576 { 00577 return -1; 00578 } 00579 ACE_ENDTRY; 00580 } |
|
Definition at line 438 of file Notify_Constraint_Visitors.cpp. References ACE_CString, ACE_NEW_RETURN, current_value_, ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(), FILTERABLE_DATA, filterable_data_, implicit_id_, VARIABLE_HEADER, and variable_header_.
00441 { 00442 CORBA::Any any; 00443 ACE_CString name (assoc->identifier ()->value (), 00444 0, 00445 0); 00446 00447 switch (this->implicit_id_) 00448 { 00449 case FILTERABLE_DATA: 00450 if (this->filterable_data_.find (name, any) != 0 00451 || any.impl() == 0) 00452 return -1; 00453 break; 00454 case VARIABLE_HEADER: 00455 if (this->variable_header_.find (name, any) != 0 00456 || any.impl() == 0) 00457 return -1; 00458 break; 00459 // Only the sequence members of CosNotification::StructuredEvent 00460 // can be treated as associative arrays. 00461 default: 00462 return -1; 00463 } 00464 00465 TAO_ETCL_Constraint *comp = assoc->component (); 00466 CORBA::Any *any_ptr = 0; 00467 00468 if (comp == 0) 00469 { 00470 TAO_ETCL_Literal_Constraint result (&any); 00471 this->queue_.enqueue_head (result); 00472 00473 // If we're at the end of the line, put the name into 00474 // current_value_ so visit_exist can use it. 00475 ACE_NEW_RETURN (any_ptr, 00476 CORBA::Any, 00477 -1); 00478 (*any_ptr) <<= name.c_str (); 00479 this->current_value_ = any_ptr; 00480 00481 return 0; 00482 } 00483 else 00484 { 00485 ACE_NEW_RETURN (any_ptr, 00486 CORBA::Any (any), 00487 -1); 00488 this->current_value_ = any_ptr; 00489 return comp->accept (this); 00490 } 00491 } |
|
Definition at line 346 of file Notify_Constraint_Visitors.cpp. References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, current_value_, and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().
00349 { 00350 ACE_DECLARE_NEW_CORBA_ENV; 00351 ACE_TRY 00352 { 00353 // If we are here (from visit_component) the Any containing the 00354 // component as found in filterable_data_ will be in current_value_. 00355 CORBA::TypeCode_var tc = this->current_value_->type (); 00356 CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in () 00357 ACE_ENV_ARG_PARAMETER); 00358 ACE_TRY_CHECK; 00359 00360 DynamicAny::DynAny_var member; 00361 CORBA::Boolean success = 0; 00362 CORBA::ULong slot = (CORBA::ULong) *pos->integer (); 00363 00364 switch (kind) 00365 { 00366 case CORBA::tk_enum: 00367 { 00368 TAO_DynEnum_i dyn_enum; 00369 dyn_enum.init (this->current_value_.in () 00370 ACE_ENV_ARG_PARAMETER); 00371 ACE_TRY_CHECK; 00372 00373 success = dyn_enum.seek (slot 00374 ACE_ENV_ARG_PARAMETER); 00375 ACE_TRY_CHECK; 00376 00377 if (success == 0) 00378 return -1; 00379 00380 member = 00381 dyn_enum.current_component (ACE_ENV_SINGLE_ARG_PARAMETER); 00382 ACE_TRY_CHECK; 00383 00384 break; 00385 } 00386 case CORBA::tk_struct: 00387 { 00388 TAO_DynStruct_i dyn_struct; 00389 dyn_struct.init (this->current_value_.in () 00390 ACE_ENV_ARG_PARAMETER); 00391 ACE_TRY_CHECK; 00392 00393 success = dyn_struct.seek (slot 00394 ACE_ENV_ARG_PARAMETER); 00395 ACE_TRY_CHECK; 00396 00397 if (success == 0) 00398 return -1; 00399 00400 member = dyn_struct.current_component (ACE_ENV_SINGLE_ARG_PARAMETER); 00401 ACE_TRY_CHECK; 00402 00403 break; 00404 } 00405 // @@@ (JP) I think enums and structs are the only two cases 00406 // handled by Component_Pos, since arrays and sequences are 00407 // handled by Component_Array, and unions are handled by 00408 // Union_Pos. 00409 default: 00410 return -1; 00411 } 00412 00413 CORBA::Any_var value = member->to_any (ACE_ENV_SINGLE_ARG_PARAMETER); 00414 ACE_TRY_CHECK; 00415 00416 TAO_ETCL_Constraint *comp = pos->component (); 00417 00418 if (comp == 0) 00419 { 00420 TAO_ETCL_Literal_Constraint result (value.ptr ()); 00421 this->queue_.enqueue_head (result); 00422 return 0; 00423 } 00424 else 00425 { 00426 this->current_value_ = value._retn (); 00427 return comp->accept (this); 00428 } 00429 } 00430 ACE_CATCHANY 00431 { 00432 return -1; 00433 } 00434 ACE_ENDTRY; 00435 } |
|
Definition at line 788 of file Notify_Constraint_Visitors.cpp. References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, current_value_, ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().
00789 { 00790 TAO_ETCL_Constraint *comp = def->component (); 00791 00792 if (comp == 0) 00793 return -1; 00794 00795 if (comp->accept (this) != 0) 00796 return -1; 00797 00798 ACE_DECLARE_NEW_CORBA_ENV; 00799 ACE_TRY 00800 { 00801 CORBA::TypeCode_var tc = this->current_value_->type (); 00802 00803 // If the current member is not a union, this call will throw 00804 // BadKind and the catch block will return -1. 00805 CORBA::Long default_index = tc->default_index (ACE_ENV_SINGLE_ARG_PARAMETER); 00806 ACE_TRY_CHECK; 00807 00808 // No default index. 00809 if (default_index == -1) 00810 { 00811 TAO_ETCL_Literal_Constraint result ((CORBA::Boolean) 0); 00812 this->queue_.enqueue_head (result); 00813 return 0; 00814 } 00815 00816 // Okay, there's a default index, but is it active? 00817 00818 TAO_ETCL_Literal_Constraint disc; 00819 this->queue_.dequeue_head (disc); 00820 TAO_ETCL_Literal_Constraint default_index_value (default_index); 00821 return (disc == default_index_value); 00822 } 00823 ACE_CATCHANY 00824 { 00825 return -1; 00826 } 00827 ACE_ENDTRY; 00828 } |
|
Definition at line 772 of file Notify_Constraint_Visitors.cpp.
00773 { 00774 // If we are here, we know we're headed for a more nested 00775 // level, so we just visit it, there's nothing else in this 00776 // constraint. 00777 return dot->component ()->accept (this); 00778 } |
|
Definition at line 781 of file Notify_Constraint_Visitors.cpp.
00782 { 00783 // Nothing to do but visit the contained component. 00784 return eval->component ()->accept (this); 00785 } |
|
Definition at line 831 of file Notify_Constraint_Visitors.cpp. References ACE_CString, DOMAIN_NAME, domain_name_, ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(), EVENT_NAME, event_name_, FILTERABLE_DATA, filterable_data_, implicit_id_, CORBA::string_dup(), TYPE_NAME, type_name_, VARIABLE_HEADER, and variable_header_.
00832 { 00833 TAO_ETCL_Constraint *component = exist->component (); 00834 00835 if (component->accept (this) == 0) 00836 { 00837 const char *value = 0; 00838 CORBA::Boolean result = 0; 00839 00840 // For the two cases below, we don't want the item at the top of 00841 // the queue, because it's the result of a hash table 00842 // lookup. For an existence test, we want the key value, which 00843 // is stored in the current_value_ member. 00844 if (this->implicit_id_ == FILTERABLE_DATA 00845 || this->implicit_id_ == VARIABLE_HEADER) 00846 { 00847 TAO_ETCL_Literal_Constraint current (&this->current_value_.inout ()); 00848 value = CORBA::string_dup ((const char *) current); 00849 } 00850 00851 switch (this->implicit_id_) 00852 { 00853 case FILTERABLE_DATA: 00854 result = 00855 (this->filterable_data_.find (ACE_CString (value, 0, 0)) == 0); 00856 break; 00857 case VARIABLE_HEADER: 00858 result = 00859 (this->variable_header_.find (ACE_CString (value, 0, 0)) == 0); 00860 break; 00861 case TYPE_NAME: 00862 result = (this->type_name_.in () != 0); 00863 break; 00864 case EVENT_NAME: 00865 result = (this->event_name_.in () != 0); 00866 break; 00867 case DOMAIN_NAME: 00868 result = (this->domain_name_.in () != 0); 00869 break; 00870 // Anything other than the above cases is an error. 00871 default: 00872 return -1; 00873 } 00874 00875 this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result)); 00876 00877 return 0; 00878 } 00879 00880 return -1; 00881 } |
|
Definition at line 148 of file Notify_Constraint_Visitors.cpp. References ACE_CString, ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(), and filterable_data_.
00149 { 00150 int return_value = -1; 00151 const char *name = ident->value (); 00152 ACE_CString key (name, 0, 0); 00153 00154 CORBA::Any any; 00155 00156 if (this->filterable_data_.find (key, any) == 0) 00157 { 00158 if (any.impl() != 0) 00159 { 00160 this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (&any)); 00161 return_value = 0; 00162 } 00163 } 00164 00165 return return_value; 00166 } |
|
Definition at line 1130 of file Notify_Constraint_Visitors.cpp. References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, any_does_contain(), array_does_contain(), ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(), sequence_does_contain(), struct_does_contain(), and union_does_contain(). Referenced by visit_binary_expr().
01131 { 01132 int return_value = -1; 01133 TAO_ETCL_Constraint *lhs = binary->lhs (); 01134 01135 // Determine if the left operand is contained in the right. 01136 if (lhs->accept (this) == 0) 01137 { 01138 TAO_ETCL_Literal_Constraint left; 01139 this->queue_.dequeue_head (left); 01140 01141 TAO_ETCL_Constraint *rhs = binary->rhs (); 01142 01143 if (rhs->accept (this) == 0) 01144 { 01145 TAO_ETCL_Literal_Constraint bag; 01146 this->queue_.dequeue_head (bag); 01147 01148 if (bag.expr_type () == TAO_ETCL_COMPONENT) 01149 { 01150 const CORBA::Any *component = (const CORBA::Any *) bag; 01151 CORBA::TCKind kind = CORBA::tk_null; 01152 01153 ACE_DECLARE_NEW_CORBA_ENV; 01154 ACE_TRY 01155 { 01156 CORBA::TypeCode_var tc = component->type (); 01157 kind = TAO_DynAnyFactory::unalias (tc.in () 01158 ACE_ENV_ARG_PARAMETER); 01159 ACE_TRY_CHECK; 01160 } 01161 ACE_CATCHANY 01162 { 01163 return return_value; 01164 } 01165 ACE_ENDTRY; 01166 01167 CORBA::Boolean result = 0; 01168 01169 switch (kind) 01170 { 01171 case CORBA::tk_sequence: 01172 result = this->sequence_does_contain (component, 01173 left); 01174 break; 01175 case CORBA::tk_array: 01176 result = this->array_does_contain (component, 01177 left); 01178 break; 01179 case CORBA::tk_struct: 01180 result = this->struct_does_contain (component, 01181 left); 01182 break; 01183 case CORBA::tk_union: 01184 result = this->union_does_contain (component, 01185 left); 01186 break; 01187 case CORBA::tk_any: 01188 result = this->any_does_contain (component, 01189 left); 01190 break; 01191 default: 01192 return return_value; 01193 } 01194 01195 this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result)); 01196 return_value = 0; 01197 } 01198 } 01199 } 01200 01201 return return_value; 01202 } |
|
Definition at line 139 of file Notify_Constraint_Visitors.cpp. References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().
00142 { 00143 this->queue_.enqueue_head (*literal); 00144 return 0; 00145 } |
|
Definition at line 959 of file Notify_Constraint_Visitors.cpp. References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(). Referenced by visit_binary_expr().
00962 { 00963 int return_value = -1; 00964 CORBA::Boolean result = 0; 00965 TAO_ETCL_Constraint *lhs = binary->lhs (); 00966 00967 if (lhs->accept (this) == 0) 00968 { 00969 TAO_ETCL_Literal_Constraint lhs_result; 00970 this->queue_.dequeue_head (lhs_result); 00971 result = (CORBA::Boolean) lhs_result; 00972 00973 // Short-circuiting OR. 00974 if (result == 0) 00975 { 00976 TAO_ETCL_Constraint *rhs = binary->rhs (); 00977 00978 if (rhs->accept (this) == 0) 00979 { 00980 TAO_ETCL_Literal_Constraint rhs_result; 00981 this->queue_.dequeue_head (rhs_result); 00982 result = (CORBA::Boolean) rhs_result; 00983 return_value = 0; 00984 } 00985 } 00986 else 00987 return_value = 0; 00988 } 00989 00990 if (return_value == 0) 00991 this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result)); 00992 00993 return return_value; 00994 } |
|
Definition at line 1205 of file Notify_Constraint_Visitors.cpp.
01206 { 01207 // According to OMG 00-06-20 section 2.4.1, the Notification Service 01208 // does not use the preference operators. The method must be here 01209 // because it is called by the ETCL node, which may be used by other 01210 // CORBA services that do use the preference operators. 01211 return -1; 01212 } |
|
Definition at line 583 of file Notify_Constraint_Visitors.cpp. References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, current_value_, and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().
00584 { 00585 ACE_DECLARE_NEW_CORBA_ENV; 00586 ACE_TRY 00587 { 00588 CORBA::TypeCode_var tc = this->current_value_->type (); 00589 tc = TAO_DynAnyFactory::strip_alias (tc.in () ACE_ENV_ARG_PARAMETER); 00590 ACE_TRY_CHECK; 00591 00592 CORBA::TCKind kind = tc->kind (ACE_ENV_SINGLE_ARG_PARAMETER); 00593 ACE_TRY_CHECK; 00594 00595 switch (special->type ()) 00596 { 00597 case TAO_ETCL_LENGTH: 00598 { 00599 CORBA::ULong length; 00600 00601 switch (kind) 00602 { 00603 case CORBA::tk_sequence: 00604 { 00605 TAO_DynSequence_i dyn_seq; 00606 dyn_seq.init (current_value_.in() 00607 ACE_ENV_ARG_PARAMETER); 00608 ACE_TRY_CHECK; 00609 00610 DynamicAny::AnySeq_var any_seq = 00611 dyn_seq.get_elements (ACE_ENV_SINGLE_ARG_PARAMETER); 00612 ACE_TRY_CHECK; 00613 00614 length = any_seq->length (); 00615 } 00616 break; 00617 case CORBA::tk_array: 00618 { 00619 length = tc->length (ACE_ENV_SINGLE_ARG_PARAMETER); 00620 ACE_TRY_CHECK; 00621 } 00622 break; 00623 default: 00624 return -1; 00625 } 00626 00627 TAO_ETCL_Literal_Constraint lit (length); 00628 this->queue_.enqueue_head (lit); 00629 return 0; 00630 } 00631 case TAO_ETCL_DISCRIMINANT: 00632 { 00633 // If the TCKind is not a union, the call to init() will 00634 // raise an exception, and the catch block will return -1; 00635 TAO_DynUnion_i dyn_union; 00636 dyn_union.init (this->current_value_.in () 00637 ACE_ENV_ARG_PARAMETER); 00638 ACE_TRY_CHECK; 00639 00640 DynamicAny::DynAny_var disc = 00641 dyn_union.get_discriminator (ACE_ENV_SINGLE_ARG_PARAMETER); 00642 ACE_TRY_CHECK; 00643 00644 CORBA::Any_var disc_any = disc->to_any (ACE_ENV_SINGLE_ARG_PARAMETER); 00645 ACE_TRY_CHECK; 00646 00647 TAO_ETCL_Literal_Constraint lit (disc_any.ptr ()); 00648 this->queue_.enqueue_head (lit); 00649 return 0; 00650 } 00651 case TAO_ETCL_TYPE_ID: 00652 { 00653 const char *name = tc->name (ACE_ENV_SINGLE_ARG_PARAMETER); 00654 ACE_TRY_CHECK; 00655 00656 TAO_ETCL_Literal_Constraint lit (name); 00657 this->queue_.enqueue_head (lit); 00658 return 0; 00659 } 00660 case TAO_ETCL_REPOS_ID: 00661 { 00662 const char *id = tc->id (ACE_ENV_SINGLE_ARG_PARAMETER); 00663 ACE_TRY_CHECK; 00664 00665 TAO_ETCL_Literal_Constraint lit (id); 00666 this->queue_.enqueue_head (lit); 00667 return 0; 00668 } 00669 default: 00670 return -1; 00671 } 00672 } 00673 ACE_CATCHANY 00674 { 00675 return -1; 00676 } 00677 ACE_ENDTRY; 00678 } |
|
Definition at line 1102 of file Notify_Constraint_Visitors.cpp. References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(), and ACE_OS::strstr(). Referenced by visit_binary_expr().
01103 { 01104 int return_value = -1; 01105 TAO_ETCL_Constraint *lhs = binary->lhs (); 01106 01107 // Determine if the left operand is a substring of the right. 01108 if (lhs->accept (this) == 0) 01109 { 01110 TAO_ETCL_Literal_Constraint left; 01111 this->queue_.dequeue_head (left); 01112 TAO_ETCL_Constraint *rhs = binary->rhs (); 01113 01114 if (rhs->accept (this) == 0) 01115 { 01116 TAO_ETCL_Literal_Constraint right; 01117 this->queue_.dequeue_head (right); 01118 CORBA::Boolean result = 01119 (ACE_OS::strstr ((const char *) right, 01120 (const char *) left) != 0); 01121 this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result)); 01122 return_value = 0; 01123 } 01124 } 01125 01126 return return_value; 01127 } |
|
Definition at line 884 of file Notify_Constraint_Visitors.cpp. References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().
00887 { 00888 TAO_ETCL_Constraint *subexpr = unary_expr->subexpr (); 00889 00890 if (subexpr->accept (this) == 0) 00891 { 00892 TAO_ETCL_Literal_Constraint subexpr_result; 00893 CORBA::Boolean result = 0; 00894 int op_type = unary_expr->type (); 00895 00896 switch (op_type) 00897 { 00898 case TAO_ETCL_NOT: 00899 this->queue_.dequeue_head (subexpr_result); 00900 result = ! (CORBA::Boolean) subexpr_result; 00901 this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result)); 00902 return 0; 00903 case TAO_ETCL_MINUS: 00904 // The leading '-' was parsed separately, so we have to pull 00905 // the literal constraint off the queue, apply the class' own 00906 // unary minus operator, and put it back. 00907 this->queue_.dequeue_head (subexpr_result); 00908 this->queue_.enqueue_head (-subexpr_result); 00909 return 0; 00910 case TAO_ETCL_PLUS: 00911 // Leave the literal constraint on the queue. The leading 00912 // '+' was just syntactic sugar - no action is necessary. 00913 return 0; 00914 default: 00915 // The parser should never construct a TAO_ETCL_Unary_Constraint 00916 // behind any operators except the above three. 00917 return -1; 00918 } 00919 } 00920 00921 return -1; 00922 } |
|
Definition at line 192 of file Notify_Constraint_Visitors.cpp. References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_NEW_RETURN, ACE_TRY, ACE_TRY_CHECK, current_value_, ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(), ACE_OS::strcmp(), and ACE_OutputCDR::write_ulong().
00195 { 00196 ACE_DECLARE_NEW_CORBA_ENV; 00197 ACE_TRY 00198 { 00199 if (union_pos->union_value ()->accept (this) == 0) 00200 { 00201 TAO_ETCL_Literal_Constraint disc_val; 00202 this->queue_.dequeue_head (disc_val); 00203 00204 TAO_DynUnion_i dyn_union; 00205 dyn_union.init (this->current_value_.in () 00206 ACE_ENV_ARG_PARAMETER); 00207 ACE_TRY_CHECK; 00208 00209 CORBA::TypeCode_var tc = this->current_value_->type (); 00210 00211 switch (disc_val.expr_type ()) 00212 { 00213 case TAO_ETCL_INTEGER: 00214 case TAO_ETCL_SIGNED: 00215 case TAO_ETCL_UNSIGNED: 00216 { 00217 CORBA::Any disc_any; 00218 CORBA::TypeCode_var disc_tc = 00219 tc->discriminator_type (ACE_ENV_SINGLE_ARG_PARAMETER); 00220 ACE_TRY_CHECK; 00221 CORBA::TCKind disc_kind = 00222 TAO_DynAnyFactory::unalias (disc_tc.in () 00223 ACE_ENV_ARG_PARAMETER); 00224 ACE_TRY_CHECK; 00225 00226 switch (disc_kind) 00227 { 00228 case CORBA::tk_boolean: 00229 disc_any <<= CORBA::Any::from_boolean ((CORBA::Boolean) disc_val); 00230 break; 00231 case CORBA::tk_short: 00232 disc_any <<= (CORBA::Short) ((CORBA::Long) disc_val); 00233 break; 00234 case CORBA::tk_ushort: 00235 disc_any <<= (CORBA::UShort) ((CORBA::ULong) disc_val); 00236 break; 00237 case CORBA::tk_long: 00238 disc_any <<= (CORBA::Long) disc_val; 00239 break; 00240 case CORBA::tk_ulong: 00241 disc_any <<= (CORBA::ULong) disc_val; 00242 break; 00243 case CORBA::tk_enum: 00244 { 00245 TAO_OutputCDR cdr; 00246 cdr.write_ulong ((CORBA::ULong) disc_val); 00247 TAO_InputCDR in_cdr (cdr); 00248 TAO::Unknown_IDL_Type *unk = 0; 00249 ACE_NEW_RETURN (unk, 00250 TAO::Unknown_IDL_Type (disc_tc.in (), 00251 in_cdr), 00252 -1); 00253 00254 disc_any.replace (unk); 00255 break; 00256 } 00257 // @@@ (JP) I don't think ETCL handles 64-bit 00258 // integers at this point, and I also think that 00259 // chars and/or wchars will just come out in the 00260 // constraint as (w)strings of length 1. 00261 case CORBA::tk_longlong: 00262 case CORBA::tk_ulonglong: 00263 case CORBA::tk_char: 00264 case CORBA::tk_wchar: 00265 default: 00266 return -1; 00267 } 00268 00269 DynamicAny::DynAny_var dyn_any = 00270 TAO_DynAnyFactory::make_dyn_any (disc_any 00271 ACE_ENV_ARG_PARAMETER); 00272 ACE_TRY_CHECK; 00273 dyn_union.set_discriminator (dyn_any.in () 00274 ACE_ENV_ARG_PARAMETER); 00275 ACE_TRY_CHECK; 00276 DynamicAny::DynAny_var u_member = 00277 dyn_union.member (ACE_ENV_SINGLE_ARG_PARAMETER); 00278 ACE_TRY_CHECK; 00279 this->current_value_ = 00280 u_member->to_any (ACE_ENV_SINGLE_ARG_PARAMETER); 00281 ACE_TRY_CHECK; 00282 00283 break; 00284 } 00285 case TAO_ETCL_STRING: 00286 { 00287 const char *name = (const char *) disc_val; 00288 CORBA::ULong count = 00289 tc->member_count (ACE_ENV_SINGLE_ARG_PARAMETER); 00290 ACE_TRY_CHECK; 00291 00292 const char *member_name = 0; 00293 CORBA::ULong i = 0; 00294 00295 for (i = 0; i < count; ++i) 00296 { 00297 member_name = tc->member_name (i 00298 ACE_ENV_ARG_PARAMETER); 00299 ACE_TRY_CHECK; 00300 00301 if (ACE_OS::strcmp (name, member_name) == 0) 00302 break; 00303 } 00304 00305 // If there's no match, member_label will throw 00306 // CORBA::TypeCode::Bounds and the catch block will 00307 // return -1; 00308 this->current_value_ = tc->member_label (i 00309 ACE_ENV_ARG_PARAMETER); 00310 ACE_TRY_CHECK; 00311 00312 break; 00313 } 00314 // The TAO_ETCL_Union_Value that was put on the queue 00315 // shouldn't have any other type. 00316 default: 00317 return -1; 00318 } 00319 00320 TAO_ETCL_Constraint *nested = union_pos->component (); 00321 00322 // If there's no nested component, then we just want the 00323 // union member value on the queue. Otherwise, we want 00324 // the member value in current_value_ while we visit 00325 // the nested component. 00326 if (nested == 0) 00327 { 00328 TAO_ETCL_Literal_Constraint lit (this->current_value_.ptr ()); 00329 this->queue_.enqueue_head (lit); 00330 return 0; 00331 } 00332 else 00333 return nested->accept (this); 00334 } 00335 else 00336 return -1; 00337 } 00338 ACE_CATCHANY 00339 { 00340 return -1; 00341 } 00342 ACE_ENDTRY; 00343 } |
|
Definition at line 169 of file Notify_Constraint_Visitors.cpp. References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().
00172 { 00173 switch (union_value->sign ()) 00174 { 00175 case 0: 00176 this->queue_.enqueue_head (*union_value->string ()); 00177 break; 00178 case -1: 00179 this->queue_.enqueue_head (-(*union_value->integer ())); 00180 break; 00181 case 1: 00182 this->queue_.enqueue_head (*union_value->integer ()); 00183 break; 00184 default: 00185 return -1; 00186 } 00187 00188 return 0; 00189 } |
|
Holder for a string name in the event fields fixed_header, variable_header, or filterable_data. Definition at line 162 of file Notify_Constraint_Visitors.h. |
|
Holder for a value found in the event fields filterable_data, variable_header or remainder_of_body. Definition at line 158 of file Notify_Constraint_Visitors.h. Referenced by visit_component(), visit_component_array(), visit_component_assoc(), visit_component_pos(), visit_default(), visit_special(), and visit_union_pos(). |
|
Storage for string names under the structured event's 'fixed_header' field. Definition at line 146 of file Notify_Constraint_Visitors.h. Referenced by bind_structured_event(), and visit_exist(). |
|
Definition at line 148 of file Notify_Constraint_Visitors.h. Referenced by bind_structured_event(), and visit_exist(). |
|
Used to lookup names and values in the event's 'filterable_data' field.
Definition at line 134 of file Notify_Constraint_Visitors.h. Referenced by bind_structured_event(), visit_component_assoc(), visit_exist(), and visit_identifier(). |
|
Size of filterable_data_ hash map. TODO: define inline once VC6 support is deprecated. Definition at line 1462 of file Notify_Constraint_Visitors.cpp. |
|
Storage for the type of implicit id the component has (if any).
Definition at line 114 of file Notify_Constraint_Visitors.h. Referenced by visit_component(), visit_component_assoc(), and visit_exist(). |
|
Lookup table for the implicit ids, to avoid string comparisons in derived visitors. Definition at line 126 of file Notify_Constraint_Visitors.h. Referenced by TAO_Notify_Constraint_Visitor(), and visit_component(). |
|
Size of implicit_ids_ hash map.
Definition at line 1461 of file Notify_Constraint_Visitors.cpp. |
|
The result of a non_boolean operation.
Definition at line 154 of file Notify_Constraint_Visitors.h. |
|
Storage for the structured_event's 'remainder_of_body' field.
Definition at line 151 of file Notify_Constraint_Visitors.h. Referenced by bind_structured_event(). |
|
Definition at line 147 of file Notify_Constraint_Visitors.h. Referenced by bind_structured_event(), and visit_exist(). |
|
Used to lookup names and values in the event's 'variable_header' field.
Definition at line 142 of file Notify_Constraint_Visitors.h. Referenced by bind_structured_event(), visit_component_assoc(), and visit_exist(). |
|
Size of variable_header_ hash map. TODO: define inline once VC6 support is deprecated. Definition at line 1463 of file Notify_Constraint_Visitors.cpp. |